public static BitIndex wrap(byte[] data, int position, int limit) {
    // create a BitSet underneath
    BitSet bitSet = new BitSet();
    BitSet scalarFields = new BitSet();
    BitSet floatFields = new BitSet();
    BitSet doubleFields = new BitSet();
    BitReader bitReader = new BitReader(data, position, limit, 5, true);

    int bitPos = 0;
    while (bitReader.hasNext()) {
      int zeros = bitReader.nextSetBit();
      if (zeros < 0) break;
      bitPos += zeros;
      bitSet.set(bitPos);
      if (bitReader.next() != 0) {
        // either float or scalar
        if (bitReader.next() != 0) {
          scalarFields.set(bitPos);
        } else floatFields.set(bitPos);
      } else {
        // either a double or untyped
        if (bitReader.next() != 0) doubleFields.set(bitPos);
      }
      bitPos++;
    }
    return new UncompressedBitIndex(bitSet, scalarFields, floatFields, doubleFields);
  }
  public static void main(final String[] args) {
    final com.carrotsearch.hppc.BitSet hppcBitSet =
        new com.carrotsearch.hppc.BitSet(Long.MAX_VALUE);
    hppcBitSet.set(Integer.MAX_VALUE);
    final java.util.BitSet javaBitSet = new java.util.BitSet(Integer.MAX_VALUE);
    javaBitSet.set(Integer.MAX_VALUE - 1);

    System.out.println(ObjectSizeCalculator.getObjectSize(hppcBitSet));
    System.out.println(ObjectSizeCalculator.getObjectSize(javaBitSet));
  }
  private ByteEntryAccumulator getKeyAccumulator() {
    if (indexKeyAccumulator == null) {
      BitSet keyFields = new BitSet();
      for (int keyColumn : mainColToIndexPosMap) {
        if (keyColumn >= 0) keyFields.set(keyColumn);
      }
      indexKeyAccumulator =
          new ByteEntryAccumulator(EntryPredicateFilter.emptyPredicate(), keyFields);
    }

    return indexKeyAccumulator;
  }
 /** Adds stem index to the set with a check on the stem's document frequency. */
 private void addStemIndex(
     final int[] wordsStemIndex,
     int documentCount,
     int[][] stemsTfByDocument,
     final BitSet requiredStemIndices,
     final int featureIndex) {
   final int stemIndex = wordsStemIndex[featureIndex];
   final int df = stemsTfByDocument[stemIndex].length / 2;
   if (((double) df / documentCount) <= maxWordDf) {
     requiredStemIndices.set(stemIndex);
   }
 }
  @Test
  public void testAlwaysAcceptEntryWorks() throws Exception {
    BitSet fields = new BitSet();
    fields.set(0);
    fields.set(2);
    EntryPredicateFilter predicateFilter = new EntryPredicateFilter(fields);
    EntryAccumulator accumulator = new ByteEntryAccumulator(predicateFilter, false, null);
    byte[] encodedOne = Encoding.encode(1);
    accumulator.add(2, encodedOne, 0, encodedOne.length);
    byte[] encodedTwo = Encoding.encode(2);
    accumulator.add(0, encodedTwo, 0, encodedTwo.length);

    byte[] bytes = accumulator.finish();
    MultiFieldDecoder decoder = MultiFieldDecoder.wrap(bytes);
    Assert.assertEquals(2, decoder.decodeNextInt());
    Assert.assertEquals(1, decoder.decodeNextInt());
  }
 private EntryEncoder getRowEncoder() {
   if (indexValueEncoder == null) {
     BitSet nonNullFields = new BitSet();
     int highestSetPosition = 0;
     for (int keyColumn : mainColToIndexPosMap) {
       if (keyColumn > highestSetPosition) highestSetPosition = keyColumn;
     }
     nonNullFields.set(highestSetPosition + 1);
     indexValueEncoder =
         EntryEncoder.create(
             SpliceKryoRegistry.getInstance(),
             1,
             nonNullFields,
             new BitSet(),
             new BitSet(),
             new BitSet());
   }
   return indexValueEncoder;
 }