@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()));
  }
Ejemplo n.º 2
0
  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);
    }
  }