1 19 package bak.pcj.set; 20 21 import bak.pcj.util.Exceptions; 22 import java.io.Serializable ; 23 24 36 public class LongRange implements Comparable , Serializable { 37 38 42 private long first; 43 44 48 private long last; 49 50 62 public LongRange(long first, long last) { 63 if (last < first) 64 Exceptions.invalidRangeBounds(String.valueOf(first), String.valueOf(last)); 65 this.first = first; 66 this.last = last; 67 } 68 69 85 96 97 102 public long first() 103 { return first; } 104 105 110 public long last() 111 { return last; } 112 113 118 public int length() { 119 return (int)(last-first+1); 120 } 121 122 134 public boolean intersects(LongRange range) { 135 return (first >= range.first && first <= range.last) 136 || (range.first >= first && range.first <= last); 137 } 138 139 152 public boolean adjacentTo(LongRange range) { 153 return (last+1 == range.first) 154 || (range.last+1 == first); 155 } 156 157 172 public boolean canMergeWith(LongRange range) { 173 return intersects(range) || adjacentTo(range); 174 } 175 176 190 public LongRange mergeWith(LongRange range) { 191 if (!canMergeWith(range)) 192 Exceptions.cannotMergeRanges(this, range); 193 return quickMergeWith(range); 194 } 195 196 private LongRange quickMergeWith(LongRange range) { 197 long nfirst = first < range.first ? first : range.first; 198 long nlast = last > range.last ? last : range.last; 199 return new LongRange(nfirst, nlast); 200 } 201 202 public LongRange tryMergeWith(LongRange range) { 203 if (!canMergeWith(range)) 204 return null; 205 return quickMergeWith(range); 206 } 207 208 221 public int intersectionLength(LongRange range) { 222 int len; 223 if (first >= range.first && first <= range.last) { 224 long end = last <= range.last ? last : range.last; 225 len = ((int)(end-first))+1; 226 } else 227 if (range.first >= first && range.first <= last) { 228 long end = last <= range.last ? last : range.last; 229 len = ((int)(end-range.first))+1; 230 } else 231 len = 0; 232 return len; 233 } 234 235 236 246 public boolean contains(long v) { 247 return v >= first && v <= last; 248 } 249 250 260 public boolean equals(Object obj) { 261 if (!(obj instanceof LongRange)) 262 return false; 263 LongRange range = (LongRange)obj; 264 return first == range.first && last == range.last; 265 } 266 267 285 public int compareTo(Object obj) { 286 LongRange range = (LongRange)obj; 287 if (first < range.first) 288 return -1; 289 if (first > range.first) 290 return 1; 291 if (last < range.last) 292 return -1; 293 if (last > range.last) 294 return 1; 295 return 0; 296 } 297 298 303 public int hashCode() { 304 return (int)(first ^ last); 305 } 306 307 312 public String toString() { 313 return bak.pcj.util.Display.display(first) + "-" + bak.pcj.util.Display.display(last); 314 } 315 316 } | Popular Tags |