KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > rbtreesizesequence > RBTreeSimple


1 /**
2 * Copyright (c) 2003 Daffodil Software Ltd., India all rights reserved.
3 * This library is free software; you can redistribute it and/or modify
4 * it under the terms of version 2.1 of the GNU Lesser General Public License as
5 * published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU Lesser General Public License for more details.
11 *
12 * You should have received a copy of the GNU Lesser General Public License
13 * along with this library; if not, write to the Free Software
14 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15 */

16
17
18
19 package com.daffodilwoods.rbtreesizesequence;
20
21 import com.daffodilwoods.rbtreesizesequence.utils.rbtree.RBTreeNode;
22 import com.daffodilwoods.rbtreesizesequence.utils.sizesequenceutility.RBTreeSizeSequenceUtility;
23
24 import java.util.Comparator JavaDoc;
25
26 /**
27  * Title:
28  * Description:
29  * Copyright: Copyright (c) 2001
30  * Company:
31  * @author
32  * @version 1.0
33  */

34
35 import com.daffodilwoods.rbtreesizesequence.utils.rbtree.RootWrapper;
36 import com.daffodilwoods.rbtreesizesequence.utils.rbtree.SegmentedRedBlackTree;
37
38 public class RBTreeSimple extends SegmentedRedBlackTree implements SizeSequence {
39
40     protected RBTreeSizeSequenceUser treeSizeSequenceUser;
41     protected int maxOffst;
42     protected boolean addAllowed = true;
43
44     public RBTreeSimple(RBTreeSizeSequenceUser user, int maxOffst) {
45         this.treeSizeSequenceUser = user;
46         this.comparator = user.getComparator();
47         this.maxOffst = maxOffst;
48     }
49
50
51     public void setRBTreeSizeSequenceUser(SizeSequenceUser sizeSequenceUser){
52         this.treeSizeSequenceUser = (RBTreeSizeSequenceUser)sizeSequenceUser;
53     }
54
55     public void add(Object JavaDoc locationIdFrom, int atDistance, Object JavaDoc locationId) {
56             if(!addAllowed){
57                 return;
58             }
59             if(locationId == null)
60                 throw new IllegalArgumentException JavaDoc("<<<<<<< locationId to be added shouldn't be null >>>>>>>>");
61             if(locationIdFrom == null){
62                 RootWrapper rootWrapper = new RootWrapper();
63                 put(rootWrapper, locationId);
64                 addRootWrapperToList(rootWrapper);
65                 checkForJoinTrees(rootWrapper, locationId);
66                 return;
67             }
68             if(compare(locationIdFrom, locationId) == 0){
69                 if(atDistance == 0) return;
70                 throw new IllegalArgumentException JavaDoc("Can't add " + locationId + " at distance " + atDistance + " from " + locationIdFrom);
71             }
72
73
74         /* Find the rootWrapper for which subLocationIdFrom is present
75          if not such rootWrapper is there then make a new rootWrapper for that
76          Call the put(...) for that rootWrapper with the same parameters
77         */

78
79             RootWrapper rootWrapper = getRootWrapper(locationIdFrom);
80             if(rootWrapper == null){
81                 rootWrapper = new RootWrapper();
82                 put(rootWrapper, locationIdFrom);
83                 put(rootWrapper, locationId);
84                 addRootWrapperToList(rootWrapper);
85
86     /* when new tset is formed which is not the only tset in the map,
87         we have to check the possibility of joining the series...*/

88
89                 checkForJoinTrees(rootWrapper, locationId);
90                 return;
91             }
92
93             put(rootWrapper, locationId);
94             checkForJoinTrees(rootWrapper, locationId);
95
96     }
97
98     protected boolean isAtEnd(RootWrapper rootWrapper, Object JavaDoc locationId){
99             boolean result;
100             if(compare(lastKey(rootWrapper), locationId) == 0)
101                 result = true;
102             else
103                 result = false;
104             return result;
105     }
106
107     protected boolean isAtStart(RootWrapper rootWrapper, Object JavaDoc locationId){
108             boolean result;
109             if(compare(firstKey(rootWrapper), locationId) == 0)
110                 result = true;
111             else
112                 result = false;
113             return result;
114     }
115
116
117     private boolean checkForJoinTrees(RootWrapper rootWrapper, Object JavaDoc locationId){
118             addAllowed = false;
119             if(isAtEnd(rootWrapper, locationId)){
120                 RootWrapper rootWrapperNext = getNextRootWrapper(rootWrapper);
121                 if(rootWrapperNext == null){
122                     addAllowed = true;
123                     return false;
124                 }
125                 if(treeSizeSequenceUser.canJoin(locationId, firstKey(rootWrapperNext))){
126                     boolean bln2 = remove(rootWrapperNext, firstKey(rootWrapperNext));
127                     if(!bln2){
128                         addAllowed = true;
129                         return false;
130                     }
131                     boolean bln1 = remove(rootWrapper, locationId);
132                     if(!bln1){
133                         addAllowed = true;
134                         return false;
135                     }
136
137                     RootWrapper joinedTree = joinTrees(rootWrapper, locationId, rootWrapperNext);
138
139                     removeFromRootWrapperList(rootWrapper);
140                     removeFromRootWrapperList(rootWrapperNext);
141
142                     addRootWrapperToList(joinedTree);
143
144                     addAllowed = true;
145                     return true;
146                 }
147                 addAllowed = true;
148                 return false;
149             }
150             else if(isAtStart(rootWrapper, locationId)){
151                 RootWrapper rootWrapperPrevious = getPreviousRootWrapper(rootWrapper);
152                 if(rootWrapperPrevious == null){
153                     addAllowed = true;
154                     return false;
155                 }
156
157                 if(treeSizeSequenceUser.canJoin(locationId, lastKey(rootWrapperPrevious))){
158                     boolean bln2 = remove(rootWrapperPrevious, lastKey(rootWrapperPrevious));
159                     if(!bln2){
160                         addAllowed = true;
161                         return false;
162                     }
163                     boolean bln1 = remove(rootWrapper, locationId);
164                     if(!bln1){
165                         addAllowed = true;
166                         return false;
167                     }
168
169                     RootWrapper joinedTree = joinTrees(rootWrapper, locationId, rootWrapperPrevious);
170
171                     removeFromRootWrapperList(rootWrapper);
172                     removeFromRootWrapperList(rootWrapperPrevious);
173                     addRootWrapperToList(joinedTree);
174                     addAllowed = true;
175                     return true;
176                 }
177                 addAllowed = true;
178                 return false;
179             }
180             addAllowed = true;
181             return false;
182     }
183
184     public void invalidate(Object JavaDoc key){
185             addAllowed = false;
186             try{
187                 RootWrapper rootWrapper = getRootWrapper(key);
188                 if(rootWrapper == null){
189                     return;
190                 }
191                 removeFromRootWrapperList(rootWrapper);
192                 RootWrapper rootWrapperLeft = new RootWrapper();
193                 RootWrapper rootWrapperRight = new RootWrapper();
194                 breakTree(rootWrapper, key, rootWrapperLeft, rootWrapperRight);
195
196                 if(rootWrapperLeft.getRoot() != null){
197                     addRootWrapperToList(rootWrapperLeft);
198                 }
199                 if(rootWrapperRight.getRoot() != null){
200                     addRootWrapperToList(rootWrapperRight);
201                 }
202             }finally{
203                 addAllowed = true;
204             }
205     }
206
207     public synchronized void update(Object JavaDoc oldKey, Object JavaDoc newKey){
208         RootWrapper rootWrapper = getRootWrapper(oldKey);
209
210         RBTreeNode node = (RBTreeNode)getNode(rootWrapper, oldKey);
211
212         RBTreeNode previousNode = getPrecedingNode(rootWrapper, oldKey);
213
214         RBTreeNode nextNode = getNextNode(rootWrapper, oldKey);
215
216
217         if(previousNode != null && nextNode != null && compare(previousNode.getKey(), newKey) < 0 && compare(nextNode.getKey(), newKey) > 0){
218                     node.setKey(newKey);
219                     return;
220
221         }
222         delete(oldKey);
223         insert(newKey);
224
225     }
226
227     public synchronized void insert(Object JavaDoc locationId){
228     try{
229         RootWrapper rootWrapper = getRootWrapper(locationId);
230
231         if(rootWrapper == null){
232             add(null, 0, locationId);
233             return;
234         }
235
236         RBTreeNode previous = (RBTreeNode)getFloorNode(rootWrapper, locationId);
237
238         RBTreeNode next = (RBTreeNode)getCeilNode(rootWrapper, locationId);
239         if(previous != null && next != null){
240             add(previous.key, 1, locationId);
241             return;
242         }
243
244         if(previous != null){
245             add(previous.key, 1, locationId);
246         }
247         else if(next != null){
248             add(next.key, -1, locationId);
249         }
250         else{
251             add(null, 0, locationId);
252         }
253     }finally{
254     }
255     }
256
257     public synchronized void delete(Object JavaDoc locationId){
258         RootWrapper rootWrapper = getRootWrapper(locationId);
259
260         remove(rootWrapper, locationId);
261
262     }
263
264     public Object JavaDoc getFloorKey(Object JavaDoc locationId){
265         RootWrapper rootWrapper = getFloorRootWrapper(locationId);
266         if(rootWrapper != null)
267             return getFloorNode(rootWrapper, locationId).getKey();
268         return null;
269     }
270
271     public Object JavaDoc getPreviousKey(Object JavaDoc locationId){
272         RootWrapper rootWrapper = getRootWrapper(locationId);
273         if(rootWrapper == null){
274             rootWrapper = getFloorRootWrapper(locationId);
275             return rootWrapper != null ? lastKey(rootWrapper) : null;
276         }
277         else {
278             if(firstKey(rootWrapper) == locationId){
279                 RootWrapper previousRootWrapper = getPreviousRootWrapper(rootWrapper);
280                 if(previousRootWrapper != null)
281                     return lastKey(previousRootWrapper);
282                 return null;
283             }
284             RBTreeNode previousNode = getPrecedingNode(rootWrapper, locationId);
285             return previousNode != null ? previousNode.getKey() : null;
286         }
287     }
288
289     public Object JavaDoc getCeilKey(Object JavaDoc locationId){
290         RootWrapper rootWrapper = getCeilRootWrapper(locationId);
291         if(rootWrapper != null)
292             return getCeilNode(rootWrapper, locationId).getKey();
293         return null;
294     }
295
296     public Object JavaDoc getNextKey(Object JavaDoc locationId){
297         RootWrapper rootWrapper = getRootWrapper(locationId);
298         if(rootWrapper == null){
299             rootWrapper = getCeilRootWrapper(locationId);
300             return rootWrapper != null ? firstKey(rootWrapper) : null;
301         }
302         else {
303             if(lastKey(rootWrapper) == locationId){
304                 RootWrapper nextRootWrapper = getNextRootWrapper(rootWrapper);
305                 if(nextRootWrapper != null)
306                     return firstKey(nextRootWrapper);
307                 return null;
308             }
309             RBTreeNode nextNode = getNextNode(rootWrapper, locationId);
310             return nextNode != null ? nextNode.getKey() : null;
311         }
312     }
313
314
315     public Object JavaDoc getTreeTopKey(){
316         RootWrapper rootWrapper = getFirstRootWrapper();
317         if(rootWrapper == null)
318             return null;
319         return firstNode(rootWrapper);
320     }
321
322     public Object JavaDoc getTreeBottomKey(){
323         RootWrapper rootWrapper = getLastRootWrapper();
324         if(rootWrapper == null)
325             return null;
326         return lastNode(rootWrapper);
327     }
328
329     public Object JavaDoc getTopKey(){
330         RBTreeNode topKey = (RBTreeNode)getTreeTopKey();
331         int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(null, topKey == null ? null : topKey.getKey(), 1));
332         if(distance == 0)
333             return topKey;
334         return getTreeTopKey();
335     }
336
337     public Object JavaDoc getBottomKey(){
338         RBTreeNode bottomKey = (RBTreeNode)getTreeBottomKey();
339         int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(null, bottomKey == null ? null : bottomKey.getKey(), -1));
340         if(distance == 0)
341             return bottomKey;
342         return getTreeBottomKey();
343     }
344
345     public Object JavaDoc getObjectAtKey(Object JavaDoc rbTreeNode){
346         return ((RBTreeNode)rbTreeNode).getKey();
347     }
348
349     public Object JavaDoc locateNearestKey(Object JavaDoc key){
350         RootWrapper rootWrapper = getCeilRootWrapper(key);
351         if(rootWrapper != null)
352             return getCeilNode(rootWrapper, key);
353         rootWrapper = getFloorRootWrapper(key);
354         if(rootWrapper == null)
355             return null;
356         return getFloorNode(rootWrapper, key);
357     }
358
359
360
361     private Object JavaDoc getNextOfDeleted(RBTreeNode node){
362         Object JavaDoc key = node.getKey();
363         RootWrapper rootWrapper = getRootWrapper(key);
364         RootWrapper rootWrapperPrev = null;
365         if(rootWrapper == null){
366             rootWrapperPrev = getPreviousRootWrapperOfKey(key);
367         }
368         else{
369             if(isOnlyNode(rootWrapper)){
370                 rootWrapperPrev = rootWrapper;
371             }
372             else{
373                 RBTreeNode nextNode = getNextNode(getRootWrapper(key), key);
374                 if(nextNode != null)
375                   return nextNode;
376                 rootWrapperPrev = rootWrapper;
377             }
378         }
379         RootWrapper rootWrapperNext = getNextRootWrapperOfKey(key);
380         RBTreeNode nodeFrom = null;
381         RBTreeNode nodeTo = null;
382         if(rootWrapperPrev != null)
383             nodeFrom = lastNode(rootWrapperPrev);
384         if(rootWrapperNext != null)
385             nodeTo = firstNode(rootWrapperNext);
386         Object JavaDoc keyFrom = null;
387         Object JavaDoc keyTo = null;
388         try{
389           keyFrom = nodeFrom.getKey();
390         }catch(NullPointerException JavaDoc e){} // NullPointerException is caught to avoid the check for != null
391
try{
392           keyTo = nodeTo.getKey();
393         }catch(NullPointerException JavaDoc e){} // NullPointerException is caught to avoid the check for != null
394
int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(keyFrom, keyTo, Integer.MAX_VALUE));
395         return (distance != 0 ? getNextNode(getRootWrapper(key), key) : nodeTo);
396     }
397
398
399     public Object JavaDoc getNext(Object JavaDoc rbTreeNode){
400         RBTreeNode node = (RBTreeNode)rbTreeNode;
401
402         if(mightBeDeleted(node)){
403             return getNextOfDeleted(node);
404         }
405
406
407         RBTreeNode right = (RBTreeNode)node.getRight();
408         if (right != null){
409             while (right.left != null)
410                 right = (RBTreeNode)right.left;
411             return right;
412         }
413         else{
414             RBTreeNode parent = (RBTreeNode)node.parent;
415             RBTreeNode ch = node;
416             while (parent != null && ch == parent.right) {
417                 ch = parent;
418                 parent = (RBTreeNode)parent.parent;
419             }
420             if(parent == null){
421                 RootWrapper rootWrapperTemp = getRootWrapper(node.key);
422                 if(rootWrapperTemp == null){
423          ;
424                     Thread.dumpStack();
425                     show();
426                 }
427                 RootWrapper rootWrapper = getNextRootWrapper(rootWrapperTemp);
428                 Object JavaDoc locationIdTo = null;
429                 if(rootWrapper != null)
430                     locationIdTo = firstKey(rootWrapper);
431                 int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(node.key, locationIdTo, 1));
432                 if(distance != 0)
433                     parent = (RBTreeNode)getNext(rbTreeNode);
434             }
435             return parent;
436         }
437     }
438
439
440
441     private Object JavaDoc getPreviousOfDeleted(RBTreeNode node){
442         Object JavaDoc key = node.getKey();
443         RootWrapper rootWrapper = getRootWrapper(key);
444         RootWrapper rootWrapperNext = null;
445         if(rootWrapper == null){
446             rootWrapperNext = getNextRootWrapperOfKey(key);
447         }
448         else{
449             if(isOnlyNode(rootWrapper)){
450                 rootWrapperNext = rootWrapper;
451             }
452             else{
453                 RBTreeNode precedingNode = getPrecedingNode(getRootWrapper(key), key);
454                 if(precedingNode != null)
455                   return precedingNode;
456                 rootWrapperNext = rootWrapper;
457             }
458         }
459         RootWrapper rootWrapperPrev = getPreviousRootWrapperOfKey(key);
460         RBTreeNode nodeFrom = null;
461         RBTreeNode nodeTo = null;
462         if(rootWrapperNext != null)
463             nodeFrom = firstNode(rootWrapperNext);
464         if(rootWrapperPrev != null)
465             nodeTo = lastNode(rootWrapperPrev);
466         Object JavaDoc keyFrom = null;
467         Object JavaDoc keyTo = null;
468         try{
469           keyFrom = nodeFrom.getKey();
470         }catch(NullPointerException JavaDoc e){} // NullPointerException is caught to avoid the check for != null
471
try{
472           keyTo = nodeTo.getKey();
473         }catch(NullPointerException JavaDoc e){} // NullPointerException is caught to avoid the check for != null
474
int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(keyFrom, keyTo, Integer.MIN_VALUE));
475         return (distance != 0 ? getPrecedingNode(getRootWrapper(key), key) : nodeTo);
476     }
477
478
479
480     public Object JavaDoc getPrevious(Object JavaDoc rbTreeNode){
481         RBTreeNode node = (RBTreeNode)rbTreeNode;
482
483         if(mightBeDeleted(node)){
484             return getPreviousOfDeleted(node);
485         }
486
487         RBTreeNode left = (RBTreeNode)node.getLeft();
488         if (left != null){
489             while (left.right != null)
490                 left = (RBTreeNode)left.right;
491             return left;
492         }
493         else{
494             RBTreeNode parent = (RBTreeNode)node.parent;
495             RBTreeNode ch = node;
496             while (parent != null && ch == parent.left) {
497                 ch = parent;
498                 parent = (RBTreeNode)parent.parent;
499             }
500             if(parent == null){
501                 RootWrapper rootWrapper = getPreviousRootWrapper(getRootWrapper(node.key));
502                 Object JavaDoc locationIdTo = null;
503                 if(rootWrapper != null)
504                     locationIdTo = lastKey(rootWrapper);
505                 int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(node.key, locationIdTo, -1));
506                 if(distance != 0)
507                     parent = (RBTreeNode)getPrevious(rbTreeNode);
508             }
509             return parent;
510         }
511     }
512
513
514     private Object JavaDoc getNextOfDeletedWithoutTrace(RBTreeNode node){
515         Object JavaDoc key = node.getKey();
516         RootWrapper rootWrapper = getRootWrapper(key);
517         if(rootWrapper == null || isOnlyNode(rootWrapper)){
518             RootWrapper rootWrapperNext = getNextRootWrapperOfKey(key);
519             return (rootWrapperNext == null ? null : firstNode(rootWrapperNext));
520         }
521         else{
522             return getNextNode(rootWrapper, key);
523         }
524     }
525
526
527
528     public Object JavaDoc getTreeNext(Object JavaDoc rbTreeNode){
529         RBTreeNode node = (RBTreeNode)rbTreeNode;
530         if(mightBeDeleted(node)){
531             return getNextOfDeletedWithoutTrace(node);
532         }
533         RBTreeNode right = (RBTreeNode)node.getRight();
534         if (right != null){
535             while (right.left != null)
536                 right = (RBTreeNode)right.left;
537             return right;
538         }
539         else{
540             RBTreeNode parent = (RBTreeNode)node.parent;
541             RBTreeNode ch = node;
542             while (parent != null && ch == parent.right) {
543                 ch = parent;
544                 parent = (RBTreeNode)parent.parent;
545             }
546             if(parent == null){
547                 RootWrapper rootWrapper = getNextRootWrapper(getRootWrapper(node.key));
548                 if(rootWrapper != null)
549                     parent = (RBTreeNode)firstNode(rootWrapper);
550             }
551             return parent;
552         }
553     }
554
555
556     private Object JavaDoc getPreviousOfDeletedWithoutTrace(RBTreeNode node){
557         Object JavaDoc key = node.getKey();
558         RootWrapper rootWrapper = getRootWrapper(key);
559         if(rootWrapper == null || isOnlyNode(rootWrapper)){
560             RootWrapper rootWrapperPrev = getPreviousRootWrapperOfKey(key);
561             return (rootWrapperPrev == null ? null : lastNode(rootWrapperPrev));
562         }
563         else{
564             return getPrecedingNode(rootWrapper, key);
565         }
566     }
567
568     public Object JavaDoc getTreePrevious(Object JavaDoc rbTreeNode){
569         RBTreeNode node = (RBTreeNode)rbTreeNode;
570         if(mightBeDeleted(node)){
571             return getPreviousOfDeletedWithoutTrace(node);
572         }
573         RBTreeNode left = (RBTreeNode)node.getLeft();
574         if (left != null){
575             while (left.right != null)
576                 left = (RBTreeNode)left.right;
577             return left;
578         }
579         else{
580             RBTreeNode parent = (RBTreeNode)node.parent;
581             RBTreeNode ch = node;
582             while (parent != null && ch == parent.left) {
583                 ch = parent;
584                 parent = (RBTreeNode)parent.parent;
585             }
586             if(parent == null){
587                 RootWrapper rootWrapper = getPreviousRootWrapper(getRootWrapper(node.key));
588                 if(rootWrapper != null)
589                     parent = (RBTreeNode)lastNode(rootWrapper);
590             }
591             return parent;
592         }
593     }
594
595
596     /**
597      * @param key
598      * @return ceil Node
599      */

