Changeset 1801


Ignore:
Timestamp:
Nov 27, 2005, 3:29:43 AM (15 years ago)
Author:
orlov
Message:
  • SplitIterator? is simplified.
  • toString() is done by toStringBuffer().
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/java/org/refal/plus/Expr.java

    r1797 r1801  
    289289
    290290    public java.lang.String toString() {
    291         java.lang.String str = "";
    292         for (int i = index; i < length; i++) {
     291        return new java.lang.String(toStringBuffer());
     292    }
     293
     294    public StringBuffer toStringBuffer () {
     295        StringBuffer str = new StringBuffer(length);
     296        for (int i = index, last = index + length; i < last; i++) {
    293297            if (expr[i] instanceof Expr)
    294                 str += "(" + expr[i].toString() + ")";
     298                str.append('(')
     299                   .append(((Expr)expr[i]).toStringBuffer())
     300                   .append(')');
    295301            else
    296                 str += expr[i].toString();
     302                str.append(expr[i].toString());
    297303        }
    298304        return str;
    299305    }
    300306
    301     public SplitIterator SplitIterator () {
    302         return new SplitIterator ();
    303     }
    304    
    305     public class SplitIterator {
     307    public SplitIterator leftSplit (int l) {
     308        // FIXME: insert here assertion length >= l
     309        return new SplitIterator(this, l);
     310    }
     311
     312    public SplitIterator rightSplit (int r) {
     313        // FIXME: insert here assertion length >= r
     314        return new SplitIterator(this, length - r);
     315    }
     316
     317    public class SplitIterator
     318    {
     319        private Expr left;
     320        private Expr right;
     321
     322        private SplitIterator (Expr e, int l) {
     323            left  = new Expr(e, 0, l);
     324            right = new Expr(e, l, e.length - l);
     325        }
     326
     327        public SplitIterator next () {
     328            left.length++;
     329            right.index++;
     330            right.length--;
     331            return this;
     332        }
     333
     334        public SplitIterator prev () {
     335            left.length--;
     336            right.index--;
     337            right.length++;
     338            return this;
     339        }
     340
     341        public boolean isValid () {
     342            return right.length >= 0 && left.length >= 0;
     343        }
     344
     345        public Expr getLeft () {
     346            return left;
     347        }
    306348       
    307         private Expr leftSplit;
    308 
    309         private Expr rightSplit;
    310 
    311         private boolean iterLeft;
    312 
    313         private boolean iterRight;
    314 
    315         public SplitIterator ()
    316         {
    317             iterLeft = true;
    318             iterRight = true;
    319         }
    320        
    321         public boolean next() {
    322             if (rightSplit.length == 0) {
    323                 iterRight = false;
    324                 return true;
    325             }
    326             rightSplit.index++;
    327             rightSplit.length--;
    328             leftSplit.length++;
    329             return true;
    330         }
    331 
    332 
    333         public boolean prev() {
    334             if (leftSplit == null) {
    335                 iterLeft = false;
    336                 return false;
    337             }
    338             if (leftSplit.getLen() == 0) {
    339                 iterLeft = false;
    340                 return true;
    341             }
    342             leftSplit.length--;
    343             rightSplit.index = leftSplit.index + leftSplit.length;
    344             rightSplit.length++;
    345             return true;
    346         }
    347      
    348 
    349         public boolean hasNext() {
    350             if (!iterRight)
    351                 return false;
    352             if (!iterLeft)
    353                 return false;
    354             return true;
    355         }
    356 
    357         public void lsplit(Expr _e, int index, Expr le, Expr re) {
    358             le.expr = _e.expr;
    359             le.index = _e.index;
    360             le.length = index;
    361 
    362             re.expr = _e.expr;
    363             re.index = index + _e.index;
    364             re.length = _e.length - index;
    365 
    366             rightSplit = re;
    367             leftSplit = le;
    368             iterRight = true;
    369              
    370         }
    371 
    372         public void rsplit(Expr _e, int index, Expr le, Expr re) {
    373             le.expr = _e.expr;
    374             le.index = index + _e.index;
    375             le.length = _e.length - index;
    376 
    377             re.expr = _e.expr;
    378             re.index = _e.index;
    379             re.length = index;
    380 
    381             rightSplit = re;
    382             leftSplit = le;
    383             iterRight = true;
    384         }
    385        
     349        public Expr getRight () {
     350            return right;
     351        }
    386352    }
    387353}
Note: See TracChangeset for help on using the changeset viewer.