1 21 package com.db4o.inside.btree; 22 23 import com.db4o.Transaction; 24 import com.db4o.foundation.*; 25 import com.db4o.inside.btree.algebra.*; 26 27 30 public class BTreeRangeSingle implements BTreeRange { 31 32 public static final Comparison4 COMPARISON = new Comparison4() { 33 public int compare(Object x, Object y) { 34 BTreeRangeSingle xRange = (BTreeRangeSingle)x; 35 BTreeRangeSingle yRange = (BTreeRangeSingle)y; 36 return xRange.first().compareTo(yRange.first()); 37 } 38 }; 39 40 private final Transaction _transaction; 41 42 private final BTree _btree; 43 44 private final BTreePointer _first; 45 46 private final BTreePointer _end; 47 48 public BTreeRangeSingle(Transaction transaction, BTree btree, BTreePointer first, BTreePointer end) { 49 if (transaction == null || btree == null) { 50 throw new ArgumentNullException(); 51 } 52 _transaction = transaction; 53 _btree = btree; 54 _first = first; 55 _end = end; 56 } 57 58 public void accept(BTreeRangeVisitor visitor) { 59 visitor.visit(this); 60 } 61 62 public boolean isEmpty() { 63 return BTreePointer.equals(_first, _end); 64 } 65 66 public int size(){ 67 if(isEmpty()){ 68 return 0; 69 } 70 71 74 92 int size = 0; 93 final Iterator4 i = keys(); 94 while (i.moveNext()) { 95 ++size; 96 } 97 return size; 98 } 99 100 public Iterator4 pointers() { 101 return new BTreeRangePointerIterator(this); 102 } 103 104 public Iterator4 keys() { 105 return new BTreeRangeKeyIterator(this); 106 } 107 108 public final BTreePointer end() { 109 return _end; 110 } 111 112 public Transaction transaction() { 113 return _transaction; 114 } 115 116 public BTreePointer first() { 117 return _first; 118 } 119 120 public BTreeRange greater() { 121 return newBTreeRangeSingle(_end, null); 122 } 123 124 public BTreeRange union(BTreeRange other) { 125 if (null == other) { 126 throw new ArgumentNullException(); 127 } 128 return new BTreeRangeSingleUnion(this).dispatch(other); 129 } 130 131 public boolean adjacent(BTreeRangeSingle range) { 132 return BTreePointer.equals(_end, range._first) 133 || BTreePointer.equals(range._end, _first); 134 } 135 136 public boolean overlaps(BTreeRangeSingle range) { 137 return firstOverlaps(this, range) || firstOverlaps(range, this); 138 } 139 140 private boolean firstOverlaps(BTreeRangeSingle x, BTreeRangeSingle y) { 141 return BTreePointer.lessThan(y._first, x._end) 142 && BTreePointer.lessThan(x._first, y._end); 143 } 144 145 public BTreeRange extendToFirst() { 146 return newBTreeRangeSingle(firstBTreePointer(), _end); 147 } 148 149 public BTreeRange extendToLast() { 150 return newBTreeRangeSingle(_first, null); 151 } 152 153 public BTreeRange smaller() { 154 return newBTreeRangeSingle(firstBTreePointer(), _first); 155 } 156 157 public BTreeRangeSingle newBTreeRangeSingle(BTreePointer first, BTreePointer end) { 158 return new BTreeRangeSingle(transaction(), _btree, first, end); 159 } 160 161 public BTreeRange newEmptyRange() { 162 return newBTreeRangeSingle(null, null); 163 } 164 165 private BTreePointer firstBTreePointer() { 166 return btree().firstPointer(transaction()); 167 } 168 169 private BTree btree() { 170 return _btree; 171 } 172 173 public BTreeRange intersect(BTreeRange range) { 174 if (null == range) { 175 throw new ArgumentNullException(); 176 } 177 return new BTreeRangeSingleIntersect(this).dispatch(range); 178 } 179 180 public BTreeRange extendToLastOf(BTreeRange range) { 181 BTreeRangeSingle rangeImpl = checkRangeArgument(range); 182 return newBTreeRangeSingle(_first, rangeImpl._end); 183 } 184 185 public String toString() { 186 return "BTreeRangeSingle(first=" + _first + ", end=" + _end + ")"; 187 } 188 189 private BTreeRangeSingle checkRangeArgument(BTreeRange range) { 190 if (null == range) { 191 throw new ArgumentNullException(); 192 } 193 BTreeRangeSingle rangeImpl = (BTreeRangeSingle)range; 194 if (btree() != rangeImpl.btree()) { 195 throw new IllegalArgumentException (); 196 } 197 return rangeImpl; 198 } 199 200 public BTreePointer lastPointer() { 201 if(_end == null){ 202 return btree().lastPointer(transaction()); 203 } 204 return _end.previous(); 205 } 206 207 } 208 | Popular Tags |