comparison src/main/gov/nasa/jpf/util/BitSet1024.java @ 0:61d41facf527

initial v8 import (history reset)
author Peter Mehlitz <Peter.C.Mehlitz@nasa.gov>
date Fri, 23 Jan 2015 10:14:01 -0800
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:61d41facf527
1 /*
2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
4 * All rights reserved.
5 *
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0.
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 package gov.nasa.jpf.util;
20
21
22 /**
23 * a fixed size BitSet with 1024 bits.
24 *
25 * The main motivation for this class is to minimize memory size while maximizing
26 * performance and keeping a java.util.BitSet compatible interface. The only
27 * deviation from the standard BitSet is that we assume more cardinality() calls
28 * than set()/clear() calls, i.e. we want to cache this value
29 *
30 * Instances of this class do not allocate any additional memory, we keep all
31 * data in builtin type fields
32 */
33 public class BitSet1024 extends AbstractFixedBitSet {
34
35 public static final int INDEX_MASK = 0xfffffc00;
36
37 long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15;
38
39 public BitSet1024 (){
40 // nothing in here
41 }
42
43 public BitSet1024 (int i){
44 set(i);
45 }
46
47 public BitSet1024 (int... idx){
48 for (int i : idx){
49 set(i);
50 }
51 }
52
53 private final int computeCardinality (){
54 int n= Long.bitCount(l0);
55 n += Long.bitCount(l1);
56 n += Long.bitCount(l2);
57 n += Long.bitCount(l3);
58 n += Long.bitCount(l4);
59 n += Long.bitCount(l5);
60 n += Long.bitCount(l6);
61 n += Long.bitCount(l7);
62 n += Long.bitCount(l8);
63 n += Long.bitCount(l9);
64 n += Long.bitCount(l10);
65 n += Long.bitCount(l11);
66 n += Long.bitCount(l12);
67 n += Long.bitCount(l13);
68 n += Long.bitCount(l14);
69 n += Long.bitCount(l15);
70 return n;
71 }
72
73 //--- public interface (much like java.util.BitSet)
74
75 @Override
76 public void set (int i){
77 if ((i & INDEX_MASK) == 0) {
78 long bitPattern = (1L << i);
79
80 switch (i >> 6) {
81 case 0:
82 if ((l0 & bitPattern) == 0L) {
83 cardinality++;
84 l0 |= bitPattern;
85 }
86 break;
87 case 1:
88 if ((l1 & bitPattern) == 0L) {
89 cardinality++;
90 l1 |= bitPattern;
91 }
92 break;
93 case 2:
94 if ((l2 & bitPattern) == 0L) {
95 cardinality++;
96 l2 |= bitPattern;
97 }
98 break;
99 case 3:
100 if ((l3 & bitPattern) == 0L) {
101 cardinality++;
102 l3 |= bitPattern;
103 }
104 break;
105 case 4:
106 if ((l4 & bitPattern) == 0L) {
107 cardinality++;
108 l4 |= bitPattern;
109 }
110 break;
111 case 5:
112 if ((l5 & bitPattern) == 0L) {
113 cardinality++;
114 l5 |= bitPattern;
115 }
116 break;
117 case 6:
118 if ((l6 & bitPattern) == 0L) {
119 cardinality++;
120 l6 |= bitPattern;
121 }
122 break;
123 case 7:
124 if ((l7 & bitPattern) == 0L) {
125 cardinality++;
126 l7 |= bitPattern;
127 }
128 break;
129 case 8:
130 if ((l8 & bitPattern) == 0L) {
131 cardinality++;
132 l8 |= bitPattern;
133 }
134 break;
135 case 9:
136 if ((l9 & bitPattern) == 0L) {
137 cardinality++;
138 l9 |= bitPattern;
139 }
140 break;
141 case 10:
142 if ((l10 & bitPattern) == 0L) {
143 cardinality++;
144 l10 |= bitPattern;
145 }
146 break;
147 case 11:
148 if ((l11 & bitPattern) == 0L) {
149 cardinality++;
150 l11 |= bitPattern;
151 }
152 break;
153 case 12:
154 if ((l12 & bitPattern) == 0L) {
155 cardinality++;
156 l12 |= bitPattern;
157 }
158 break;
159 case 13:
160 if ((l13 & bitPattern) == 0L) {
161 cardinality++;
162 l13 |= bitPattern;
163 }
164 break;
165 case 14:
166 if ((l14 & bitPattern) == 0L) {
167 cardinality++;
168 l14 |= bitPattern;
169 }
170 break;
171 case 15:
172 if ((l15 & bitPattern) == 0L) {
173 cardinality++;
174 l15 |= bitPattern;
175 }
176 }
177 } else {
178 throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i);
179 }
180 }
181
182 @Override
183 public void clear (int i){
184 if ((i & INDEX_MASK) == 0) {
185 long bitPattern = (1L << i);
186
187 switch (i >> 6) {
188 case 0:
189 if ((l0 & bitPattern) != 0L) {
190 cardinality--;
191 l0 &= ~bitPattern;
192 }
193 break;
194 case 1:
195 if ((l1 & bitPattern) != 0L) {
196 cardinality--;
197 l1 &= ~bitPattern;
198 }
199 break;
200 case 2:
201 if ((l2 & bitPattern) != 0L) {
202 cardinality--;
203 l2 &= ~bitPattern;
204 }
205 break;
206 case 3:
207 if ((l3 & bitPattern) != 0L) {
208 cardinality--;
209 l3 &= ~bitPattern;
210 }
211 case 4:
212 if ((l4 & bitPattern) != 0L) {
213 cardinality--;
214 l4 &= ~bitPattern;
215 }
216 break;
217 case 5:
218 if ((l5 & bitPattern) != 0L) {
219 cardinality--;
220 l5 &= ~bitPattern;
221 }
222 break;
223 case 6:
224 if ((l6 & bitPattern) != 0L) {
225 cardinality--;
226 l6 &= ~bitPattern;
227 }
228 break;
229 case 7:
230 if ((l7 & bitPattern) != 0L) {
231 cardinality--;
232 l7 &= ~bitPattern;
233 }
234 break;
235 case 8:
236 if ((l8 & bitPattern) != 0L) {
237 cardinality--;
238 l8 &= ~bitPattern;
239 }
240 break;
241 case 9:
242 if ((l9 & bitPattern) != 0L) {
243 cardinality--;
244 l9 &= ~bitPattern;
245 }
246 break;
247 case 10:
248 if ((l10 & bitPattern) != 0L) {
249 cardinality--;
250 l10 &= ~bitPattern;
251 }
252 break;
253 case 11:
254 if ((l11 & bitPattern) != 0L) {
255 cardinality--;
256 l11 &= ~bitPattern;
257 }
258 break;
259 case 12:
260 if ((l12 & bitPattern) != 0L) {
261 cardinality--;
262 l12 &= ~bitPattern;
263 }
264 break;
265 case 13:
266 if ((l13 & bitPattern) != 0L) {
267 cardinality--;
268 l13 &= ~bitPattern;
269 }
270 break;
271 case 14:
272 if ((l14 & bitPattern) != 0L) {
273 cardinality--;
274 l14 &= ~bitPattern;
275 }
276 break;
277 case 15:
278 if ((l15 & bitPattern) != 0L) {
279 cardinality--;
280 l15 &= ~bitPattern;
281 }
282 }
283 } else {
284 throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i);
285 }
286 }
287
288 @Override
289 public boolean get (int i){
290 if ((i & INDEX_MASK) == 0) {
291 long bitPattern = (1L << i);
292
293 switch (i >> 6) {
294 case 0:
295 return ((l0 & bitPattern) != 0);
296 case 1:
297 return ((l1 & bitPattern) != 0);
298 case 2:
299 return ((l2 & bitPattern) != 0);
300 case 3:
301 return ((l3 & bitPattern) != 0);
302 case 4:
303 return ((l4 & bitPattern) != 0);
304 case 5:
305 return ((l5 & bitPattern) != 0);
306 case 6:
307 return ((l6 & bitPattern) != 0);
308 case 7:
309 return ((l7 & bitPattern) != 0);
310 case 8:
311 return ((l8 & bitPattern) != 0);
312 case 9:
313 return ((l9 & bitPattern) != 0);
314 case 10:
315 return ((l10 & bitPattern) != 0);
316 case 11:
317 return ((l11 & bitPattern) != 0);
318 case 12:
319 return ((l12 & bitPattern) != 0);
320 case 13:
321 return ((l13 & bitPattern) != 0);
322 case 14:
323 return ((l14 & bitPattern) != 0);
324 case 15:
325 return ((l15 & bitPattern) != 0);
326 }
327 }
328
329 throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i);
330 }
331
332 @Override
333 public int size() {
334 return 1024;
335 }
336
337 /**
338 * number of bits we can store
339 */
340 @Override
341 public int capacity() {
342 return 1024;
343 }
344
345 /**
346 * index of highest set bit + 1
347 */
348 @Override
349 public int length() {
350 if (l15 != 0){
351 return 1024 - Long.numberOfLeadingZeros(l15);
352 } else if (l14 != 0) {
353 return 960 - Long.numberOfLeadingZeros(l14);
354 } else if (l13 != 0) {
355 return 896 - Long.numberOfLeadingZeros(l13);
356 } else if (l12 != 0) {
357 return 832 - Long.numberOfLeadingZeros(l12);
358 } else if (l11 != 0) {
359 return 768 - Long.numberOfLeadingZeros(l11);
360 } else if (l10 != 0) {
361 return 704 - Long.numberOfLeadingZeros(l10);
362 } else if (l9 != 0) {
363 return 640 - Long.numberOfLeadingZeros(l9);
364 } else if (l8 != 0) {
365 return 576 - Long.numberOfLeadingZeros(l8);
366 } else if (l7 != 0) {
367 return 512 - Long.numberOfLeadingZeros(l7);
368 } else if (l6 != 0) {
369 return 448 - Long.numberOfLeadingZeros(l6);
370 } else if (l5 != 0) {
371 return 384 - Long.numberOfLeadingZeros(l5);
372 } else if (l4 != 0) {
373 return 320 - Long.numberOfLeadingZeros(l4);
374 } else if (l3 != 0){
375 return 256 - Long.numberOfLeadingZeros(l3);
376 } else if (l2 != 0){
377 return 192 - Long.numberOfLeadingZeros(l2);
378 } else if (l1 != 0){
379 return 128 - Long.numberOfLeadingZeros(l1);
380 } else if (l1 != 0){
381 return 64 - Long.numberOfLeadingZeros(l0);
382 } else {
383 return 0;
384 }
385 }
386
387 @Override
388 public void clear() {
389 l0 = l1 = l2 = l3 = l4 = l5 = l6 = l7
390 = l8 = l9= l10 = l11 = l12 = l13 = l14
391 = l15 =0L;
392 cardinality = 0;
393 }
394
395
396 @Override
397 public int nextSetBit (int fromIdx){
398 if ((fromIdx & INDEX_MASK) == 0) {
399 int i;
400 int i0 = fromIdx & 0x3f;
401 switch (fromIdx >> 6){
402 case 0:
403 if ((i=Long.numberOfTrailingZeros(l0 & (0xffffffffffffffffL << i0))) <64) return i;
404 if ((i=Long.numberOfTrailingZeros(l1)) <64) return i + 64;
405 if ((i=Long.numberOfTrailingZeros(l2)) <64) return i + 128;
406 if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192;
407 if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256;
408 if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320;
409 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
410 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
411 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
412 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
413 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
414 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
415 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
416 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
417 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
418 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
419 break;
420 case 1:
421 if ((i=Long.numberOfTrailingZeros(l1 & (0xffffffffffffffffL << i0))) <64) return i + 64;
422 if ((i=Long.numberOfTrailingZeros(l2)) <64) return i + 128;
423 if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192;
424 if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256;
425 if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320;
426 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
427 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
428 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
429 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
430 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
431 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
432 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
433 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
434 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
435 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
436 break;
437 case 2:
438 if ((i=Long.numberOfTrailingZeros(l2 & (0xffffffffffffffffL << i0))) <64) return i + 128;
439 if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192;
440 if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256;
441 if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320;
442 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
443 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
444 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
445 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
446 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
447 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
448 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
449 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
450 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
451 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
452 break;
453 case 3:
454 if ((i=Long.numberOfTrailingZeros(l3 & (0xffffffffffffffffL << i0))) <64) return i + 192;
455 if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256;
456 if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320;
457 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
458 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
459 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
460 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
461 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
462 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
463 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
464 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
465 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
466 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
467 break;
468 case 4:
469 if ((i=Long.numberOfTrailingZeros(l4 & (0xffffffffffffffffL << i0))) <64) return i + 256;
470 if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320;
471 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
472 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
473 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
474 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
475 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
476 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
477 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
478 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
479 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
480 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
481 break;
482 case 5:
483 if ((i=Long.numberOfTrailingZeros(l5 & (0xffffffffffffffffL << i0))) <64) return i + 320;
484 if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384;
485 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
486 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
487 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
488 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
489 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
490 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
491 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
492 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
493 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
494 break;
495 case 6:
496 if ((i=Long.numberOfTrailingZeros(l6 & (0xffffffffffffffffL << i0))) <64) return i + 384;
497 if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448;
498 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
499 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
500 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
501 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
502 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
503 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
504 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
505 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
506 break;
507 case 7:
508 if ((i=Long.numberOfTrailingZeros(l7 & (0xffffffffffffffffL << i0))) <64) return i + 448;
509 if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512;
510 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
511 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
512 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
513 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
514 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
515 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
516 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
517 break;
518 case 8:
519 if ((i=Long.numberOfTrailingZeros(l8 & (0xffffffffffffffffL << i0))) <64) return i + 512;
520 if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576;
521 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
522 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
523 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
524 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
525 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
526 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
527 break;
528 case 9:
529 if ((i=Long.numberOfTrailingZeros(l9 & (0xffffffffffffffffL << i0))) <64) return i + 576;
530 if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640;
531 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
532 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
533 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
534 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
535 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
536 break;
537 case 10:
538 if ((i=Long.numberOfTrailingZeros(l10 & (0xffffffffffffffffL << i0))) <64) return i + 640;
539 if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704;
540 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
541 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
542 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
543 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
544 break;
545 case 11:
546 if ((i=Long.numberOfTrailingZeros(l11 & (0xffffffffffffffffL << i0))) <64) return i + 704;
547 if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768;
548 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
549 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
550 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
551 break;
552 case 12:
553 if ((i=Long.numberOfTrailingZeros(l12 & (0xffffffffffffffffL << i0))) <64) return i + 768;
554 if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832;
555 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
556 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
557 break;
558 case 13:
559 if ((i=Long.numberOfTrailingZeros(l13 & (0xffffffffffffffffL << i0))) <64) return i + 832;
560 if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896;
561 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
562 break;
563 case 14:
564 if ((i=Long.numberOfTrailingZeros(l14 & (0xffffffffffffffffL << i0))) <64) return i + 896;
565 if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960;
566 break;
567 case 15:
568 if ((i=Long.numberOfTrailingZeros(l15 & (0xffffffffffffffffL << i0))) <64) return i + 960;
569 break;
570 }
571 return -1;
572
573 }
574 return -1;
575 }
576
577 @Override
578 public int nextClearBit (int fromIdx){
579 if ((fromIdx & INDEX_MASK) == 0) {
580 int i;
581 int i0 = fromIdx & 0x3f;
582 switch (fromIdx >> 6){
583 case 0:
584 if ((i=Long.numberOfTrailingZeros(~l0 & (0xffffffffffffffffL << i0))) <64) return i;
585 if ((i=Long.numberOfTrailingZeros(~l1)) <64) return i + 64;
586 if ((i=Long.numberOfTrailingZeros(~l2)) <64) return i + 128;
587 if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192;
588 if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256;
589 if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320;
590 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
591 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
592 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
593 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
594 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
595 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
596 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
597 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
598 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
599 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
600 break;
601 case 1:
602 if ((i=Long.numberOfTrailingZeros(~l1 & (0xffffffffffffffffL << i0))) <64) return i + 64;
603 if ((i=Long.numberOfTrailingZeros(~l2)) <64) return i + 128;
604 if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192;
605 if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256;
606 if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320;
607 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
608 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
609 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
610 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
611 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
612 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
613 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
614 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
615 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
616 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
617 break;
618 case 2:
619 if ((i=Long.numberOfTrailingZeros(~l2 & (0xffffffffffffffffL << i0))) <64) return i + 128;
620 if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192;
621 if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256;
622 if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320;
623 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
624 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
625 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
626 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
627 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
628 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
629 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
630 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
631 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
632 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
633 break;
634 case 3:
635 if ((i=Long.numberOfTrailingZeros(~l3 & (0xffffffffffffffffL << i0))) <64) return i + 192;
636 if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256;
637 if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320;
638 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
639 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
640 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
641 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
642 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
643 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
644 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
645 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
646 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
647 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
648 break;
649 case 4:
650 if ((i=Long.numberOfTrailingZeros(~l4 & (0xffffffffffffffffL << i0))) <64) return i + 256;
651 if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320;
652 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
653 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
654 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
655 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
656 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
657 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
658 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
659 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
660 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
661 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
662 break;
663 case 5:
664 if ((i=Long.numberOfTrailingZeros(~l5 & (0xffffffffffffffffL << i0))) <64) return i + 320;
665 if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384;
666 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
667 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
668 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
669 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
670 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
671 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
672 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
673 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
674 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
675 break;
676 case 6:
677 if ((i=Long.numberOfTrailingZeros(~l6 & (0xffffffffffffffffL << i0))) <64) return i + 384;
678 if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448;
679 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
680 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
681 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
682 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
683 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
684 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
685 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
686 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
687 break;
688 case 7:
689 if ((i=Long.numberOfTrailingZeros(~l7 & (0xffffffffffffffffL << i0))) <64) return i + 448;
690 if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512;
691 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
692 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
693 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
694 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
695 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
696 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
697 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
698 break;
699 case 8:
700 if ((i=Long.numberOfTrailingZeros(~l8 & (0xffffffffffffffffL << i0))) <64) return i + 512;
701 if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576;
702 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
703 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
704 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
705 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
706 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
707 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
708 break;
709 case 9:
710 if ((i=Long.numberOfTrailingZeros(~l9 & (0xffffffffffffffffL << i0))) <64) return i + 576;
711 if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640;
712 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
713 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
714 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
715 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
716 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
717 break;
718 case 10:
719 if ((i=Long.numberOfTrailingZeros(~l10 & (0xffffffffffffffffL << i0))) <64) return i + 640;
720 if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704;
721 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
722 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
723 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
724 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
725 break;
726 case 11:
727 if ((i=Long.numberOfTrailingZeros(~l11 & (0xffffffffffffffffL << i0))) <64) return i + 704;
728 if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768;
729 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
730 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
731 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
732 break;
733 case 12:
734 if ((i=Long.numberOfTrailingZeros(~l12 & (0xffffffffffffffffL << i0))) <64) return i + 768;
735 if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832;
736 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
737 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
738 break;
739 case 13:
740 if ((i=Long.numberOfTrailingZeros(~l13 & (0xffffffffffffffffL << i0))) <64) return i + 832;
741 if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896;
742 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
743 break;
744 case 14:
745 if ((i=Long.numberOfTrailingZeros(~l14 & (0xffffffffffffffffL << i0))) <64) return i + 896;
746 if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960;
747 break;
748 case 15:
749 if ((i=Long.numberOfTrailingZeros(~l15 & (0xffffffffffffffffL << i0))) <64) return i + 960;
750 break;
751 }
752
753 return -1;
754
755 } else {
756 //throw new IndexOutOfBoundsException("BitSet256 index out of range: " + fromIdx);
757 return -1;
758 }
759 }
760
761 public void and (BitSet1024 other){
762 l0 &= other.l0;
763 l1 &= other.l1;
764 l2 &= other.l2;
765 l3 &= other.l3;
766 l4 &= other.l4;
767 l5 &= other.l5;
768 l6 &= other.l6;
769 l7 &= other.l7;
770 l8 &= other.l8;
771 l9 &= other.l9;
772 l10 &= other.l10;
773 l11 &= other.l11;
774 l12 &= other.l12;
775 l13 &= other.l13;
776 l14 &= other.l14;
777 l15 &= other.l15;
778
779 cardinality = computeCardinality();
780 }
781
782 public void andNot (BitSet1024 other){
783 l0 &= ~other.l0;
784 l1 &= ~other.l1;
785 l2 &= ~other.l2;
786 l3 &= ~other.l3;
787 l4 &= ~other.l4;
788 l5 &= ~other.l5;
789 l6 &= ~other.l6;
790 l7 &= ~other.l7;
791 l8 &= ~other.l8;
792 l9 &= ~other.l9;
793 l10 &= ~other.l10;
794 l11 &= ~other.l11;
795 l12 &= ~other.l12;
796 l13 &= ~other.l13;
797 l14 &= ~other.l14;
798 l15 &= ~other.l15;
799
800 cardinality = computeCardinality();
801 }
802
803 public void or (BitSet1024 other){
804 l0 |= other.l0;
805 l1 |= other.l1;
806 l2 |= other.l2;
807 l3 |= other.l3;
808 l4 |= other.l4;
809 l5 |= other.l5;
810 l6 |= other.l6;
811 l7 |= other.l7;
812 l8 |= other.l8;
813 l9 |= other.l9;
814 l10 |= other.l10;
815 l11 |= other.l11;
816 l12 |= other.l12;
817 l13 |= other.l13;
818 l14 |= other.l14;
819 l15 |= other.l15;
820
821 cardinality = computeCardinality();
822 }
823
824 @Override
825 public boolean equals (Object o){
826 if (o instanceof BitSet1024){
827 BitSet1024 other = (BitSet1024)o;
828 if (l0 != other.l0) return false;
829 if (l1 != other.l1) return false;
830 if (l2 != other.l2) return false;
831 if (l3 != other.l3) return false;
832 if (l4 != other.l4) return false;
833 if (l5 != other.l5) return false;
834 if (l6 != other.l6) return false;
835 if (l7 != other.l7) return false;
836 if (l8 != other.l8) return false;
837 if (l9 != other.l9) return false;
838 if (l10 != other.l10) return false;
839 if (l11 != other.l11) return false;
840 if (l12 != other.l12) return false;
841 if (l13 != other.l13) return false;
842 if (l14 != other.l14) return false;
843 if (l15 != other.l15) return false;
844
845 return true;
846 } else {
847 // <2do> we could compare to a normal java.util.BitSet here
848 return false;
849 }
850 }
851
852 /**
853 * answer the same hashCodes as java.util.BitSet
854 */
855 @Override
856 public int hashCode() {
857 long hc = 1234;
858 hc ^= l0;
859 hc ^= l1*2;
860 hc ^= l2*3;
861 hc ^= l4*4;
862 hc ^= l5*5;
863 hc ^= l6*6;
864 hc ^= l7*7;
865 hc ^= l8*8;
866 hc ^= l9*9;
867 hc ^= l10*10;
868 hc ^= l11*11;
869 hc ^= l12*12;
870 hc ^= l13*13;
871 hc ^= l14*14;
872 hc ^= l15*15;
873 return (int) ((hc >>32) ^ hc);
874 }
875
876
877 @Override
878 public void hash (HashData hd){
879 hd.add(l0);
880 hd.add(l1);
881 hd.add(l2);
882 hd.add(l3);
883 hd.add(l4);
884 hd.add(l5);
885 hd.add(l6);
886 hd.add(l7);
887 hd.add(l8);
888 hd.add(l9);
889 hd.add(l10);
890 hd.add(l11);
891 hd.add(l12);
892 hd.add(l13);
893 hd.add(l14);
894 hd.add(l15);
895 }
896 }