@Test
  public void ContainerFactory() {
    MappeableBitmapContainer bc1, bc2, bc3;
    MappeableArrayContainer ac1, ac2, ac3;

    bc1 = new MappeableBitmapContainer();
    bc2 = new MappeableBitmapContainer();
    bc3 = new MappeableBitmapContainer();
    ac1 = new MappeableArrayContainer();
    ac2 = new MappeableArrayContainer();
    ac3 = new MappeableArrayContainer();

    for (short i = 0; i < 5000; i++) bc1.add((short) (i * 70));
    for (short i = 0; i < 5000; i++) bc2.add((short) (i * 70));
    for (short i = 0; i < 5000; i++) bc3.add((short) (i * 70));

    for (short i = 0; i < 4000; i++) ac1.add((short) (i * 50));
    for (short i = 0; i < 4000; i++) ac2.add((short) (i * 50));
    for (short i = 0; i < 4000; i++) ac3.add((short) (i * 50));

    MappeableBitmapContainer rbc;

    rbc = ac1.clone().toBitmapContainer();
    Assert.assertTrue(validate(rbc, ac1));
    rbc = ac2.clone().toBitmapContainer();
    Assert.assertTrue(validate(rbc, ac2));
    rbc = ac3.clone().toBitmapContainer();
    Assert.assertTrue(validate(rbc, ac3));
  }
  @Override
  public MappeableContainer flip(short x) {
    if (BufferUtil.isBackedBySimpleArray(this.content)) {
      short[] sarray = content.array();
      int loc = Util.unsignedBinarySearch(sarray, 0, cardinality, x);
      if (loc < 0) {
        // Transform the ArrayContainer to a BitmapContainer
        // when cardinality = DEFAULT_MAX_SIZE
        if (cardinality >= DEFAULT_MAX_SIZE) {
          MappeableBitmapContainer a = this.toBitmapContainer();
          a.add(x);
          return a;
        }
        if (cardinality >= sarray.length) {
          increaseCapacity();
          sarray = content.array();
        }
        // insertion : shift the elements > x by one position to
        // the right
        // and put x in it's appropriate place
        System.arraycopy(sarray, -loc - 1, sarray, -loc, cardinality + loc + 1);
        sarray[-loc - 1] = x;
        ++cardinality;
      } else {
        System.arraycopy(sarray, loc + 1, sarray, loc, cardinality - loc - 1);
        --cardinality;
      }
      return this;

    } else {
      int loc = BufferUtil.unsignedBinarySearch(content, 0, cardinality, x);
      if (loc < 0) {
        // Transform the ArrayContainer to a BitmapContainer
        // when cardinality = DEFAULT_MAX_SIZE
        if (cardinality >= DEFAULT_MAX_SIZE) {
          MappeableBitmapContainer a = this.toBitmapContainer();
          a.add(x);
          return a;
        }
        if (cardinality >= content.limit()) {
          increaseCapacity();
        }
        // insertion : shift the elements > x by one position to
        // the right
        // and put x in it's appropriate place
        for (int k = cardinality; k > -loc - 1; --k) content.put(k, content.get(k - 1));
        content.put(-loc - 1, x);
        ++cardinality;
      } else {
        for (int k = loc + 1; k < cardinality; --k) {
          content.put(k - 1, content.get(k));
        }
        --cardinality;
      }
      return this;
    }
  }
 @Test
 public void BitmapContainerCardinalityTest() {
   final MappeableBitmapContainer ac = new MappeableBitmapContainer();
   for (short k = 0; k < 100; ++k) {
     ac.add(k);
     Assert.assertEquals(ac.getCardinality(), k + 1);
   }
   for (short k = 0; k < 100; ++k) {
     ac.add(k);
     Assert.assertEquals(ac.getCardinality(), 100);
   }
 }
 @Test
 public void bitmaptest() {
   final MappeableBitmapContainer rr = new MappeableBitmapContainer();
   rr.add((short) 110);
   rr.add((short) 114);
   rr.add((short) 115);
   final short[] array = new short[3];
   int pos = 0;
   for (final short i : rr) array[pos++] = i;
   Assert.assertEquals(array[0], (short) 110);
   Assert.assertEquals(array[1], (short) 114);
   Assert.assertEquals(array[2], (short) 115);
 }