You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@apache.org on 2003/07/04 10:43:40 UTC

cvs commit: ant/src/main/org/apache/tools/ant/types/selectors SelectorUtils.java

bodewig     2003/07/04 01:43:39

  Modified:    src/main/org/apache/tools/ant/types/selectors
                        SelectorUtils.java
  Log:
  Speed up Path tokeinzation.
  PR: 21296
  
  Revision  Changes    Path
  1.10      +58 -20    ant/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java
  
  Index: SelectorUtils.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/SelectorUtils.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- SelectorUtils.java	17 Feb 2003 14:35:44 -0000	1.9
  +++ SelectorUtils.java	4 Jul 2003 08:43:39 -0000	1.10
  @@ -139,21 +139,21 @@
               return false;
           }
   
  -        Vector patDirs = tokenizePath (pattern);
  -        Vector strDirs = tokenizePath (str);
  +        String[] patDirs = tokenizePathAsArray(pattern);
  +        String[] strDirs = tokenizePathAsArray(str);
   
           int patIdxStart = 0;
  -        int patIdxEnd   = patDirs.size()-1;
  +        int patIdxEnd   = patDirs.length-1;
           int strIdxStart = 0;
  -        int strIdxEnd   = strDirs.size()-1;
  +        int strIdxEnd   = strDirs.length-1;
   
           // up to first '**'
           while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
  -            String patDir = (String)patDirs.elementAt(patIdxStart);
  +            String patDir = patDirs[patIdxStart];
               if (patDir.equals("**")) {
                   break;
               }
  -            if (!match(patDir,(String)strDirs.elementAt(strIdxStart),
  +            if (!match(patDir,strDirs[strIdxStart],
                       isCaseSensitive)) {
                   return false;
               }
  @@ -213,21 +213,21 @@
               return false;
           }
   
  -        Vector patDirs = tokenizePath (pattern);
  -        Vector strDirs = tokenizePath (str);
  +        String[] patDirs = tokenizePathAsArray(pattern);
  +        String[] strDirs = tokenizePathAsArray(str);
   
           int patIdxStart = 0;
  -        int patIdxEnd   = patDirs.size()-1;
  +        int patIdxEnd   = patDirs.length-1;
           int strIdxStart = 0;
  -        int strIdxEnd   = strDirs.size()-1;
  +        int strIdxEnd   = strDirs.length-1;
   
           // up to first '**'
           while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
  -            String patDir = (String)patDirs.elementAt(patIdxStart);
  +            String patDir = patDirs[patIdxStart];
               if (patDir.equals("**")) {
                   break;
               }
  -            if (!match(patDir,(String)strDirs.elementAt(strIdxStart),
  +            if (!match(patDir,strDirs[strIdxStart],
                       isCaseSensitive)) {
                   patDirs = null; strDirs = null;
                   return false;
  @@ -238,7 +238,7 @@
           if (strIdxStart > strIdxEnd) {
               // String is exhausted
               for (int i = patIdxStart; i <= patIdxEnd; i++) {
  -                if (!patDirs.elementAt(i).equals("**")) {
  +                if (!patDirs[i].equals("**")) {
                       patDirs = null; strDirs = null;
                       return false;
                   }
  @@ -254,11 +254,11 @@
   
           // up to last '**'
           while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {
  -            String patDir = (String)patDirs.elementAt(patIdxEnd);
  +            String patDir = patDirs[patIdxEnd];
               if (patDir.equals("**")) {
                   break;
               }
  -            if (!match(patDir,(String)strDirs.elementAt(strIdxEnd),
  +            if (!match(patDir,strDirs[strIdxEnd],
                       isCaseSensitive)) {
                   patDirs = null; strDirs = null;
                   return false;
  @@ -269,7 +269,7 @@
           if (strIdxStart > strIdxEnd) {
               // String is exhausted
               for (int i = patIdxStart; i <= patIdxEnd; i++) {
  -                if (!patDirs.elementAt(i).equals("**")) {
  +                if (!patDirs[i].equals("**")) {
                       patDirs = null; strDirs = null;
                       return false;
                   }
  @@ -280,7 +280,7 @@
           while (patIdxStart != patIdxEnd && strIdxStart <= strIdxEnd) {
               int patIdxTmp = -1;
               for (int i = patIdxStart+1; i <= patIdxEnd; i++) {
  -                if (patDirs.elementAt(i).equals("**")) {
  +                if (patDirs[i].equals("**")) {
                       patIdxTmp = i;
                       break;
                   }
  @@ -298,8 +298,8 @@
   strLoop:
               for (int i = 0; i <= strLength - patLength; i++) {
                   for (int j = 0; j < patLength; j++) {
  -                    String subPat = (String)patDirs.elementAt(patIdxStart+j+1);
  -                    String subStr = (String)strDirs.elementAt(strIdxStart+i+j);
  +                    String subPat = patDirs[patIdxStart+j+1];
  +                    String subStr = strDirs[strIdxStart+i+j];
                       if (!match(subPat,subStr, isCaseSensitive)) {
                           continue strLoop;
                       }
  @@ -319,7 +319,7 @@
           }
   
           for (int i = patIdxStart; i <= patIdxEnd; i++) {
  -            if (!patDirs.elementAt(i).equals("**")) {
  +            if (!patDirs[i].equals("**")) {
                   patDirs = null; strDirs = null;
                   return false;
               }
  @@ -527,6 +527,44 @@
               ret.addElement(st.nextToken());
           }
           return ret;
  +    }
  +    
  +    /**
  +     * Same as {@link #tokenizePath tokenizePath} but hopefully faster.
  +     */
  +    private static String[] tokenizePathAsArray(String path) {
  +        char sep = File.separatorChar;
  +        int start = 0;
  +        int len = path.length();
  +        int count = 0;
  +        for (int pos = 0; pos < len; pos++) {
  +            if (path.charAt(pos) == sep) {
  +                if (pos != start) {
  +                    count++;
  +                }
  +                start = pos + 1;
  +            }
  +        }
  +        if (len != start) {
  +            count++;
  +        }
  +        String[] l = new String[count];
  +        count = 0;
  +        start = 0;
  +        for (int pos = 0; pos < len; pos++) {
  +            if (path.charAt(pos) == sep) {
  +                if (pos != start) {
  +                    String tok = path.substring(start, pos);
  +                    l[count++] = tok;
  +                }
  +                start = pos + 1;
  +            }
  +        }
  +        if (len != start) {
  +            String tok = path.substring(start);
  +            l[count/*++*/] = tok;
  +        }
  +        return l;
       }
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org