protected internal void WriteValues(int bitsRequired) { PackedInts.Encoder encoder = PackedInts.GetEncoder(PackedInts.Format.PACKED, PackedInts.VERSION_CURRENT, bitsRequired); int iterations = Values.Length / encoder.ByteValueCount(); int blockSize = encoder.ByteBlockCount() * iterations; if (Blocks == null || Blocks.Length < blockSize) { Blocks = new byte[blockSize]; } if (Off < Values.Length) { Arrays.Fill(Values, Off, Values.Length, 0L); } encoder.Encode(Values, 0, Blocks, 0, iterations); int blockCount = (int)PackedInts.Format.PACKED.ByteCount(PackedInts.VERSION_CURRENT, Off, bitsRequired); @out.WriteBytes(Blocks, blockCount); }
internal virtual void PforEncode() { if (NumExceptions > 0) { int mask = (1 << BitsPerValue) - 1; int ex = 0; for (int i = 0; i < BufferSize; ++i) { if (Buffer[i] > mask) { ExceptionIndices[ex] = i; Exceptions[ex++] = (int)((uint)Buffer[i] >> BitsPerValue); Buffer[i] &= mask; } } Debug.Assert(ex == NumExceptions); Arrays.Fill(Exceptions, NumExceptions, BLOCK_SIZE, 0); } if (BitsPerValue > 0) { PackedInts.Encoder encoder = PackedInts.GetEncoder(PackedInts.Format.PACKED, PackedInts.VERSION_CURRENT, BitsPerValue); int numIterations = ITERATIONS[BitsPerValue]; encoder.Encode(Buffer, 0, Data.Bytes, Data.Length, numIterations); Data.Length += encoder.ByteBlockCount() * numIterations; } if (NumExceptions > 0) { Debug.Assert(BitsPerException > 0); Data.WriteByte((sbyte)NumExceptions); Data.WriteByte((sbyte)BitsPerException); PackedInts.Encoder encoder = PackedInts.GetEncoder(PackedInts.Format.PACKED, PackedInts.VERSION_CURRENT, BitsPerException); int numIterations = (NumExceptions + encoder.ByteValueCount() - 1) / encoder.ByteValueCount(); encoder.Encode(Exceptions, 0, Data.Bytes, Data.Length, numIterations); Data.Length += (int)PackedInts.Format.PACKED.ByteCount(PackedInts.VERSION_CURRENT, NumExceptions, BitsPerException); for (int i = 0; i < NumExceptions; ++i) { Data.WriteByte((sbyte)ExceptionIndices[i]); } } }
/// <summary> /// Create a new <seealso cref="ForUtil"/> instance and save state into <code>out</code>. /// </summary> public ForUtil(float acceptableOverheadRatio, DataOutput @out) { @out.WriteVInt(PackedInts.VERSION_CURRENT); EncodedSizes = new int[33]; Encoders = new PackedInts.Encoder[33]; Decoders = new PackedInts.Decoder[33]; Iterations = new int[33]; for (int bpv = 1; bpv <= 32; ++bpv) { PackedInts.FormatAndBits formatAndBits = PackedInts.FastestFormatAndBits(Lucene41PostingsFormat.BLOCK_SIZE, bpv, acceptableOverheadRatio); Debug.Assert(formatAndBits.format.IsSupported(formatAndBits.bitsPerValue)); Debug.Assert(formatAndBits.bitsPerValue <= 32); EncodedSizes[bpv] = EncodedSize(formatAndBits.format, PackedInts.VERSION_CURRENT, formatAndBits.bitsPerValue); Encoders[bpv] = PackedInts.GetEncoder(formatAndBits.format, PackedInts.VERSION_CURRENT, formatAndBits.bitsPerValue); Decoders[bpv] = PackedInts.GetDecoder(formatAndBits.format, PackedInts.VERSION_CURRENT, formatAndBits.bitsPerValue); Iterations[bpv] = ComputeIterations(Decoders[bpv]); @out.WriteVInt(formatAndBits.format.id << 5 | (formatAndBits.bitsPerValue - 1)); } }
/// <summary> /// Restore a <seealso cref="ForUtil"/> from a <seealso cref="DataInput"/>. /// </summary> public ForUtil(DataInput @in) { int packedIntsVersion = @in.ReadVInt(); PackedInts.CheckVersion(packedIntsVersion); EncodedSizes = new int[33]; Encoders = new PackedInts.Encoder[33]; Decoders = new PackedInts.Decoder[33]; Iterations = new int[33]; for (int bpv = 1; bpv <= 32; ++bpv) { var code = @in.ReadVInt(); var formatId = (int)((uint)code >> 5); var bitsPerValue = (code & 31) + 1; PackedInts.Format format = PackedInts.Format.ById(formatId); Debug.Assert(format.IsSupported(bitsPerValue)); EncodedSizes[bpv] = EncodedSize(format, packedIntsVersion, bitsPerValue); Encoders[bpv] = PackedInts.GetEncoder(format, packedIntsVersion, bitsPerValue); Decoders[bpv] = PackedInts.GetDecoder(format, packedIntsVersion, bitsPerValue); Iterations[bpv] = ComputeIterations(Decoders[bpv]); } }