1 7 8 9 package javax.print.attribute; 10 11 import java.io.Serializable ; 12 import java.util.Vector ; 13 14 65 public abstract class SetOfIntegerSyntax implements Serializable , Cloneable { 66 67 private static final long serialVersionUID = 3666874174847632203L; 68 69 73 private int[][] members; 74 75 76 87 protected SetOfIntegerSyntax(String members) { 88 this.members = parse (members); 89 } 90 91 94 private static int[][] parse(String members) { 95 Vector theRanges = new Vector (); 98 99 int n = (members == null ? 0 : members.length()); 101 int i = 0; 102 int state = 0; 103 int lb = 0; 104 int ub = 0; 105 char c; 106 int digit; 107 while (i < n) { 108 c = members.charAt(i ++); 109 switch (state) { 110 111 case 0: if (Character.isWhitespace(c)) { 113 state = 0; 114 } 115 else if ((digit = Character.digit(c, 10)) != -1) { 116 lb = digit; 117 state = 1; 118 } else { 119 throw new IllegalArgumentException (); 120 } 121 break; 122 123 case 1: if (Character.isWhitespace(c)){ 125 state = 2; 126 } else if ((digit = Character.digit(c, 10)) != -1) { 127 lb = 10 * lb + digit; 128 state = 1; 129 } else if (c == '-' || c == ':') { 130 state = 3; 131 } else if (c == ',') { 132 accumulate (theRanges, lb, lb); 133 state = 6; 134 } else { 135 throw new IllegalArgumentException (); 136 } 137 break; 138 139 case 2: if (Character.isWhitespace(c)) { 141 state = 2; 142 } 143 else if (c == '-' || c == ':') { 144 state = 3; 145 } 146 else if (c == ',') { 147 accumulate(theRanges, lb, lb); 148 state = 6; 149 } else { 150 throw new IllegalArgumentException (); 151 } 152 break; 153 154 case 3: if (Character.isWhitespace(c)) { 156 state = 3; 157 } else if ((digit = Character.digit(c, 10)) != -1) { 158 ub = digit; 159 state = 4; 160 } else { 161 throw new IllegalArgumentException (); 162 } 163 break; 164 165 case 4: if (Character.isWhitespace(c)) { 167 state = 5; 168 } else if ((digit = Character.digit(c, 10)) != -1) { 169 ub = 10 * ub + digit; 170 state = 4; 171 } else if (c == ',') { 172 accumulate(theRanges, lb, ub); 173 state = 6; 174 } else { 175 throw new IllegalArgumentException (); 176 } 177 break; 178 179 case 5: if (Character.isWhitespace(c)) { 181 state = 5; 182 } else if (c == ',') { 183 accumulate(theRanges, lb, ub); 184 state = 6; 185 } else { 186 throw new IllegalArgumentException (); 187 } 188 break; 189 190 case 6: if (Character.isWhitespace(c)) { 192 state = 6; 193 } else if ((digit = Character.digit(c, 10)) != -1) { 194 lb = digit; 195 state = 1; 196 } else { 197 throw new IllegalArgumentException (); 198 } 199 break; 200 } 201 } 202 203 switch (state) { 205 case 0: break; 207 case 1: case 2: accumulate(theRanges, lb, lb); 210 break; 211 case 4: case 5: accumulate(theRanges, lb, ub); 214 break; 215 case 3: case 6: throw new IllegalArgumentException (); 218 } 219 220 return canonicalArrayForm (theRanges); 222 } 223 224 228 private static void accumulate(Vector ranges, int lb,int ub) { 229 if (lb <= ub) { 231 ranges.add(new int[] {lb, ub}); 233 234 for (int j = ranges.size()-2; j >= 0; -- j) { 237 int[] rangea = (int[]) ranges.elementAt (j); 239 int lba = rangea[0]; 240 int uba = rangea[1]; 241 int[] rangeb = (int[]) ranges.elementAt (j+1); 242 int lbb = rangeb[0]; 243 int ubb = rangeb[1]; 244 245 251 if (Math.max(lba, lbb) - Math.min(uba, ubb) <= 1) { 252 ranges.setElementAt(new int[] 255 {Math.min(lba, lbb), 256 Math.max(uba, ubb)}, j); 257 ranges.remove (j+1); 258 } else if (lba > lbb) { 259 260 263 ranges.setElementAt (rangeb, j); 264 ranges.setElementAt (rangea, j+1); 265 } else { 266 269 break; 270 } 271 } 272 } 273 } 274 275 278 private static int[][] canonicalArrayForm(Vector ranges) { 279 return (int[][]) ranges.toArray (new int[ranges.size()][]); 280 } 281 282 298 protected SetOfIntegerSyntax(int[][] members) { 299 this.members = parse (members); 300 } 301 302 305 private static int[][] parse(int[][] members) { 306 Vector ranges = new Vector (); 309 310 int n = (members == null ? 0 : members.length); 312 for (int i = 0; i < n; ++ i) { 313 int lb, ub; 315 if (members[i].length == 1) { 316 lb = ub = members[i][0]; 317 } else if (members[i].length == 2) { 318 lb = members[i][0]; 319 ub = members[i][1]; 320 } else { 321 throw new IllegalArgumentException (); 322 } 323 324 if (lb <= ub && lb < 0) { 326 throw new IllegalArgumentException (); 327 } 328 329 accumulate(ranges, lb, ub); 331 } 332 333 return canonicalArrayForm (ranges); 335 } 336 337 346 protected SetOfIntegerSyntax(int member) { 347 if (member < 0) { 348 throw new IllegalArgumentException (); 349 } 350 members = new int[][] {{member, member}}; 351 } 352 353 365 protected SetOfIntegerSyntax(int lowerBound, int upperBound) { 366 if (lowerBound <= upperBound && lowerBound < 0) { 367 throw new IllegalArgumentException (); 368 } 369 members = lowerBound <=upperBound ? 370 new int[][] {{lowerBound, upperBound}} : 371 new int[0][]; 372 } 373 374 375 382 public int[][] getMembers() { 383 int n = members.length; 384 int[][] result = new int[n][]; 385 for (int i = 0; i < n; ++ i) { 386 result[i] = new int[] {members[i][0], members[i][1]}; 387 } 388 return result; 389 } 390 391 399 public boolean contains(int x) { 400 int n = members.length; 402 for (int i = 0; i < n; ++ i) { 403 if (x < members[i][0]) { 404 return false; 405 } else if (x <= members[i][1]) { 406 return true; 407 } 408 } 409 return false; 410 } 411 412 421 public boolean contains(IntegerSyntax attribute) { 422 return contains (attribute.getValue()); 423 } 424 425 448 public int next(int x) { 449 int n = members.length; 451 for (int i = 0; i < n; ++ i) { 452 if (x < members[i][0]) { 453 return members[i][0]; 454 } else if (x < members[i][1]) { 455 return x + 1; 456 } 457 } 458 return -1; 459 } 460 461 480 public boolean equals(Object object) { 481 if (object != null && object instanceof SetOfIntegerSyntax ) { 482 int[][] myMembers = this.members; 483 int[][] otherMembers = ((SetOfIntegerSyntax ) object).members; 484 int m = myMembers.length; 485 int n = otherMembers.length; 486 if (m == n) { 487 for (int i = 0; i < m; ++ i) { 488 if (myMembers[i][0] != otherMembers[i][0] || 489 myMembers[i][1] != otherMembers[i][1]) { 490 return false; 491 } 492 } 493 return true; 494 } else { 495 return false; 496 } 497 } else { 498 return false; 499 } 500 } 501 502 507 public int hashCode() { 508 int result = 0; 509 int n = members.length; 510 for (int i = 0; i < n; ++ i) { 511 result += members[i][0] + members[i][1]; 512 } 513 return result; 514 } 515 516 524 public String toString() { 525 StringBuffer result = new StringBuffer (); 526 int n = members.length; 527 for (int i = 0; i < n; i++) { 528 if (i > 0) { 529 result.append (','); 530 } 531 result.append (members[i][0]); 532 if (members[i][0] != members[i][1]) { 533 result.append ('-'); 534 result.append (members[i][1]); 535 } 536 } 537 return result.toString(); 538 } 539 540 } 541
| Popular Tags
|