@Test public void testGet2() { final ImmutableBitSet bitSet = ImmutableBitSet.of(29, 4, 1969); assertThat(bitSet.get(0, 8), is(ImmutableBitSet.of(4))); assertThat(bitSet.get(0, 5), is(ImmutableBitSet.of(4))); assertThat(bitSet.get(0, 4), is(ImmutableBitSet.of())); assertThat(bitSet.get(4, 4), is(ImmutableBitSet.of())); assertThat(bitSet.get(5, 5), is(ImmutableBitSet.of())); assertThat(bitSet.get(4, 5), is(ImmutableBitSet.of(4))); assertThat(bitSet.get(4, 1000), is(ImmutableBitSet.of(4, 29))); assertThat(bitSet.get(4, 32), is(ImmutableBitSet.of(4, 29))); assertThat(bitSet.get(2000, 10000), is(ImmutableBitSet.of())); assertThat(bitSet.get(1000, 10000), is(ImmutableBitSet.of(1969))); assertThat(bitSet.get(5, 10000), is(ImmutableBitSet.of(29, 1969))); assertThat(bitSet.get(65, 10000), is(ImmutableBitSet.of(1969))); final ImmutableBitSet emptyBitSet = ImmutableBitSet.of(); assertThat(emptyBitSet.get(0, 4), is(ImmutableBitSet.of())); assertThat(emptyBitSet.get(0, 0), is(ImmutableBitSet.of())); assertThat(emptyBitSet.get(0, 10000), is(ImmutableBitSet.of())); assertThat(emptyBitSet.get(7, 10000), is(ImmutableBitSet.of())); assertThat(emptyBitSet.get(73, 10000), is(ImmutableBitSet.of())); }
protected void modify(HierNode<T> x, HierNode<T> y) { // System.out.println( "Modifying on a inc between " + x + " and " + y ); int i = freeBit(x, y); // System.out.println( "I " + i ); // System.out.println( "Getting parents of " + y + " >> " + y.getParents() ); Collection<HierNode<T>> py = y.getParents(); BitSet t = new BitSet(y.getBitMask().length()); for (HierNode<T> parent : py) { t.or(parent.getBitMask()); } BitSet d = singleBitDiff(t, y.getBitMask()); int inDex = d.nextSetBit(0); if (inDex < 0) { propagate(y, i); } else { // System.out.println( "D " + toBinaryString( d ) ); Set<HierNode<T>> ancestors = ancestorNodes(x); Set<HierNode<T>> affectedAncestors = new HashSet<HierNode<T>>(); for (HierNode<T> anc : ancestors) { if (anc.getBitMask().get(inDex)) { affectedAncestors.add(anc); } } // System.out.println( "Ancestors of " + x + " >> " + ancestors ); // System.out.println( "Affected " + x + " >> " + affectedAncestors ); if (affectedAncestors.size() == 0) { return; } Set<HierNode<T>> gcs = gcs(affectedAncestors); // System.out.println( "GCS of Affected " + gcs ); Set<HierNode<T>> affectedDescendants = new HashSet<HierNode<T>>(); for (HierNode<T> g : gcs) { affectedDescendants.addAll(descendantNodes(g)); } affectedDescendants.remove(x); // take x out it's not yet in the set int dx = firstOne(d); if (bottom.get(i)) { i = freeBit(new HierNode<T>(bottom)); } for (HierNode<T> sub : affectedDescendants) { boolean keepsBit = false; for (HierNode<T> sup : sub.getParents()) { if (!keepsBit && !affectedDescendants.contains(sup) && sup.getBitMask().get(inDex)) { keepsBit = true; } } BitSet subMask = sub.getBitMask(); if (!keepsBit) { subMask = decrement(subMask, dx); } subMask = increment(subMask, i); updateMask(sub, subMask); // System.out.println( "\tModified Desc" + sub ); } inDex = d.nextSetBit(inDex + 1); } }