600     public Object JavaDoc getCeil(Object JavaDoc key){
601         RootWrapper rootWrapper = getRootWrapper(key);
602         if(rootWrapper != null){
603             Object JavaDoc toReturn = getCeilNode(rootWrapper, key);
604             return toReturn;
605         }
606         RootWrapper previousRootWrapper = getFloorRootWrapper(key);
607         RootWrapper nextRootWrapper = getCeilRootWrapper(key);
608         int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(previousRootWrapper == null ? null : lastKey(previousRootWrapper), nextRootWrapper == null ? null : firstKey(nextRootWrapper), 1));
609         if(distance == 0){
610           if(nextRootWrapper != null)
611             return firstNode(nextRootWrapper);
612           return null;
613         }
614         Object JavaDoc toReturn = getCeil(key);
615         return toReturn;
616     }
617
618     /**
619      * @param key
620      * @return floor Node
621      */

622     public Object JavaDoc getFloor(Object JavaDoc key){
623         RootWrapper rootWrapper = getRootWrapper(key);
624         if(rootWrapper != null){
625             Object JavaDoc toReturn = getFloorNode(rootWrapper, key);
626             return toReturn;
627         }
628         RootWrapper previousRootWrapper = getFloorRootWrapper(key);
629         RootWrapper nextRootWrapper = getCeilRootWrapper(key);
630
631         /**
632          * Bug # 5408
633          *
634         int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(previousRootWrapper == null ? null : lastKey(previousRootWrapper), nextRootWrapper == null ? null : firstKey(nextRootWrapper), -1));
635          */

636
637         int distance = RBTreeSizeSequenceUtility.getFirstInt(treeSizeSequenceUser.traceDistance(nextRootWrapper == null ? null : firstKey(nextRootWrapper), previousRootWrapper == null ? null : lastKey(previousRootWrapper), -1));
638         if(distance == 0){
639           if(previousRootWrapper != null)
640             return lastNode(previousRootWrapper);
641           return null;
642         }
643
644         Object JavaDoc toReturn = getFloor(key);
645         return toReturn;
646     }
647
648     public int getSize(){
649           int toReturn = getNumberOfEntries();
650         return toReturn;
651     }
652
653     public void breakTreeAt(Object JavaDoc obj){
654             addAllowed = false;
655             try{
656                 RootWrapper rootWrapper = getRootWrapper(obj);
657                 if(rootWrapper == null){
658                     return;
659                 }
660                 removeFromRootWrapperList(rootWrapper);
661                 RootWrapper rootWrapperLeft = new RootWrapper();
662                 RootWrapper rootWrapperRight = new RootWrapper();
663                 breakTree(rootWrapper, obj, rootWrapperLeft, rootWrapperRight);
664
665                 if(rootWrapperLeft.getRoot() != null){
666                     addRootWrapperToList(rootWrapperLeft);
667                 }
668                 if(rootWrapperRight.getRoot() != null){
669                     addRootWrapperToList(rootWrapperRight);
670                 }
671             }finally{
672                 addAllowed = true;
673             }
674     }
675
676     public void markInvalid(Object JavaDoc locationIdFrom, Object JavaDoc locationIdTo){
677             int cmp = compare(locationIdFrom, locationIdTo);
678             if(cmp > 0){
679                 markInvalid(locationIdTo, locationIdFrom);
680                 return;
681             }
682             breakTreeAt(locationIdFrom);
683             breakTreeAt(locationIdTo);
684             removeRootWrappersWithIn(locationIdFrom, locationIdTo);
685     }
686     public void flushData(Object JavaDoc key, boolean direction){
687             Object JavaDoc otherKey;
688             if(direction) {
689                 key = getNextKey(key);
690                 otherKey = lastKey(getLastRootWrapper());
691                 int cmp = compare(key, otherKey);
692                 if(key == null || cmp > 0)
693                     return;
694             }
695             else {
696                 key = getPreviousKey(key);
697                 otherKey = firstKey(getFirstRootWrapper());
698                 int cmp = compare(key, otherKey);
699                 if(key == null || cmp < 0)
700                     return;
701             }
702             markInvalid(key, otherKey);
703     }
704 }
705
706
Popular Tags