diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsFormat.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsFormat.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsFormat.java 1969-12-31 19:00:00.000000000 -0500 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsFormat.java 2012-08-18 10:40:28.785764718 -0400 @@ -0,0 +1,404 @@ +package org.apache.lucene.codecs.block; + + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.io.IOException; + +import org.apache.lucene.codecs.BlockTreeTermsReader; +import org.apache.lucene.codecs.BlockTreeTermsWriter; +import org.apache.lucene.codecs.FieldsConsumer; +import org.apache.lucene.codecs.FieldsProducer; +import org.apache.lucene.codecs.PostingsFormat; +import org.apache.lucene.codecs.PostingsReaderBase; +import org.apache.lucene.codecs.PostingsWriterBase; +import org.apache.lucene.index.SegmentReadState; +import org.apache.lucene.index.SegmentWriteState; +import org.apache.lucene.util.IOUtils; + +// javadocs +import org.apache.lucene.codecs.MultiLevelSkipListWriter; +import org.apache.lucene.codecs.CodecUtil; +import org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat; +import org.apache.lucene.store.DataOutput; +import org.apache.lucene.index.DocsEnum; +import org.apache.lucene.index.FieldInfo.IndexOptions; +import org.apache.lucene.index.FieldInfos; +import org.apache.lucene.util.fst.FST; +import org.apache.lucene.util.packed.PackedInts; + +/** + * Block postings format, which encodes postings in packed int blocks + * for faster decode. + * + *
+ * Basic idea: + *
In packed block, integers are encoded with the same bit width ({@link PackedInts packed format}), + * the block size (i.e. number of integers inside block) is fixed.
+ *In VInt block, integers are encoded as {@link DataOutput#writeVInt VInt}, + * the block size is variable.
+ *When the postings is long enough, BlockPostingsFormat will try to encode most integer data + * as packed block.
+ *Take a term with 259 documents as example, the first 256 document ids are encoded as two packed + * blocks, while the remaining 3 as one VInt block.
+ *Different kinds of data are always encoded separately into different packed blocks, but may + * possible be encoded into a same VInt block.
+ *This strategy is applied to pairs: + * <document number, frequency>, + * <position, payload length>, + * <position, offset start, offset length>, and + * <position, payload length, offsetstart, offset length>.
+ *The structure of skip table is quite similar to Lucene40PostingsFormat. Skip interval is the + * same as block size, and each skip entry points to the beginning of each block. However, for + * the first block, skip data is omitted.
+ *A position is an integer indicating where the term occurs at within one document. + * A payload is a blob of metadata associated with current position. + * An offset is a pair of integers indicating the tokenized start/end offsets for given term + * in current position.
+ *When payloads and offsets are not omitted, numPositions==numPayloads==numOffsets (assuming a + * null payload contributes one count). As mentioned in block structure, it is possible to encode + * these three either centralizedly or separately. + *
For all the cases, payloads and offsets are stored together. When encoded as packed block, + * position data is separated out as .pos, while payloads and offsets are encoded in .pay (payload + * metadata will also be stored directly in .pay). When encoded as VInt block, all these three are + * stored in .pos (so as payload metadata).
+ *With this strategy, the majority of payload and offset data will be outside .pos file. + * So for queries that require only position data, running on a full index with payloads and offsets, + * this reduces disk pre-fetches.
+ *+ * Files and detailed format: + *
The .tim file format is quite similar to Lucene40PostingsFormat, + * with minor difference in MetadataBlock
+ * + *Notes:
+ *The .tim file format is mentioned in + * + * Lucene40PostingsFormat:TermIndex + *
The .doc file contains the lists of documents which contain each term, along + * with the frequency of the term in that document (except when frequencies are + * omitted: {@link IndexOptions#DOCS_ONLY}). It also saves skip data to the beginning of + * each packed or VInt block, when the length of document list is larger than packed block size.
+ * + *Notes:
+ *The .pos file contains the lists of positions that each term occurs at within documents. It also + * sometimes stores part of payloads and offsets for speedup.
+ *Notes:
+ *The .pay file will store payload and offset associated with certain term-document positons. + * Some payloads and offsets will be seperated out into .pos file, for speedup reason.
+ *Notes:
+ *BLOCK_SIZE are garbage, it is necessary to allocate value buffers
+ * whose size is >= MAX_DATA_SIZE to avoid {@link ArrayIndexOutOfBoundsException}s.
+ */
+ static final int MAX_DATA_SIZE;
+ static {
+ int maxDataSize = 0;
+ for (PackedInts.Format format : PackedInts.Format.values()) {
+ for (int bpv = 1; bpv <= 32; ++bpv) {
+ if (!format.isSupported(bpv)) {
+ continue;
+ }
+ final PackedInts.Decoder decoder = PackedInts.getDecoder(format, PACKED_INTS_VERSION_START, bpv);
+ final int iterations = (int) Math.ceil((float) BLOCK_SIZE / decoder.valueCount());
+ maxDataSize = Math.max(maxDataSize, iterations * decoder.valueCount());
+ }
+ }
+ MAX_DATA_SIZE = maxDataSize;
+ }
+
+ /**
+ * Compute the number of iterations required to decode BLOCK_SIZE
+ * values with the provided {@link Decoder}.
+ */
+ private static int computeIterations(PackedInts.Decoder decoder) {
+ return (int) Math.ceil((float) BLOCK_SIZE / decoder.valueCount());
+ }
+
+ /**
+ * Compute the number of bytes required to encode a block of values that require
+ * bitsPerValue bits per value with format format.
+ */
+ private static int encodedSize(PackedInts.Format format, int bitsPerValue) {
+ return format.nblocks(bitsPerValue, BLOCK_SIZE) << 3;
+ }
+
+ private final int[] encodedSizes;
+ private final PackedInts.Encoder[] encoders;
+ private final PackedInts.Decoder[] decoders;
+ private final int[] iterations;
+
+ /**
+ * Create a new {@link ForUtil} instance and save state into out.
+ */
+ ForUtil(float acceptableOverheadRatio, DataOutput out) throws IOException {
+ out.writeVInt(PACKED_INTS_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) {
+ final FormatAndBits formatAndBits = PackedInts.fastestFormatAndBits(
+ BLOCK_SIZE, bpv, acceptableOverheadRatio);
+ assert formatAndBits.format.isSupported(formatAndBits.bitsPerValue);
+ assert formatAndBits.bitsPerValue <= 32;
+ encodedSizes[bpv] = encodedSize(formatAndBits.format, formatAndBits.bitsPerValue);
+ encoders[bpv] = PackedInts.getEncoder(
+ formatAndBits.format, PACKED_INTS_VERSION_CURRENT, formatAndBits.bitsPerValue);
+ decoders[bpv] = PackedInts.getDecoder(
+ formatAndBits.format, PACKED_INTS_VERSION_CURRENT, formatAndBits.bitsPerValue);
+ iterations[bpv] = computeIterations(decoders[bpv]);
+
+ out.writeVInt(formatAndBits.format.getId() << 5 | (formatAndBits.bitsPerValue - 1));
+ }
+ }
+
+ /**
+ * Restore a {@link ForUtil} from a {@link DataInput}.
+ */
+ ForUtil(DataInput in) throws IOException {
+ int packedIntsVersion = in.readVInt();
+ if (packedIntsVersion != PACKED_INTS_VERSION_START) {
+ throw new CorruptIndexException("expected version=" + PACKED_INTS_VERSION_START + " but got version=" + 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) {
+ final int code = in.readVInt();
+ final int formatId = code >>> 5;
+ final int bitsPerValue = (code & 31) + 1;
+
+ final PackedInts.Format format = PackedInts.Format.byId(formatId);
+ assert format.isSupported(bitsPerValue);
+ encodedSizes[bpv] = encodedSize(format, bitsPerValue);
+ encoders[bpv] = PackedInts.getEncoder(
+ format, packedIntsVersion, bitsPerValue);
+ decoders[bpv] = PackedInts.getDecoder(
+ format, packedIntsVersion, bitsPerValue);
+ iterations[bpv] = computeIterations(decoders[bpv]);
+ }
+ }
+
+ /**
+ * Write a block of data (For format).
+ *
+ * @param data the data to write
+ * @param encoded a buffer to use to encode data
+ * @param out the destination output
+ * @throws IOException
+ */
+ void writeBlock(int[] data, byte[] encoded, IndexOutput out) throws IOException {
+ if (isAllEqual(data)) {
+ out.writeVInt(ALL_VALUES_EQUAL);
+ out.writeVInt(data[0]);
+ return;
+ }
+
+ final int numBits = bitsRequired(data);
+ assert numBits > 0 && numBits <= 32 : numBits;
+ final PackedInts.Encoder encoder = encoders[numBits];
+ final int iters = iterations[numBits];
+ assert iters * encoder.valueCount() >= BLOCK_SIZE;
+ final int encodedSize = encodedSizes[numBits];
+ assert (iters * encoder.blockCount()) << 3 >= encodedSize;
+
+ out.writeVInt(numBits);
+
+ encoder.encode(data, 0, encoded, 0, iters);
+ out.writeBytes(encoded, encodedSize);
+ }
+
+ /**
+ * Read the next block of data (For format).
+ *
+ * @param in the input to use to read data
+ * @param encoded a buffer that can be used to store encoded data
+ * @param decoded where to write decoded data
+ * @throws IOException
+ */
+ void readBlock(IndexInput in, byte[] encoded, int[] decoded) throws IOException {
+ final int numBits = in.readVInt();
+ assert numBits <= 32 : numBits;
+
+ if (numBits == ALL_VALUES_EQUAL) {
+ final int value = in.readVInt();
+ Arrays.fill(decoded, 0, BLOCK_SIZE, value);
+ return;
+ }
+
+ final int encodedSize = encodedSizes[numBits];
+ in.readBytes(encoded, 0, encodedSize);
+
+ final PackedInts.Decoder decoder = decoders[numBits];
+ final int iters = iterations[numBits];
+ assert iters * decoder.valueCount() >= BLOCK_SIZE;
+
+ decoder.decode(encoded, 0, decoded, 0, iters);
+ }
+
+ /**
+ * Skip the next block of data.
+ *
+ * @param in the input where to read data
+ * @throws IOException
+ */
+ void skipBlock(IndexInput in) throws IOException {
+ final int numBits = in.readVInt();
+ if (numBits == ALL_VALUES_EQUAL) {
+ in.readVInt();
+ return;
+ }
+ assert numBits > 0 && numBits <= 32 : numBits;
+ final int encodedSize = encodedSizes[numBits];
+ in.seek(in.getFilePointer() + encodedSize);
+ }
+
+ private static boolean isAllEqual(final int[] data) {
+ final long v = data[0];
+ for (int i = 1; i < BLOCK_SIZE; ++i) {
+ if (data[i] != v) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compute the number of bits required to serialize any of the longs in
+ * data.
+ */
+ private static int bitsRequired(final int[] data) {
+ long or = 0;
+ for (int i = 0; i < BLOCK_SIZE; ++i) {
+ assert data[i] >= 0;
+ or |= data[i];
+ }
+ return PackedInts.bitsRequired(or);
+ }
+
+}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsWriter.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsWriter.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsWriter.java 2012-07-25 06:36:35.104431667 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsWriter.java 2012-07-29 17:49:13.350855048 -0400
@@ -724,7 +724,7 @@
// Write term stats, to separate byte[] blob:
bytesWriter2.writeVInt(term.stats.docFreq);
if (fieldInfo.getIndexOptions() != IndexOptions.DOCS_ONLY) {
- assert term.stats.totalTermFreq >= term.stats.docFreq;
+ assert term.stats.totalTermFreq >= term.stats.docFreq: term.stats.totalTermFreq + " vs " + term.stats.docFreq;
bytesWriter2.writeVLong(term.stats.totalTermFreq - term.stats.docFreq);
}
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/intblock/FixedIntBlockIndexInput.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/intblock/FixedIntBlockIndexInput.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/intblock/FixedIntBlockIndexInput.java 2012-07-03 20:31:53.940428101 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/intblock/FixedIntBlockIndexInput.java 2012-07-19 11:38:21.803610003 -0400
@@ -77,50 +77,42 @@
private static class Reader extends IntIndexInput.Reader {
private final IndexInput in;
+ private final BlockReader blockReader;
+ private final int blockSize;
+ private final int[] pending;
- protected final int[] pending;
- int upto;
-
+ private int upto;
private boolean seekPending;
private long pendingFP;
- private int pendingUpto;
- private long lastBlockFP;
- private final BlockReader blockReader;
- private final int blockSize;
- private final IntsRef bulkResult = new IntsRef();
+ private long lastBlockFP = -1;
public Reader(final IndexInput in, final int[] pending, final BlockReader blockReader) {
this.in = in;
this.pending = pending;
this.blockSize = pending.length;
- bulkResult.ints = pending;
this.blockReader = blockReader;
upto = blockSize;
}
void seek(final long fp, final int upto) {
+ assert upto < blockSize;
+ if (seekPending || fp != lastBlockFP) {
pendingFP = fp;
- pendingUpto = upto;
seekPending = true;
}
+ this.upto = upto;
+ }
- private void maybeSeek() throws IOException {
+ @Override
+ public int next() throws IOException {
if (seekPending) {
- if (pendingFP != lastBlockFP) {
- // need new block
+ // Seek & load new block
in.seek(pendingFP);
lastBlockFP = pendingFP;
blockReader.readBlock();
- }
- upto = pendingUpto;
seekPending = false;
- }
- }
-
- @Override
- public int next() throws IOException {
- this.maybeSeek();
- if (upto == blockSize) {
+ } else if (upto == blockSize) {
+ // Load new block
lastBlockFP = in.getFilePointer();
blockReader.readBlock();
upto = 0;
@@ -125,28 +117,8 @@
blockReader.readBlock();
upto = 0;
}
-
return pending[upto++];
}
-
- @Override
- public IntsRef read(final int count) throws IOException {
- this.maybeSeek();
- if (upto == blockSize) {
- blockReader.readBlock();
- upto = 0;
- }
- bulkResult.offset = upto;
- if (upto + count < blockSize) {
- bulkResult.length = count;
- upto += count;
- } else {
- bulkResult.length = blockSize - upto;
- upto = blockSize;
- }
-
- return bulkResult;
- }
}
private class Index extends IntIndexInput.Index {
@@ -178,7 +150,7 @@
}
@Override
- public void set(final IntIndexInput.Index other) {
+ public void copyFrom(final IntIndexInput.Index other) {
final Index idx = (Index) other;
fp = idx.fp;
upto = idx.upto;
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/intblock/VariableIntBlockIndexInput.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/intblock/VariableIntBlockIndexInput.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/intblock/VariableIntBlockIndexInput.java 2012-07-03 20:31:53.940428101 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/intblock/VariableIntBlockIndexInput.java 2012-07-19 10:30:32.427672688 -0400
@@ -90,12 +90,10 @@
private long lastBlockFP;
private int blockSize;
private final BlockReader blockReader;
- private final IntsRef bulkResult = new IntsRef();
public Reader(final IndexInput in, final int[] pending, final BlockReader blockReader) {
this.in = in;
this.pending = pending;
- bulkResult.ints = pending;
this.blockReader = blockReader;
}
@@ -146,26 +144,6 @@
return pending[upto++];
}
-
- @Override
- public IntsRef read(final int count) throws IOException {
- this.maybeSeek();
- if (upto == blockSize) {
- lastBlockFP = in.getFilePointer();
- blockSize = blockReader.readBlock();
- upto = 0;
- }
- bulkResult.offset = upto;
- if (upto + count < blockSize) {
- bulkResult.length = count;
- upto += count;
- } else {
- bulkResult.length = blockSize - upto;
- upto = blockSize;
- }
-
- return bulkResult;
- }
}
private class Index extends IntIndexInput.Index {
@@ -204,7 +182,7 @@
}
@Override
- public void set(final IntIndexInput.Index other) {
+ public void copyFrom(final IntIndexInput.Index other) {
final Index idx = (Index) other;
fp = idx.fp;
upto = idx.upto;
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsFormat.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsFormat.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsFormat.java 2012-06-22 14:43:39.039403304 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsFormat.java 2012-08-18 08:29:38.373841311 -0400
@@ -159,7 +159,7 @@
* with the frequency of the term in that document (except when frequencies are
* omitted: {@link IndexOptions#DOCS_ONLY}).
* + * * Example for skipInterval = 3: * c (skip level 2) * c c c (skip level 1) @@ -45,6 +47,7 @@ * * While this class takes care of writing the different skip levels, * subclasses must define the actual format of the skip data. + ** @lucene.experimental */ @@ -55,14 +58,22 @@ // the skip interval in the list with level = 0 private int skipInterval; + // skipInterval used for level > 0 + private int skipMultiplier; + // for every skip level a different buffer is used private RAMOutputStream[] skipBuffer; - protected MultiLevelSkipListWriter(int skipInterval, int maxSkipLevels, int df) { + protected MultiLevelSkipListWriter(int skipInterval, int skipMultiplier, int maxSkipLevels, int df) { this.skipInterval = skipInterval; + this.skipMultiplier = skipMultiplier; // calculate the maximum number of skip levels for this document frequency - numberOfSkipLevels = MathUtil.log(df, skipInterval); + if (df <= skipInterval) { + numberOfSkipLevels = 1; + } else { + numberOfSkipLevels = 1+MathUtil.log(df/skipInterval, skipMultiplier); + } // make sure it does not exceed maxSkipLevels if (numberOfSkipLevels > maxSkipLevels) { @@ -70,6 +81,11 @@ } } + // skipMultiplier and skipInterval are the same: + protected MultiLevelSkipListWriter(int skipInterval, int maxSkipLevels, int df) { + this(skipInterval, skipInterval, maxSkipLevels, df); + } + protected void init() { skipBuffer = new RAMOutputStream[numberOfSkipLevels]; for (int i = 0; i < numberOfSkipLevels; i++) { @@ -104,11 +120,15 @@ * @throws IOException */ public void bufferSkip(int df) throws IOException { - int numLevels; + + assert df % skipInterval == 0; + int numLevels = 1; + df /= skipInterval; // determine max level - for (numLevels = 0; (df % skipInterval) == 0 && numLevels < numberOfSkipLevels; df /= skipInterval) { + while ((df % skipMultiplier) == 0 && numLevels < numberOfSkipLevels) { numLevels++; + df /= skipMultiplier; } long childPointer = 0; diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/sep/IntIndexInput.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/sep/IntIndexInput.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/sep/IntIndexInput.java 2012-08-16 15:17:58.287287478 -0400 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/sep/IntIndexInput.java 2012-08-18 09:15:11.777814053 -0400 @@ -44,7 +44,7 @@ /** Seeks primary stream to the last read offset */ public abstract void seek(IntIndexInput.Reader stream) throws IOException; - public abstract void set(Index other); + public abstract void copyFrom(Index other); @Override public abstract Index clone(); @@ -55,23 +55,5 @@ /** Reads next single int */ public abstract int next() throws IOException; - - /** Reads next chunk of ints */ - private IntsRef bulkResult; - - /** Read up to count ints. */ - public IntsRef read(int count) throws IOException { - if (bulkResult == null) { - bulkResult = new IntsRef(); - bulkResult.ints = new int[count]; - } else { - bulkResult.grow(count); - } - for(int i=0;i
iterations*v values that are
- * contained in iterations*b blocks into a long[]
- * (higher values of iterations are likely to yield a better
- * throughput) => this requires n * (b + v) longs in memory.
- *
- * This method computes iterations as
- * ramBudget / (8 * (b + v)) (since a long is 8 bytes).
- */
- public final int computeIterations(int valueCount, int ramBudget) {
- final int iterations = (ramBudget >>> 3) / (blocks() + values());
- if (iterations == 0) {
- // at least 1
+ public int blockCount() {
return 1;
- } else if ((iterations - 1) * blocks() >= valueCount) {
- // don't allocate for more than the size of the reader
- return (int) Math.ceil((double) valueCount / values());
- } else {
- return iterations;
- }
- }
-
- /**
- * The minimum number of blocks required to perform a bulk get/set.
- */
- public abstract int blocks();
-
- /**
- * The number of values that can be stored in blocks() blocks.
- */
- public abstract int values();
-
- /**
- * Get n * values() values from n * blocks() blocks.
- */
- public abstract void get(long[] blocks, int blockIndex, long[] values, int valuesIndex, int iterations);
-
- /**
- * Set n * values() values into n * blocks() blocks.
- */
- public abstract void set(long[] blocks, int blockIndex, long[] values, int valuesIndex, int iterations);
-
- static {
- BULK_OPERATIONS.put(PackedInts.Format.PACKED, new BulkOperation[65]); BULK_OPERATIONS.get(PackedInts.Format.PACKED)[1] = new Packed64BulkOperation1();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[2] = new Packed64BulkOperation2();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[3] = new Packed64BulkOperation3();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[4] = new Packed64BulkOperation4();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[5] = new Packed64BulkOperation5();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[6] = new Packed64BulkOperation6();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[7] = new Packed64BulkOperation7();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[8] = new Packed64BulkOperation8();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[9] = new Packed64BulkOperation9();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[10] = new Packed64BulkOperation10();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[11] = new Packed64BulkOperation11();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[12] = new Packed64BulkOperation12();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[13] = new Packed64BulkOperation13();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[14] = new Packed64BulkOperation14();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[15] = new Packed64BulkOperation15();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[16] = new Packed64BulkOperation16();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[17] = new Packed64BulkOperation17();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[18] = new Packed64BulkOperation18();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[19] = new Packed64BulkOperation19();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[20] = new Packed64BulkOperation20();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[21] = new Packed64BulkOperation21();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[22] = new Packed64BulkOperation22();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[23] = new Packed64BulkOperation23();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[24] = new Packed64BulkOperation24();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[25] = new Packed64BulkOperation25();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[26] = new Packed64BulkOperation26();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[27] = new Packed64BulkOperation27();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[28] = new Packed64BulkOperation28();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[29] = new Packed64BulkOperation29();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[30] = new Packed64BulkOperation30();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[31] = new Packed64BulkOperation31();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[32] = new Packed64BulkOperation32();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[33] = new Packed64BulkOperation33();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[34] = new Packed64BulkOperation34();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[35] = new Packed64BulkOperation35();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[36] = new Packed64BulkOperation36();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[37] = new Packed64BulkOperation37();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[38] = new Packed64BulkOperation38();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[39] = new Packed64BulkOperation39();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[40] = new Packed64BulkOperation40();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[41] = new Packed64BulkOperation41();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[42] = new Packed64BulkOperation42();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[43] = new Packed64BulkOperation43();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[44] = new Packed64BulkOperation44();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[45] = new Packed64BulkOperation45();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[46] = new Packed64BulkOperation46();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[47] = new Packed64BulkOperation47();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[48] = new Packed64BulkOperation48();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[49] = new Packed64BulkOperation49();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[50] = new Packed64BulkOperation50();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[51] = new Packed64BulkOperation51();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[52] = new Packed64BulkOperation52();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[53] = new Packed64BulkOperation53();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[54] = new Packed64BulkOperation54();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[55] = new Packed64BulkOperation55();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[56] = new Packed64BulkOperation56();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[57] = new Packed64BulkOperation57();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[58] = new Packed64BulkOperation58();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[59] = new Packed64BulkOperation59();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[60] = new Packed64BulkOperation60();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[61] = new Packed64BulkOperation61();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[62] = new Packed64BulkOperation62();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[63] = new Packed64BulkOperation63();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED)[64] = new Packed64BulkOperation64();
- BULK_OPERATIONS.put(PackedInts.Format.PACKED_SINGLE_BLOCK, new BulkOperation[65]);
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[1] = new Packed64SingleBlockBulkOperation1();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[2] = new Packed64SingleBlockBulkOperation2();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[3] = new Packed64SingleBlockBulkOperation3();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[4] = new Packed64SingleBlockBulkOperation4();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[5] = new Packed64SingleBlockBulkOperation5();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[6] = new Packed64SingleBlockBulkOperation6();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[7] = new Packed64SingleBlockBulkOperation7();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[8] = new Packed64SingleBlockBulkOperation8();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[9] = new Packed64SingleBlockBulkOperation9();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[10] = new Packed64SingleBlockBulkOperation10();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[12] = new Packed64SingleBlockBulkOperation12();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[16] = new Packed64SingleBlockBulkOperation16();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[21] = new Packed64SingleBlockBulkOperation21();
- BULK_OPERATIONS.get(PackedInts.Format.PACKED_SINGLE_BLOCK)[32] = new Packed64SingleBlockBulkOperation32();
}
- static final class Packed64BulkOperation1 extends BulkOperation {
- public int blocks() {
- return 1;
- }
-
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 63;
- values[vi++] = (block0 >>> 62) & 1L;
- values[vi++] = (block0 >>> 61) & 1L;
- values[vi++] = (block0 >>> 60) & 1L;
- values[vi++] = (block0 >>> 59) & 1L;
- values[vi++] = (block0 >>> 58) & 1L;
- values[vi++] = (block0 >>> 57) & 1L;
- values[vi++] = (block0 >>> 56) & 1L;
- values[vi++] = (block0 >>> 55) & 1L;
- values[vi++] = (block0 >>> 54) & 1L;
- values[vi++] = (block0 >>> 53) & 1L;
- values[vi++] = (block0 >>> 52) & 1L;
- values[vi++] = (block0 >>> 51) & 1L;
- values[vi++] = (block0 >>> 50) & 1L;
- values[vi++] = (block0 >>> 49) & 1L;
- values[vi++] = (block0 >>> 48) & 1L;
- values[vi++] = (block0 >>> 47) & 1L;
- values[vi++] = (block0 >>> 46) & 1L;
- values[vi++] = (block0 >>> 45) & 1L;
- values[vi++] = (block0 >>> 44) & 1L;
- values[vi++] = (block0 >>> 43) & 1L;
- values[vi++] = (block0 >>> 42) & 1L;
- values[vi++] = (block0 >>> 41) & 1L;
- values[vi++] = (block0 >>> 40) & 1L;
- values[vi++] = (block0 >>> 39) & 1L;
- values[vi++] = (block0 >>> 38) & 1L;
- values[vi++] = (block0 >>> 37) & 1L;
- values[vi++] = (block0 >>> 36) & 1L;
- values[vi++] = (block0 >>> 35) & 1L;
- values[vi++] = (block0 >>> 34) & 1L;
- values[vi++] = (block0 >>> 33) & 1L;
- values[vi++] = (block0 >>> 32) & 1L;
- values[vi++] = (block0 >>> 31) & 1L;
- values[vi++] = (block0 >>> 30) & 1L;
- values[vi++] = (block0 >>> 29) & 1L;
- values[vi++] = (block0 >>> 28) & 1L;
- values[vi++] = (block0 >>> 27) & 1L;
- values[vi++] = (block0 >>> 26) & 1L;
- values[vi++] = (block0 >>> 25) & 1L;
- values[vi++] = (block0 >>> 24) & 1L;
- values[vi++] = (block0 >>> 23) & 1L;
- values[vi++] = (block0 >>> 22) & 1L;
- values[vi++] = (block0 >>> 21) & 1L;
- values[vi++] = (block0 >>> 20) & 1L;
- values[vi++] = (block0 >>> 19) & 1L;
- values[vi++] = (block0 >>> 18) & 1L;
- values[vi++] = (block0 >>> 17) & 1L;
- values[vi++] = (block0 >>> 16) & 1L;
- values[vi++] = (block0 >>> 15) & 1L;
- values[vi++] = (block0 >>> 14) & 1L;
- values[vi++] = (block0 >>> 13) & 1L;
- values[vi++] = (block0 >>> 12) & 1L;
- values[vi++] = (block0 >>> 11) & 1L;
- values[vi++] = (block0 >>> 10) & 1L;
- values[vi++] = (block0 >>> 9) & 1L;
- values[vi++] = (block0 >>> 8) & 1L;
- values[vi++] = (block0 >>> 7) & 1L;
- values[vi++] = (block0 >>> 6) & 1L;
- values[vi++] = (block0 >>> 5) & 1L;
- values[vi++] = (block0 >>> 4) & 1L;
- values[vi++] = (block0 >>> 3) & 1L;
- values[vi++] = (block0 >>> 2) & 1L;
- values[vi++] = (block0 >>> 1) & 1L;
- values[vi++] = block0 & 1L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 62) | (values[vi++] << 61) | (values[vi++] << 60) | (values[vi++] << 59) | (values[vi++] << 58) | (values[vi++] << 57) | (values[vi++] << 56) | (values[vi++] << 55) | (values[vi++] << 54) | (values[vi++] << 53) | (values[vi++] << 52) | (values[vi++] << 51) | (values[vi++] << 50) | (values[vi++] << 49) | (values[vi++] << 48) | (values[vi++] << 47) | (values[vi++] << 46) | (values[vi++] << 45) | (values[vi++] << 44) | (values[vi++] << 43) | (values[vi++] << 42) | (values[vi++] << 41) | (values[vi++] << 40) | (values[vi++] << 39) | (values[vi++] << 38) | (values[vi++] << 37) | (values[vi++] << 36) | (values[vi++] << 35) | (values[vi++] << 34) | (values[vi++] << 33) | (values[vi++] << 32) | (values[vi++] << 31) | (values[vi++] << 30) | (values[vi++] << 29) | (values[vi++] << 28) | (values[vi++] << 27) | (values[vi++] << 26) | (values[vi++] << 25) | (values[vi++] << 24) | (values[vi++] << 23) | (values[vi++] << 22) | (values[vi++] << 21) | (values[vi++] << 20) | (values[vi++] << 19) | (values[vi++] << 18) | (values[vi++] << 17) | (values[vi++] << 16) | (values[vi++] << 15) | (values[vi++] << 14) | (values[vi++] << 13) | (values[vi++] << 12) | (values[vi++] << 11) | (values[vi++] << 10) | (values[vi++] << 9) | (values[vi++] << 8) | (values[vi++] << 7) | (values[vi++] << 6) | (values[vi++] << 5) | (values[vi++] << 4) | (values[vi++] << 3) | (values[vi++] << 2) | (values[vi++] << 1) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 63);
+ values[valuesOffset++] = (int) ((block0 >>> 62) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 61) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 60) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 59) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 58) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 57) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 56) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 55) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 54) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 53) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 52) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 51) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 50) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 49) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 48) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 47) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 46) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 45) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 44) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 43) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 42) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 41) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 39) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 38) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 37) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 36) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 35) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 33) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 32) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 31) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 30) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 29) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 27) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 26) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 25) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 23) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 21) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 20) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 19) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 18) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 17) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 15) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 14) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 13) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 12) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 11) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 9) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 7) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 6) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 5) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 3) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 2) & 1L);
+ values[valuesOffset++] = (int) ((block0 >>> 1) & 1L);
+ values[valuesOffset++] = (int) (block0 & 1L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 7;
+ values[valuesOffset++] = (byte0 >>> 6) & 1;
+ values[valuesOffset++] = (byte0 >>> 5) & 1;
+ values[valuesOffset++] = (byte0 >>> 4) & 1;
+ values[valuesOffset++] = (byte0 >>> 3) & 1;
+ values[valuesOffset++] = (byte0 >>> 2) & 1;
+ values[valuesOffset++] = (byte0 >>> 1) & 1;
+ values[valuesOffset++] = byte0 & 1;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 7;
+ values[valuesOffset++] = (byte1 >>> 6) & 1;
+ values[valuesOffset++] = (byte1 >>> 5) & 1;
+ values[valuesOffset++] = (byte1 >>> 4) & 1;
+ values[valuesOffset++] = (byte1 >>> 3) & 1;
+ values[valuesOffset++] = (byte1 >>> 2) & 1;
+ values[valuesOffset++] = (byte1 >>> 1) & 1;
+ values[valuesOffset++] = byte1 & 1;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 7;
+ values[valuesOffset++] = (byte2 >>> 6) & 1;
+ values[valuesOffset++] = (byte2 >>> 5) & 1;
+ values[valuesOffset++] = (byte2 >>> 4) & 1;
+ values[valuesOffset++] = (byte2 >>> 3) & 1;
+ values[valuesOffset++] = (byte2 >>> 2) & 1;
+ values[valuesOffset++] = (byte2 >>> 1) & 1;
+ values[valuesOffset++] = byte2 & 1;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 7;
+ values[valuesOffset++] = (byte3 >>> 6) & 1;
+ values[valuesOffset++] = (byte3 >>> 5) & 1;
+ values[valuesOffset++] = (byte3 >>> 4) & 1;
+ values[valuesOffset++] = (byte3 >>> 3) & 1;
+ values[valuesOffset++] = (byte3 >>> 2) & 1;
+ values[valuesOffset++] = (byte3 >>> 1) & 1;
+ values[valuesOffset++] = byte3 & 1;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 7;
+ values[valuesOffset++] = (byte4 >>> 6) & 1;
+ values[valuesOffset++] = (byte4 >>> 5) & 1;
+ values[valuesOffset++] = (byte4 >>> 4) & 1;
+ values[valuesOffset++] = (byte4 >>> 3) & 1;
+ values[valuesOffset++] = (byte4 >>> 2) & 1;
+ values[valuesOffset++] = (byte4 >>> 1) & 1;
+ values[valuesOffset++] = byte4 & 1;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 7;
+ values[valuesOffset++] = (byte5 >>> 6) & 1;
+ values[valuesOffset++] = (byte5 >>> 5) & 1;
+ values[valuesOffset++] = (byte5 >>> 4) & 1;
+ values[valuesOffset++] = (byte5 >>> 3) & 1;
+ values[valuesOffset++] = (byte5 >>> 2) & 1;
+ values[valuesOffset++] = (byte5 >>> 1) & 1;
+ values[valuesOffset++] = byte5 & 1;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 7;
+ values[valuesOffset++] = (byte6 >>> 6) & 1;
+ values[valuesOffset++] = (byte6 >>> 5) & 1;
+ values[valuesOffset++] = (byte6 >>> 4) & 1;
+ values[valuesOffset++] = (byte6 >>> 3) & 1;
+ values[valuesOffset++] = (byte6 >>> 2) & 1;
+ values[valuesOffset++] = (byte6 >>> 1) & 1;
+ values[valuesOffset++] = byte6 & 1;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 7;
+ values[valuesOffset++] = (byte7 >>> 6) & 1;
+ values[valuesOffset++] = (byte7 >>> 5) & 1;
+ values[valuesOffset++] = (byte7 >>> 4) & 1;
+ values[valuesOffset++] = (byte7 >>> 3) & 1;
+ values[valuesOffset++] = (byte7 >>> 2) & 1;
+ values[valuesOffset++] = (byte7 >>> 1) & 1;
+ values[valuesOffset++] = byte7 & 1;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 63;
+ values[valuesOffset++] = (block0 >>> 62) & 1L;
+ values[valuesOffset++] = (block0 >>> 61) & 1L;
+ values[valuesOffset++] = (block0 >>> 60) & 1L;
+ values[valuesOffset++] = (block0 >>> 59) & 1L;
+ values[valuesOffset++] = (block0 >>> 58) & 1L;
+ values[valuesOffset++] = (block0 >>> 57) & 1L;
+ values[valuesOffset++] = (block0 >>> 56) & 1L;
+ values[valuesOffset++] = (block0 >>> 55) & 1L;
+ values[valuesOffset++] = (block0 >>> 54) & 1L;
+ values[valuesOffset++] = (block0 >>> 53) & 1L;
+ values[valuesOffset++] = (block0 >>> 52) & 1L;
+ values[valuesOffset++] = (block0 >>> 51) & 1L;
+ values[valuesOffset++] = (block0 >>> 50) & 1L;
+ values[valuesOffset++] = (block0 >>> 49) & 1L;
+ values[valuesOffset++] = (block0 >>> 48) & 1L;
+ values[valuesOffset++] = (block0 >>> 47) & 1L;
+ values[valuesOffset++] = (block0 >>> 46) & 1L;
+ values[valuesOffset++] = (block0 >>> 45) & 1L;
+ values[valuesOffset++] = (block0 >>> 44) & 1L;
+ values[valuesOffset++] = (block0 >>> 43) & 1L;
+ values[valuesOffset++] = (block0 >>> 42) & 1L;
+ values[valuesOffset++] = (block0 >>> 41) & 1L;
+ values[valuesOffset++] = (block0 >>> 40) & 1L;
+ values[valuesOffset++] = (block0 >>> 39) & 1L;
+ values[valuesOffset++] = (block0 >>> 38) & 1L;
+ values[valuesOffset++] = (block0 >>> 37) & 1L;
+ values[valuesOffset++] = (block0 >>> 36) & 1L;
+ values[valuesOffset++] = (block0 >>> 35) & 1L;
+ values[valuesOffset++] = (block0 >>> 34) & 1L;
+ values[valuesOffset++] = (block0 >>> 33) & 1L;
+ values[valuesOffset++] = (block0 >>> 32) & 1L;
+ values[valuesOffset++] = (block0 >>> 31) & 1L;
+ values[valuesOffset++] = (block0 >>> 30) & 1L;
+ values[valuesOffset++] = (block0 >>> 29) & 1L;
+ values[valuesOffset++] = (block0 >>> 28) & 1L;
+ values[valuesOffset++] = (block0 >>> 27) & 1L;
+ values[valuesOffset++] = (block0 >>> 26) & 1L;
+ values[valuesOffset++] = (block0 >>> 25) & 1L;
+ values[valuesOffset++] = (block0 >>> 24) & 1L;
+ values[valuesOffset++] = (block0 >>> 23) & 1L;
+ values[valuesOffset++] = (block0 >>> 22) & 1L;
+ values[valuesOffset++] = (block0 >>> 21) & 1L;
+ values[valuesOffset++] = (block0 >>> 20) & 1L;
+ values[valuesOffset++] = (block0 >>> 19) & 1L;
+ values[valuesOffset++] = (block0 >>> 18) & 1L;
+ values[valuesOffset++] = (block0 >>> 17) & 1L;
+ values[valuesOffset++] = (block0 >>> 16) & 1L;
+ values[valuesOffset++] = (block0 >>> 15) & 1L;
+ values[valuesOffset++] = (block0 >>> 14) & 1L;
+ values[valuesOffset++] = (block0 >>> 13) & 1L;
+ values[valuesOffset++] = (block0 >>> 12) & 1L;
+ values[valuesOffset++] = (block0 >>> 11) & 1L;
+ values[valuesOffset++] = (block0 >>> 10) & 1L;
+ values[valuesOffset++] = (block0 >>> 9) & 1L;
+ values[valuesOffset++] = (block0 >>> 8) & 1L;
+ values[valuesOffset++] = (block0 >>> 7) & 1L;
+ values[valuesOffset++] = (block0 >>> 6) & 1L;
+ values[valuesOffset++] = (block0 >>> 5) & 1L;
+ values[valuesOffset++] = (block0 >>> 4) & 1L;
+ values[valuesOffset++] = (block0 >>> 3) & 1L;
+ values[valuesOffset++] = (block0 >>> 2) & 1L;
+ values[valuesOffset++] = (block0 >>> 1) & 1L;
+ values[valuesOffset++] = block0 & 1L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 7;
+ values[valuesOffset++] = (byte0 >>> 6) & 1;
+ values[valuesOffset++] = (byte0 >>> 5) & 1;
+ values[valuesOffset++] = (byte0 >>> 4) & 1;
+ values[valuesOffset++] = (byte0 >>> 3) & 1;
+ values[valuesOffset++] = (byte0 >>> 2) & 1;
+ values[valuesOffset++] = (byte0 >>> 1) & 1;
+ values[valuesOffset++] = byte0 & 1;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 7;
+ values[valuesOffset++] = (byte1 >>> 6) & 1;
+ values[valuesOffset++] = (byte1 >>> 5) & 1;
+ values[valuesOffset++] = (byte1 >>> 4) & 1;
+ values[valuesOffset++] = (byte1 >>> 3) & 1;
+ values[valuesOffset++] = (byte1 >>> 2) & 1;
+ values[valuesOffset++] = (byte1 >>> 1) & 1;
+ values[valuesOffset++] = byte1 & 1;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 7;
+ values[valuesOffset++] = (byte2 >>> 6) & 1;
+ values[valuesOffset++] = (byte2 >>> 5) & 1;
+ values[valuesOffset++] = (byte2 >>> 4) & 1;
+ values[valuesOffset++] = (byte2 >>> 3) & 1;
+ values[valuesOffset++] = (byte2 >>> 2) & 1;
+ values[valuesOffset++] = (byte2 >>> 1) & 1;
+ values[valuesOffset++] = byte2 & 1;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 7;
+ values[valuesOffset++] = (byte3 >>> 6) & 1;
+ values[valuesOffset++] = (byte3 >>> 5) & 1;
+ values[valuesOffset++] = (byte3 >>> 4) & 1;
+ values[valuesOffset++] = (byte3 >>> 3) & 1;
+ values[valuesOffset++] = (byte3 >>> 2) & 1;
+ values[valuesOffset++] = (byte3 >>> 1) & 1;
+ values[valuesOffset++] = byte3 & 1;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 7;
+ values[valuesOffset++] = (byte4 >>> 6) & 1;
+ values[valuesOffset++] = (byte4 >>> 5) & 1;
+ values[valuesOffset++] = (byte4 >>> 4) & 1;
+ values[valuesOffset++] = (byte4 >>> 3) & 1;
+ values[valuesOffset++] = (byte4 >>> 2) & 1;
+ values[valuesOffset++] = (byte4 >>> 1) & 1;
+ values[valuesOffset++] = byte4 & 1;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 7;
+ values[valuesOffset++] = (byte5 >>> 6) & 1;
+ values[valuesOffset++] = (byte5 >>> 5) & 1;
+ values[valuesOffset++] = (byte5 >>> 4) & 1;
+ values[valuesOffset++] = (byte5 >>> 3) & 1;
+ values[valuesOffset++] = (byte5 >>> 2) & 1;
+ values[valuesOffset++] = (byte5 >>> 1) & 1;
+ values[valuesOffset++] = byte5 & 1;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 7;
+ values[valuesOffset++] = (byte6 >>> 6) & 1;
+ values[valuesOffset++] = (byte6 >>> 5) & 1;
+ values[valuesOffset++] = (byte6 >>> 4) & 1;
+ values[valuesOffset++] = (byte6 >>> 3) & 1;
+ values[valuesOffset++] = (byte6 >>> 2) & 1;
+ values[valuesOffset++] = (byte6 >>> 1) & 1;
+ values[valuesOffset++] = byte6 & 1;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 7;
+ values[valuesOffset++] = (byte7 >>> 6) & 1;
+ values[valuesOffset++] = (byte7 >>> 5) & 1;
+ values[valuesOffset++] = (byte7 >>> 4) & 1;
+ values[valuesOffset++] = (byte7 >>> 3) & 1;
+ values[valuesOffset++] = (byte7 >>> 2) & 1;
+ values[valuesOffset++] = (byte7 >>> 1) & 1;
+ values[valuesOffset++] = byte7 & 1;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset++] & 0xffffffffL) << 1) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 62) | (values[valuesOffset++] << 61) | (values[valuesOffset++] << 60) | (values[valuesOffset++] << 59) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 57) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 55) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 7) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 5) | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 3) | (values[valuesOffset++] << 2) | (values[valuesOffset++] << 1) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation2 extends BulkOperation {
+ }
+ ,
+ PACKED_2 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 62;
- values[vi++] = (block0 >>> 60) & 3L;
- values[vi++] = (block0 >>> 58) & 3L;
- values[vi++] = (block0 >>> 56) & 3L;
- values[vi++] = (block0 >>> 54) & 3L;
- values[vi++] = (block0 >>> 52) & 3L;
- values[vi++] = (block0 >>> 50) & 3L;
- values[vi++] = (block0 >>> 48) & 3L;
- values[vi++] = (block0 >>> 46) & 3L;
- values[vi++] = (block0 >>> 44) & 3L;
- values[vi++] = (block0 >>> 42) & 3L;
- values[vi++] = (block0 >>> 40) & 3L;
- values[vi++] = (block0 >>> 38) & 3L;
- values[vi++] = (block0 >>> 36) & 3L;
- values[vi++] = (block0 >>> 34) & 3L;
- values[vi++] = (block0 >>> 32) & 3L;
- values[vi++] = (block0 >>> 30) & 3L;
- values[vi++] = (block0 >>> 28) & 3L;
- values[vi++] = (block0 >>> 26) & 3L;
- values[vi++] = (block0 >>> 24) & 3L;
- values[vi++] = (block0 >>> 22) & 3L;
- values[vi++] = (block0 >>> 20) & 3L;
- values[vi++] = (block0 >>> 18) & 3L;
- values[vi++] = (block0 >>> 16) & 3L;
- values[vi++] = (block0 >>> 14) & 3L;
- values[vi++] = (block0 >>> 12) & 3L;
- values[vi++] = (block0 >>> 10) & 3L;
- values[vi++] = (block0 >>> 8) & 3L;
- values[vi++] = (block0 >>> 6) & 3L;
- values[vi++] = (block0 >>> 4) & 3L;
- values[vi++] = (block0 >>> 2) & 3L;
- values[vi++] = block0 & 3L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 62);
+ values[valuesOffset++] = (int) ((block0 >>> 60) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 58) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 56) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 54) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 52) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 50) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 48) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 46) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 44) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 42) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 38) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 36) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 32) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 30) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 26) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 20) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 18) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 14) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 12) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 6) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 3L);
+ values[valuesOffset++] = (int) ((block0 >>> 2) & 3L);
+ values[valuesOffset++] = (int) (block0 & 3L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 6;
+ values[valuesOffset++] = (byte0 >>> 4) & 3;
+ values[valuesOffset++] = (byte0 >>> 2) & 3;
+ values[valuesOffset++] = byte0 & 3;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 6;
+ values[valuesOffset++] = (byte1 >>> 4) & 3;
+ values[valuesOffset++] = (byte1 >>> 2) & 3;
+ values[valuesOffset++] = byte1 & 3;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 6;
+ values[valuesOffset++] = (byte2 >>> 4) & 3;
+ values[valuesOffset++] = (byte2 >>> 2) & 3;
+ values[valuesOffset++] = byte2 & 3;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 6;
+ values[valuesOffset++] = (byte3 >>> 4) & 3;
+ values[valuesOffset++] = (byte3 >>> 2) & 3;
+ values[valuesOffset++] = byte3 & 3;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 6;
+ values[valuesOffset++] = (byte4 >>> 4) & 3;
+ values[valuesOffset++] = (byte4 >>> 2) & 3;
+ values[valuesOffset++] = byte4 & 3;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 6;
+ values[valuesOffset++] = (byte5 >>> 4) & 3;
+ values[valuesOffset++] = (byte5 >>> 2) & 3;
+ values[valuesOffset++] = byte5 & 3;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 6;
+ values[valuesOffset++] = (byte6 >>> 4) & 3;
+ values[valuesOffset++] = (byte6 >>> 2) & 3;
+ values[valuesOffset++] = byte6 & 3;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 6;
+ values[valuesOffset++] = (byte7 >>> 4) & 3;
+ values[valuesOffset++] = (byte7 >>> 2) & 3;
+ values[valuesOffset++] = byte7 & 3;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 62;
+ values[valuesOffset++] = (block0 >>> 60) & 3L;
+ values[valuesOffset++] = (block0 >>> 58) & 3L;
+ values[valuesOffset++] = (block0 >>> 56) & 3L;
+ values[valuesOffset++] = (block0 >>> 54) & 3L;
+ values[valuesOffset++] = (block0 >>> 52) & 3L;
+ values[valuesOffset++] = (block0 >>> 50) & 3L;
+ values[valuesOffset++] = (block0 >>> 48) & 3L;
+ values[valuesOffset++] = (block0 >>> 46) & 3L;
+ values[valuesOffset++] = (block0 >>> 44) & 3L;
+ values[valuesOffset++] = (block0 >>> 42) & 3L;
+ values[valuesOffset++] = (block0 >>> 40) & 3L;
+ values[valuesOffset++] = (block0 >>> 38) & 3L;
+ values[valuesOffset++] = (block0 >>> 36) & 3L;
+ values[valuesOffset++] = (block0 >>> 34) & 3L;
+ values[valuesOffset++] = (block0 >>> 32) & 3L;
+ values[valuesOffset++] = (block0 >>> 30) & 3L;
+ values[valuesOffset++] = (block0 >>> 28) & 3L;
+ values[valuesOffset++] = (block0 >>> 26) & 3L;
+ values[valuesOffset++] = (block0 >>> 24) & 3L;
+ values[valuesOffset++] = (block0 >>> 22) & 3L;
+ values[valuesOffset++] = (block0 >>> 20) & 3L;
+ values[valuesOffset++] = (block0 >>> 18) & 3L;
+ values[valuesOffset++] = (block0 >>> 16) & 3L;
+ values[valuesOffset++] = (block0 >>> 14) & 3L;
+ values[valuesOffset++] = (block0 >>> 12) & 3L;
+ values[valuesOffset++] = (block0 >>> 10) & 3L;
+ values[valuesOffset++] = (block0 >>> 8) & 3L;
+ values[valuesOffset++] = (block0 >>> 6) & 3L;
+ values[valuesOffset++] = (block0 >>> 4) & 3L;
+ values[valuesOffset++] = (block0 >>> 2) & 3L;
+ values[valuesOffset++] = block0 & 3L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 6;
+ values[valuesOffset++] = (byte0 >>> 4) & 3;
+ values[valuesOffset++] = (byte0 >>> 2) & 3;
+ values[valuesOffset++] = byte0 & 3;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 6;
+ values[valuesOffset++] = (byte1 >>> 4) & 3;
+ values[valuesOffset++] = (byte1 >>> 2) & 3;
+ values[valuesOffset++] = byte1 & 3;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 6;
+ values[valuesOffset++] = (byte2 >>> 4) & 3;
+ values[valuesOffset++] = (byte2 >>> 2) & 3;
+ values[valuesOffset++] = byte2 & 3;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 6;
+ values[valuesOffset++] = (byte3 >>> 4) & 3;
+ values[valuesOffset++] = (byte3 >>> 2) & 3;
+ values[valuesOffset++] = byte3 & 3;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 6;
+ values[valuesOffset++] = (byte4 >>> 4) & 3;
+ values[valuesOffset++] = (byte4 >>> 2) & 3;
+ values[valuesOffset++] = byte4 & 3;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 6;
+ values[valuesOffset++] = (byte5 >>> 4) & 3;
+ values[valuesOffset++] = (byte5 >>> 2) & 3;
+ values[valuesOffset++] = byte5 & 3;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 6;
+ values[valuesOffset++] = (byte6 >>> 4) & 3;
+ values[valuesOffset++] = (byte6 >>> 2) & 3;
+ values[valuesOffset++] = byte6 & 3;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 6;
+ values[valuesOffset++] = (byte7 >>> 4) & 3;
+ values[valuesOffset++] = (byte7 >>> 2) & 3;
+ values[valuesOffset++] = byte7 & 3;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 2) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 60) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 2) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 60) | (values[vi++] << 58) | (values[vi++] << 56) | (values[vi++] << 54) | (values[vi++] << 52) | (values[vi++] << 50) | (values[vi++] << 48) | (values[vi++] << 46) | (values[vi++] << 44) | (values[vi++] << 42) | (values[vi++] << 40) | (values[vi++] << 38) | (values[vi++] << 36) | (values[vi++] << 34) | (values[vi++] << 32) | (values[vi++] << 30) | (values[vi++] << 28) | (values[vi++] << 26) | (values[vi++] << 24) | (values[vi++] << 22) | (values[vi++] << 20) | (values[vi++] << 18) | (values[vi++] << 16) | (values[vi++] << 14) | (values[vi++] << 12) | (values[vi++] << 10) | (values[vi++] << 8) | (values[vi++] << 6) | (values[vi++] << 4) | (values[vi++] << 2) | values[vi++];
}
- }
- }
-
- static final class Packed64BulkOperation3 extends BulkOperation {
+ ,
+ PACKED_3 {
- public int blocks() {
+ public int blockCount() {
return 3;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 61;
- values[vi++] = (block0 >>> 58) & 7L;
- values[vi++] = (block0 >>> 55) & 7L;
- values[vi++] = (block0 >>> 52) & 7L;
- values[vi++] = (block0 >>> 49) & 7L;
- values[vi++] = (block0 >>> 46) & 7L;
- values[vi++] = (block0 >>> 43) & 7L;
- values[vi++] = (block0 >>> 40) & 7L;
- values[vi++] = (block0 >>> 37) & 7L;
- values[vi++] = (block0 >>> 34) & 7L;
- values[vi++] = (block0 >>> 31) & 7L;
- values[vi++] = (block0 >>> 28) & 7L;
- values[vi++] = (block0 >>> 25) & 7L;
- values[vi++] = (block0 >>> 22) & 7L;
- values[vi++] = (block0 >>> 19) & 7L;
- values[vi++] = (block0 >>> 16) & 7L;
- values[vi++] = (block0 >>> 13) & 7L;
- values[vi++] = (block0 >>> 10) & 7L;
- values[vi++] = (block0 >>> 7) & 7L;
- values[vi++] = (block0 >>> 4) & 7L;
- values[vi++] = (block0 >>> 1) & 7L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1L) << 2) | (block1 >>> 62);
- values[vi++] = (block1 >>> 59) & 7L;
- values[vi++] = (block1 >>> 56) & 7L;
- values[vi++] = (block1 >>> 53) & 7L;
- values[vi++] = (block1 >>> 50) & 7L;
- values[vi++] = (block1 >>> 47) & 7L;
- values[vi++] = (block1 >>> 44) & 7L;
- values[vi++] = (block1 >>> 41) & 7L;
- values[vi++] = (block1 >>> 38) & 7L;
- values[vi++] = (block1 >>> 35) & 7L;
- values[vi++] = (block1 >>> 32) & 7L;
- values[vi++] = (block1 >>> 29) & 7L;
- values[vi++] = (block1 >>> 26) & 7L;
- values[vi++] = (block1 >>> 23) & 7L;
- values[vi++] = (block1 >>> 20) & 7L;
- values[vi++] = (block1 >>> 17) & 7L;
- values[vi++] = (block1 >>> 14) & 7L;
- values[vi++] = (block1 >>> 11) & 7L;
- values[vi++] = (block1 >>> 8) & 7L;
- values[vi++] = (block1 >>> 5) & 7L;
- values[vi++] = (block1 >>> 2) & 7L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 1) | (block2 >>> 63);
- values[vi++] = (block2 >>> 60) & 7L;
- values[vi++] = (block2 >>> 57) & 7L;
- values[vi++] = (block2 >>> 54) & 7L;
- values[vi++] = (block2 >>> 51) & 7L;
- values[vi++] = (block2 >>> 48) & 7L;
- values[vi++] = (block2 >>> 45) & 7L;
- values[vi++] = (block2 >>> 42) & 7L;
- values[vi++] = (block2 >>> 39) & 7L;
- values[vi++] = (block2 >>> 36) & 7L;
- values[vi++] = (block2 >>> 33) & 7L;
- values[vi++] = (block2 >>> 30) & 7L;
- values[vi++] = (block2 >>> 27) & 7L;
- values[vi++] = (block2 >>> 24) & 7L;
- values[vi++] = (block2 >>> 21) & 7L;
- values[vi++] = (block2 >>> 18) & 7L;
- values[vi++] = (block2 >>> 15) & 7L;
- values[vi++] = (block2 >>> 12) & 7L;
- values[vi++] = (block2 >>> 9) & 7L;
- values[vi++] = (block2 >>> 6) & 7L;
- values[vi++] = (block2 >>> 3) & 7L;
- values[vi++] = block2 & 7L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 58) | (values[vi++] << 55) | (values[vi++] << 52) | (values[vi++] << 49) | (values[vi++] << 46) | (values[vi++] << 43) | (values[vi++] << 40) | (values[vi++] << 37) | (values[vi++] << 34) | (values[vi++] << 31) | (values[vi++] << 28) | (values[vi++] << 25) | (values[vi++] << 22) | (values[vi++] << 19) | (values[vi++] << 16) | (values[vi++] << 13) | (values[vi++] << 10) | (values[vi++] << 7) | (values[vi++] << 4) | (values[vi++] << 1) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 59) | (values[vi++] << 56) | (values[vi++] << 53) | (values[vi++] << 50) | (values[vi++] << 47) | (values[vi++] << 44) | (values[vi++] << 41) | (values[vi++] << 38) | (values[vi++] << 35) | (values[vi++] << 32) | (values[vi++] << 29) | (values[vi++] << 26) | (values[vi++] << 23) | (values[vi++] << 20) | (values[vi++] << 17) | (values[vi++] << 14) | (values[vi++] << 11) | (values[vi++] << 8) | (values[vi++] << 5) | (values[vi++] << 2) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 60) | (values[vi++] << 57) | (values[vi++] << 54) | (values[vi++] << 51) | (values[vi++] << 48) | (values[vi++] << 45) | (values[vi++] << 42) | (values[vi++] << 39) | (values[vi++] << 36) | (values[vi++] << 33) | (values[vi++] << 30) | (values[vi++] << 27) | (values[vi++] << 24) | (values[vi++] << 21) | (values[vi++] << 18) | (values[vi++] << 15) | (values[vi++] << 12) | (values[vi++] << 9) | (values[vi++] << 6) | (values[vi++] << 3) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 61);
+ values[valuesOffset++] = (int) ((block0 >>> 58) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 55) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 52) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 49) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 46) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 43) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 37) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 31) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 25) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 19) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 13) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 7) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 7L);
+ values[valuesOffset++] = (int) ((block0 >>> 1) & 7L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1L) << 2) | (block1 >>> 62));
+ values[valuesOffset++] = (int) ((block1 >>> 59) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 56) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 53) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 50) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 47) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 44) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 41) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 35) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 32) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 29) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 26) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 23) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 17) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 14) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 11) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 5) & 7L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 7L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 1) | (block2 >>> 63));
+ values[valuesOffset++] = (int) ((block2 >>> 60) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 57) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 54) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 51) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 48) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 45) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 42) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 39) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 36) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 33) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 30) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 27) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 21) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 18) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 15) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 9) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 6) & 7L);
+ values[valuesOffset++] = (int) ((block2 >>> 3) & 7L);
+ values[valuesOffset++] = (int) (block2 & 7L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 5;
+ values[valuesOffset++] = (byte0 >>> 2) & 7;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 3) << 1) | (byte1 >>> 7);
+ values[valuesOffset++] = (byte1 >>> 4) & 7;
+ values[valuesOffset++] = (byte1 >>> 1) & 7;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 2) | (byte2 >>> 6);
+ values[valuesOffset++] = (byte2 >>> 3) & 7;
+ values[valuesOffset++] = byte2 & 7;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 5;
+ values[valuesOffset++] = (byte3 >>> 2) & 7;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 1) | (byte4 >>> 7);
+ values[valuesOffset++] = (byte4 >>> 4) & 7;
+ values[valuesOffset++] = (byte4 >>> 1) & 7;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 1) << 2) | (byte5 >>> 6);
+ values[valuesOffset++] = (byte5 >>> 3) & 7;
+ values[valuesOffset++] = byte5 & 7;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 5;
+ values[valuesOffset++] = (byte6 >>> 2) & 7;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 1) | (byte7 >>> 7);
+ values[valuesOffset++] = (byte7 >>> 4) & 7;
+ values[valuesOffset++] = (byte7 >>> 1) & 7;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 2) | (byte8 >>> 6);
+ values[valuesOffset++] = (byte8 >>> 3) & 7;
+ values[valuesOffset++] = byte8 & 7;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte9 >>> 5;
+ values[valuesOffset++] = (byte9 >>> 2) & 7;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 1) | (byte10 >>> 7);
+ values[valuesOffset++] = (byte10 >>> 4) & 7;
+ values[valuesOffset++] = (byte10 >>> 1) & 7;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 1) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = (byte11 >>> 3) & 7;
+ values[valuesOffset++] = byte11 & 7;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte12 >>> 5;
+ values[valuesOffset++] = (byte12 >>> 2) & 7;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = (byte13 >>> 4) & 7;
+ values[valuesOffset++] = (byte13 >>> 1) & 7;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 1) << 2) | (byte14 >>> 6);
+ values[valuesOffset++] = (byte14 >>> 3) & 7;
+ values[valuesOffset++] = byte14 & 7;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 5;
+ values[valuesOffset++] = (byte15 >>> 2) & 7;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 1) | (byte16 >>> 7);
+ values[valuesOffset++] = (byte16 >>> 4) & 7;
+ values[valuesOffset++] = (byte16 >>> 1) & 7;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 2) | (byte17 >>> 6);
+ values[valuesOffset++] = (byte17 >>> 3) & 7;
+ values[valuesOffset++] = byte17 & 7;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte18 >>> 5;
+ values[valuesOffset++] = (byte18 >>> 2) & 7;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 1) | (byte19 >>> 7);
+ values[valuesOffset++] = (byte19 >>> 4) & 7;
+ values[valuesOffset++] = (byte19 >>> 1) & 7;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 1) << 2) | (byte20 >>> 6);
+ values[valuesOffset++] = (byte20 >>> 3) & 7;
+ values[valuesOffset++] = byte20 & 7;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 5;
+ values[valuesOffset++] = (byte21 >>> 2) & 7;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 1) | (byte22 >>> 7);
+ values[valuesOffset++] = (byte22 >>> 4) & 7;
+ values[valuesOffset++] = (byte22 >>> 1) & 7;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 1) << 2) | (byte23 >>> 6);
+ values[valuesOffset++] = (byte23 >>> 3) & 7;
+ values[valuesOffset++] = byte23 & 7;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 61;
+ values[valuesOffset++] = (block0 >>> 58) & 7L;
+ values[valuesOffset++] = (block0 >>> 55) & 7L;
+ values[valuesOffset++] = (block0 >>> 52) & 7L;
+ values[valuesOffset++] = (block0 >>> 49) & 7L;
+ values[valuesOffset++] = (block0 >>> 46) & 7L;
+ values[valuesOffset++] = (block0 >>> 43) & 7L;
+ values[valuesOffset++] = (block0 >>> 40) & 7L;
+ values[valuesOffset++] = (block0 >>> 37) & 7L;
+ values[valuesOffset++] = (block0 >>> 34) & 7L;
+ values[valuesOffset++] = (block0 >>> 31) & 7L;
+ values[valuesOffset++] = (block0 >>> 28) & 7L;
+ values[valuesOffset++] = (block0 >>> 25) & 7L;
+ values[valuesOffset++] = (block0 >>> 22) & 7L;
+ values[valuesOffset++] = (block0 >>> 19) & 7L;
+ values[valuesOffset++] = (block0 >>> 16) & 7L;
+ values[valuesOffset++] = (block0 >>> 13) & 7L;
+ values[valuesOffset++] = (block0 >>> 10) & 7L;
+ values[valuesOffset++] = (block0 >>> 7) & 7L;
+ values[valuesOffset++] = (block0 >>> 4) & 7L;
+ values[valuesOffset++] = (block0 >>> 1) & 7L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1L) << 2) | (block1 >>> 62);
+ values[valuesOffset++] = (block1 >>> 59) & 7L;
+ values[valuesOffset++] = (block1 >>> 56) & 7L;
+ values[valuesOffset++] = (block1 >>> 53) & 7L;
+ values[valuesOffset++] = (block1 >>> 50) & 7L;
+ values[valuesOffset++] = (block1 >>> 47) & 7L;
+ values[valuesOffset++] = (block1 >>> 44) & 7L;
+ values[valuesOffset++] = (block1 >>> 41) & 7L;
+ values[valuesOffset++] = (block1 >>> 38) & 7L;
+ values[valuesOffset++] = (block1 >>> 35) & 7L;
+ values[valuesOffset++] = (block1 >>> 32) & 7L;
+ values[valuesOffset++] = (block1 >>> 29) & 7L;
+ values[valuesOffset++] = (block1 >>> 26) & 7L;
+ values[valuesOffset++] = (block1 >>> 23) & 7L;
+ values[valuesOffset++] = (block1 >>> 20) & 7L;
+ values[valuesOffset++] = (block1 >>> 17) & 7L;
+ values[valuesOffset++] = (block1 >>> 14) & 7L;
+ values[valuesOffset++] = (block1 >>> 11) & 7L;
+ values[valuesOffset++] = (block1 >>> 8) & 7L;
+ values[valuesOffset++] = (block1 >>> 5) & 7L;
+ values[valuesOffset++] = (block1 >>> 2) & 7L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 1) | (block2 >>> 63);
+ values[valuesOffset++] = (block2 >>> 60) & 7L;
+ values[valuesOffset++] = (block2 >>> 57) & 7L;
+ values[valuesOffset++] = (block2 >>> 54) & 7L;
+ values[valuesOffset++] = (block2 >>> 51) & 7L;
+ values[valuesOffset++] = (block2 >>> 48) & 7L;
+ values[valuesOffset++] = (block2 >>> 45) & 7L;
+ values[valuesOffset++] = (block2 >>> 42) & 7L;
+ values[valuesOffset++] = (block2 >>> 39) & 7L;
+ values[valuesOffset++] = (block2 >>> 36) & 7L;
+ values[valuesOffset++] = (block2 >>> 33) & 7L;
+ values[valuesOffset++] = (block2 >>> 30) & 7L;
+ values[valuesOffset++] = (block2 >>> 27) & 7L;
+ values[valuesOffset++] = (block2 >>> 24) & 7L;
+ values[valuesOffset++] = (block2 >>> 21) & 7L;
+ values[valuesOffset++] = (block2 >>> 18) & 7L;
+ values[valuesOffset++] = (block2 >>> 15) & 7L;
+ values[valuesOffset++] = (block2 >>> 12) & 7L;
+ values[valuesOffset++] = (block2 >>> 9) & 7L;
+ values[valuesOffset++] = (block2 >>> 6) & 7L;
+ values[valuesOffset++] = (block2 >>> 3) & 7L;
+ values[valuesOffset++] = block2 & 7L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 5;
+ values[valuesOffset++] = (byte0 >>> 2) & 7;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 3) << 1) | (byte1 >>> 7);
+ values[valuesOffset++] = (byte1 >>> 4) & 7;
+ values[valuesOffset++] = (byte1 >>> 1) & 7;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 2) | (byte2 >>> 6);
+ values[valuesOffset++] = (byte2 >>> 3) & 7;
+ values[valuesOffset++] = byte2 & 7;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 5;
+ values[valuesOffset++] = (byte3 >>> 2) & 7;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 1) | (byte4 >>> 7);
+ values[valuesOffset++] = (byte4 >>> 4) & 7;
+ values[valuesOffset++] = (byte4 >>> 1) & 7;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 1) << 2) | (byte5 >>> 6);
+ values[valuesOffset++] = (byte5 >>> 3) & 7;
+ values[valuesOffset++] = byte5 & 7;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 5;
+ values[valuesOffset++] = (byte6 >>> 2) & 7;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 1) | (byte7 >>> 7);
+ values[valuesOffset++] = (byte7 >>> 4) & 7;
+ values[valuesOffset++] = (byte7 >>> 1) & 7;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 2) | (byte8 >>> 6);
+ values[valuesOffset++] = (byte8 >>> 3) & 7;
+ values[valuesOffset++] = byte8 & 7;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte9 >>> 5;
+ values[valuesOffset++] = (byte9 >>> 2) & 7;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 1) | (byte10 >>> 7);
+ values[valuesOffset++] = (byte10 >>> 4) & 7;
+ values[valuesOffset++] = (byte10 >>> 1) & 7;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 1) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = (byte11 >>> 3) & 7;
+ values[valuesOffset++] = byte11 & 7;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte12 >>> 5;
+ values[valuesOffset++] = (byte12 >>> 2) & 7;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = (byte13 >>> 4) & 7;
+ values[valuesOffset++] = (byte13 >>> 1) & 7;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 1) << 2) | (byte14 >>> 6);
+ values[valuesOffset++] = (byte14 >>> 3) & 7;
+ values[valuesOffset++] = byte14 & 7;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 5;
+ values[valuesOffset++] = (byte15 >>> 2) & 7;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 1) | (byte16 >>> 7);
+ values[valuesOffset++] = (byte16 >>> 4) & 7;
+ values[valuesOffset++] = (byte16 >>> 1) & 7;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 2) | (byte17 >>> 6);
+ values[valuesOffset++] = (byte17 >>> 3) & 7;
+ values[valuesOffset++] = byte17 & 7;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte18 >>> 5;
+ values[valuesOffset++] = (byte18 >>> 2) & 7;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 1) | (byte19 >>> 7);
+ values[valuesOffset++] = (byte19 >>> 4) & 7;
+ values[valuesOffset++] = (byte19 >>> 1) & 7;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 1) << 2) | (byte20 >>> 6);
+ values[valuesOffset++] = (byte20 >>> 3) & 7;
+ values[valuesOffset++] = byte20 & 7;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 5;
+ values[valuesOffset++] = (byte21 >>> 2) & 7;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 1) | (byte22 >>> 7);
+ values[valuesOffset++] = (byte22 >>> 4) & 7;
+ values[valuesOffset++] = (byte22 >>> 1) & 7;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 1) << 2) | (byte23 >>> 6);
+ values[valuesOffset++] = (byte23 >>> 3) & 7;
+ values[valuesOffset++] = byte23 & 7;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 3) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 55) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 7) | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 59) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 5) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 60) | (values[valuesOffset++] << 57) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 3) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation4 extends BulkOperation {
+ }
+ ,
+ PACKED_4 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 60;
- values[vi++] = (block0 >>> 56) & 15L;
- values[vi++] = (block0 >>> 52) & 15L;
- values[vi++] = (block0 >>> 48) & 15L;
- values[vi++] = (block0 >>> 44) & 15L;
- values[vi++] = (block0 >>> 40) & 15L;
- values[vi++] = (block0 >>> 36) & 15L;
- values[vi++] = (block0 >>> 32) & 15L;
- values[vi++] = (block0 >>> 28) & 15L;
- values[vi++] = (block0 >>> 24) & 15L;
- values[vi++] = (block0 >>> 20) & 15L;
- values[vi++] = (block0 >>> 16) & 15L;
- values[vi++] = (block0 >>> 12) & 15L;
- values[vi++] = (block0 >>> 8) & 15L;
- values[vi++] = (block0 >>> 4) & 15L;
- values[vi++] = block0 & 15L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 60);
+ values[valuesOffset++] = (int) ((block0 >>> 56) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 52) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 48) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 44) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 36) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 32) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 20) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 12) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 15L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 15L);
+ values[valuesOffset++] = (int) (block0 & 15L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 4;
+ values[valuesOffset++] = byte0 & 15;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 4;
+ values[valuesOffset++] = byte1 & 15;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 4;
+ values[valuesOffset++] = byte2 & 15;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 4;
+ values[valuesOffset++] = byte3 & 15;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 4;
+ values[valuesOffset++] = byte4 & 15;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 4;
+ values[valuesOffset++] = byte5 & 15;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 4;
+ values[valuesOffset++] = byte6 & 15;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 4;
+ values[valuesOffset++] = byte7 & 15;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 60;
+ values[valuesOffset++] = (block0 >>> 56) & 15L;
+ values[valuesOffset++] = (block0 >>> 52) & 15L;
+ values[valuesOffset++] = (block0 >>> 48) & 15L;
+ values[valuesOffset++] = (block0 >>> 44) & 15L;
+ values[valuesOffset++] = (block0 >>> 40) & 15L;
+ values[valuesOffset++] = (block0 >>> 36) & 15L;
+ values[valuesOffset++] = (block0 >>> 32) & 15L;
+ values[valuesOffset++] = (block0 >>> 28) & 15L;
+ values[valuesOffset++] = (block0 >>> 24) & 15L;
+ values[valuesOffset++] = (block0 >>> 20) & 15L;
+ values[valuesOffset++] = (block0 >>> 16) & 15L;
+ values[valuesOffset++] = (block0 >>> 12) & 15L;
+ values[valuesOffset++] = (block0 >>> 8) & 15L;
+ values[valuesOffset++] = (block0 >>> 4) & 15L;
+ values[valuesOffset++] = block0 & 15L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 4;
+ values[valuesOffset++] = byte0 & 15;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1 >>> 4;
+ values[valuesOffset++] = byte1 & 15;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2 >>> 4;
+ values[valuesOffset++] = byte2 & 15;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 4;
+ values[valuesOffset++] = byte3 & 15;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4 >>> 4;
+ values[valuesOffset++] = byte4 & 15;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 4;
+ values[valuesOffset++] = byte5 & 15;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 4;
+ values[valuesOffset++] = byte6 & 15;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 4;
+ values[valuesOffset++] = byte7 & 15;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 4) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 4) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 56) | (values[vi++] << 52) | (values[vi++] << 48) | (values[vi++] << 44) | (values[vi++] << 40) | (values[vi++] << 36) | (values[vi++] << 32) | (values[vi++] << 28) | (values[vi++] << 24) | (values[vi++] << 20) | (values[vi++] << 16) | (values[vi++] << 12) | (values[vi++] << 8) | (values[vi++] << 4) | values[vi++];
}
- }
- }
-
- static final class Packed64BulkOperation5 extends BulkOperation {
+ ,
+ PACKED_5 {
- public int blocks() {
+ public int blockCount() {
return 5;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 59;
- values[vi++] = (block0 >>> 54) & 31L;
- values[vi++] = (block0 >>> 49) & 31L;
- values[vi++] = (block0 >>> 44) & 31L;
- values[vi++] = (block0 >>> 39) & 31L;
- values[vi++] = (block0 >>> 34) & 31L;
- values[vi++] = (block0 >>> 29) & 31L;
- values[vi++] = (block0 >>> 24) & 31L;
- values[vi++] = (block0 >>> 19) & 31L;
- values[vi++] = (block0 >>> 14) & 31L;
- values[vi++] = (block0 >>> 9) & 31L;
- values[vi++] = (block0 >>> 4) & 31L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 1) | (block1 >>> 63);
- values[vi++] = (block1 >>> 58) & 31L;
- values[vi++] = (block1 >>> 53) & 31L;
- values[vi++] = (block1 >>> 48) & 31L;
- values[vi++] = (block1 >>> 43) & 31L;
- values[vi++] = (block1 >>> 38) & 31L;
- values[vi++] = (block1 >>> 33) & 31L;
- values[vi++] = (block1 >>> 28) & 31L;
- values[vi++] = (block1 >>> 23) & 31L;
- values[vi++] = (block1 >>> 18) & 31L;
- values[vi++] = (block1 >>> 13) & 31L;
- values[vi++] = (block1 >>> 8) & 31L;
- values[vi++] = (block1 >>> 3) & 31L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 7L) << 2) | (block2 >>> 62);
- values[vi++] = (block2 >>> 57) & 31L;
- values[vi++] = (block2 >>> 52) & 31L;
- values[vi++] = (block2 >>> 47) & 31L;
- values[vi++] = (block2 >>> 42) & 31L;
- values[vi++] = (block2 >>> 37) & 31L;
- values[vi++] = (block2 >>> 32) & 31L;
- values[vi++] = (block2 >>> 27) & 31L;
- values[vi++] = (block2 >>> 22) & 31L;
- values[vi++] = (block2 >>> 17) & 31L;
- values[vi++] = (block2 >>> 12) & 31L;
- values[vi++] = (block2 >>> 7) & 31L;
- values[vi++] = (block2 >>> 2) & 31L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 3L) << 3) | (block3 >>> 61);
- values[vi++] = (block3 >>> 56) & 31L;
- values[vi++] = (block3 >>> 51) & 31L;
- values[vi++] = (block3 >>> 46) & 31L;
- values[vi++] = (block3 >>> 41) & 31L;
- values[vi++] = (block3 >>> 36) & 31L;
- values[vi++] = (block3 >>> 31) & 31L;
- values[vi++] = (block3 >>> 26) & 31L;
- values[vi++] = (block3 >>> 21) & 31L;
- values[vi++] = (block3 >>> 16) & 31L;
- values[vi++] = (block3 >>> 11) & 31L;
- values[vi++] = (block3 >>> 6) & 31L;
- values[vi++] = (block3 >>> 1) & 31L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 55) & 31L;
- values[vi++] = (block4 >>> 50) & 31L;
- values[vi++] = (block4 >>> 45) & 31L;
- values[vi++] = (block4 >>> 40) & 31L;
- values[vi++] = (block4 >>> 35) & 31L;
- values[vi++] = (block4 >>> 30) & 31L;
- values[vi++] = (block4 >>> 25) & 31L;
- values[vi++] = (block4 >>> 20) & 31L;
- values[vi++] = (block4 >>> 15) & 31L;
- values[vi++] = (block4 >>> 10) & 31L;
- values[vi++] = (block4 >>> 5) & 31L;
- values[vi++] = block4 & 31L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 54) | (values[vi++] << 49) | (values[vi++] << 44) | (values[vi++] << 39) | (values[vi++] << 34) | (values[vi++] << 29) | (values[vi++] << 24) | (values[vi++] << 19) | (values[vi++] << 14) | (values[vi++] << 9) | (values[vi++] << 4) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 58) | (values[vi++] << 53) | (values[vi++] << 48) | (values[vi++] << 43) | (values[vi++] << 38) | (values[vi++] << 33) | (values[vi++] << 28) | (values[vi++] << 23) | (values[vi++] << 18) | (values[vi++] << 13) | (values[vi++] << 8) | (values[vi++] << 3) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 57) | (values[vi++] << 52) | (values[vi++] << 47) | (values[vi++] << 42) | (values[vi++] << 37) | (values[vi++] << 32) | (values[vi++] << 27) | (values[vi++] << 22) | (values[vi++] << 17) | (values[vi++] << 12) | (values[vi++] << 7) | (values[vi++] << 2) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 56) | (values[vi++] << 51) | (values[vi++] << 46) | (values[vi++] << 41) | (values[vi++] << 36) | (values[vi++] << 31) | (values[vi++] << 26) | (values[vi++] << 21) | (values[vi++] << 16) | (values[vi++] << 11) | (values[vi++] << 6) | (values[vi++] << 1) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 55) | (values[vi++] << 50) | (values[vi++] << 45) | (values[vi++] << 40) | (values[vi++] << 35) | (values[vi++] << 30) | (values[vi++] << 25) | (values[vi++] << 20) | (values[vi++] << 15) | (values[vi++] << 10) | (values[vi++] << 5) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 59);
+ values[valuesOffset++] = (int) ((block0 >>> 54) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 49) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 44) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 39) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 29) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 19) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 14) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 9) & 31L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 31L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 1) | (block1 >>> 63));
+ values[valuesOffset++] = (int) ((block1 >>> 58) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 53) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 48) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 43) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 33) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 28) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 23) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 18) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 13) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 31L);
+ values[valuesOffset++] = (int) ((block1 >>> 3) & 31L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 7L) << 2) | (block2 >>> 62));
+ values[valuesOffset++] = (int) ((block2 >>> 57) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 52) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 47) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 42) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 37) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 32) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 27) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 22) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 17) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 7) & 31L);
+ values[valuesOffset++] = (int) ((block2 >>> 2) & 31L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 3L) << 3) | (block3 >>> 61));
+ values[valuesOffset++] = (int) ((block3 >>> 56) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 51) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 46) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 41) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 36) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 31) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 26) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 21) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 16) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 11) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 6) & 31L);
+ values[valuesOffset++] = (int) ((block3 >>> 1) & 31L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 1L) << 4) | (block4 >>> 60));
+ values[valuesOffset++] = (int) ((block4 >>> 55) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 50) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 45) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 40) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 35) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 30) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 25) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 15) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 10) & 31L);
+ values[valuesOffset++] = (int) ((block4 >>> 5) & 31L);
+ values[valuesOffset++] = (int) (block4 & 31L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 3;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 7) << 2) | (byte1 >>> 6);
+ values[valuesOffset++] = (byte1 >>> 1) & 31;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 4) | (byte2 >>> 4);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 1) | (byte3 >>> 7);
+ values[valuesOffset++] = (byte3 >>> 2) & 31;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 3) | (byte4 >>> 5);
+ values[valuesOffset++] = byte4 & 31;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 3;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 2) | (byte6 >>> 6);
+ values[valuesOffset++] = (byte6 >>> 1) & 31;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 1) << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 1) | (byte8 >>> 7);
+ values[valuesOffset++] = (byte8 >>> 2) & 31;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 3) | (byte9 >>> 5);
+ values[valuesOffset++] = byte9 & 31;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte10 >>> 3;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 7) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = (byte11 >>> 1) & 31;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 1) << 4) | (byte12 >>> 4);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = (byte13 >>> 2) & 31;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 3) | (byte14 >>> 5);
+ values[valuesOffset++] = byte14 & 31;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 3;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 7) << 2) | (byte16 >>> 6);
+ values[valuesOffset++] = (byte16 >>> 1) & 31;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 1) | (byte18 >>> 7);
+ values[valuesOffset++] = (byte18 >>> 2) & 31;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 3) | (byte19 >>> 5);
+ values[valuesOffset++] = byte19 & 31;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte20 >>> 3;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 2) | (byte21 >>> 6);
+ values[valuesOffset++] = (byte21 >>> 1) & 31;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 1) | (byte23 >>> 7);
+ values[valuesOffset++] = (byte23 >>> 2) & 31;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 3) | (byte24 >>> 5);
+ values[valuesOffset++] = byte24 & 31;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte25 >>> 3;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 7) << 2) | (byte26 >>> 6);
+ values[valuesOffset++] = (byte26 >>> 1) & 31;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 1) << 4) | (byte27 >>> 4);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 1) | (byte28 >>> 7);
+ values[valuesOffset++] = (byte28 >>> 2) & 31;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 3) | (byte29 >>> 5);
+ values[valuesOffset++] = byte29 & 31;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte30 >>> 3;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 2) | (byte31 >>> 6);
+ values[valuesOffset++] = (byte31 >>> 1) & 31;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 4) | (byte32 >>> 4);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 1) | (byte33 >>> 7);
+ values[valuesOffset++] = (byte33 >>> 2) & 31;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 3) | (byte34 >>> 5);
+ values[valuesOffset++] = byte34 & 31;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte35 >>> 3;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 2) | (byte36 >>> 6);
+ values[valuesOffset++] = (byte36 >>> 1) & 31;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 1) << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 1) | (byte38 >>> 7);
+ values[valuesOffset++] = (byte38 >>> 2) & 31;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 3) | (byte39 >>> 5);
+ values[valuesOffset++] = byte39 & 31;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 59;
+ values[valuesOffset++] = (block0 >>> 54) & 31L;
+ values[valuesOffset++] = (block0 >>> 49) & 31L;
+ values[valuesOffset++] = (block0 >>> 44) & 31L;
+ values[valuesOffset++] = (block0 >>> 39) & 31L;
+ values[valuesOffset++] = (block0 >>> 34) & 31L;
+ values[valuesOffset++] = (block0 >>> 29) & 31L;
+ values[valuesOffset++] = (block0 >>> 24) & 31L;
+ values[valuesOffset++] = (block0 >>> 19) & 31L;
+ values[valuesOffset++] = (block0 >>> 14) & 31L;
+ values[valuesOffset++] = (block0 >>> 9) & 31L;
+ values[valuesOffset++] = (block0 >>> 4) & 31L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 1) | (block1 >>> 63);
+ values[valuesOffset++] = (block1 >>> 58) & 31L;
+ values[valuesOffset++] = (block1 >>> 53) & 31L;
+ values[valuesOffset++] = (block1 >>> 48) & 31L;
+ values[valuesOffset++] = (block1 >>> 43) & 31L;
+ values[valuesOffset++] = (block1 >>> 38) & 31L;
+ values[valuesOffset++] = (block1 >>> 33) & 31L;
+ values[valuesOffset++] = (block1 >>> 28) & 31L;
+ values[valuesOffset++] = (block1 >>> 23) & 31L;
+ values[valuesOffset++] = (block1 >>> 18) & 31L;
+ values[valuesOffset++] = (block1 >>> 13) & 31L;
+ values[valuesOffset++] = (block1 >>> 8) & 31L;
+ values[valuesOffset++] = (block1 >>> 3) & 31L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 7L) << 2) | (block2 >>> 62);
+ values[valuesOffset++] = (block2 >>> 57) & 31L;
+ values[valuesOffset++] = (block2 >>> 52) & 31L;
+ values[valuesOffset++] = (block2 >>> 47) & 31L;
+ values[valuesOffset++] = (block2 >>> 42) & 31L;
+ values[valuesOffset++] = (block2 >>> 37) & 31L;
+ values[valuesOffset++] = (block2 >>> 32) & 31L;
+ values[valuesOffset++] = (block2 >>> 27) & 31L;
+ values[valuesOffset++] = (block2 >>> 22) & 31L;
+ values[valuesOffset++] = (block2 >>> 17) & 31L;
+ values[valuesOffset++] = (block2 >>> 12) & 31L;
+ values[valuesOffset++] = (block2 >>> 7) & 31L;
+ values[valuesOffset++] = (block2 >>> 2) & 31L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 3L) << 3) | (block3 >>> 61);
+ values[valuesOffset++] = (block3 >>> 56) & 31L;
+ values[valuesOffset++] = (block3 >>> 51) & 31L;
+ values[valuesOffset++] = (block3 >>> 46) & 31L;
+ values[valuesOffset++] = (block3 >>> 41) & 31L;
+ values[valuesOffset++] = (block3 >>> 36) & 31L;
+ values[valuesOffset++] = (block3 >>> 31) & 31L;
+ values[valuesOffset++] = (block3 >>> 26) & 31L;
+ values[valuesOffset++] = (block3 >>> 21) & 31L;
+ values[valuesOffset++] = (block3 >>> 16) & 31L;
+ values[valuesOffset++] = (block3 >>> 11) & 31L;
+ values[valuesOffset++] = (block3 >>> 6) & 31L;
+ values[valuesOffset++] = (block3 >>> 1) & 31L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 55) & 31L;
+ values[valuesOffset++] = (block4 >>> 50) & 31L;
+ values[valuesOffset++] = (block4 >>> 45) & 31L;
+ values[valuesOffset++] = (block4 >>> 40) & 31L;
+ values[valuesOffset++] = (block4 >>> 35) & 31L;
+ values[valuesOffset++] = (block4 >>> 30) & 31L;
+ values[valuesOffset++] = (block4 >>> 25) & 31L;
+ values[valuesOffset++] = (block4 >>> 20) & 31L;
+ values[valuesOffset++] = (block4 >>> 15) & 31L;
+ values[valuesOffset++] = (block4 >>> 10) & 31L;
+ values[valuesOffset++] = (block4 >>> 5) & 31L;
+ values[valuesOffset++] = block4 & 31L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 3;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 7) << 2) | (byte1 >>> 6);
+ values[valuesOffset++] = (byte1 >>> 1) & 31;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 4) | (byte2 >>> 4);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 1) | (byte3 >>> 7);
+ values[valuesOffset++] = (byte3 >>> 2) & 31;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 3) | (byte4 >>> 5);
+ values[valuesOffset++] = byte4 & 31;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5 >>> 3;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 2) | (byte6 >>> 6);
+ values[valuesOffset++] = (byte6 >>> 1) & 31;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 1) << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 1) | (byte8 >>> 7);
+ values[valuesOffset++] = (byte8 >>> 2) & 31;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 3) | (byte9 >>> 5);
+ values[valuesOffset++] = byte9 & 31;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte10 >>> 3;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 7) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = (byte11 >>> 1) & 31;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 1) << 4) | (byte12 >>> 4);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = (byte13 >>> 2) & 31;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 3) | (byte14 >>> 5);
+ values[valuesOffset++] = byte14 & 31;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 3;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 7) << 2) | (byte16 >>> 6);
+ values[valuesOffset++] = (byte16 >>> 1) & 31;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 1) | (byte18 >>> 7);
+ values[valuesOffset++] = (byte18 >>> 2) & 31;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 3) | (byte19 >>> 5);
+ values[valuesOffset++] = byte19 & 31;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte20 >>> 3;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 2) | (byte21 >>> 6);
+ values[valuesOffset++] = (byte21 >>> 1) & 31;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 1) | (byte23 >>> 7);
+ values[valuesOffset++] = (byte23 >>> 2) & 31;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 3) | (byte24 >>> 5);
+ values[valuesOffset++] = byte24 & 31;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte25 >>> 3;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 7) << 2) | (byte26 >>> 6);
+ values[valuesOffset++] = (byte26 >>> 1) & 31;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 1) << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 1) | (byte28 >>> 7);
+ values[valuesOffset++] = (byte28 >>> 2) & 31;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 3) | (byte29 >>> 5);
+ values[valuesOffset++] = byte29 & 31;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte30 >>> 3;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 2) | (byte31 >>> 6);
+ values[valuesOffset++] = (byte31 >>> 1) & 31;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 1) | (byte33 >>> 7);
+ values[valuesOffset++] = (byte33 >>> 2) & 31;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 3) | (byte34 >>> 5);
+ values[valuesOffset++] = byte34 & 31;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte35 >>> 3;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 2) | (byte36 >>> 6);
+ values[valuesOffset++] = (byte36 >>> 1) & 31;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 1) << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 1) | (byte38 >>> 7);
+ values[valuesOffset++] = (byte38 >>> 2) & 31;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 3) | (byte39 >>> 5);
+ values[valuesOffset++] = byte39 & 31;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 5) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 57) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 7) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 55) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 5) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation6 extends BulkOperation {
+ }
+ ,
+ PACKED_6 {
- public int blocks() {
+ public int blockCount() {
return 3;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 58;
- values[vi++] = (block0 >>> 52) & 63L;
- values[vi++] = (block0 >>> 46) & 63L;
- values[vi++] = (block0 >>> 40) & 63L;
- values[vi++] = (block0 >>> 34) & 63L;
- values[vi++] = (block0 >>> 28) & 63L;
- values[vi++] = (block0 >>> 22) & 63L;
- values[vi++] = (block0 >>> 16) & 63L;
- values[vi++] = (block0 >>> 10) & 63L;
- values[vi++] = (block0 >>> 4) & 63L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 2) | (block1 >>> 62);
- values[vi++] = (block1 >>> 56) & 63L;
- values[vi++] = (block1 >>> 50) & 63L;
- values[vi++] = (block1 >>> 44) & 63L;
- values[vi++] = (block1 >>> 38) & 63L;
- values[vi++] = (block1 >>> 32) & 63L;
- values[vi++] = (block1 >>> 26) & 63L;
- values[vi++] = (block1 >>> 20) & 63L;
- values[vi++] = (block1 >>> 14) & 63L;
- values[vi++] = (block1 >>> 8) & 63L;
- values[vi++] = (block1 >>> 2) & 63L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 54) & 63L;
- values[vi++] = (block2 >>> 48) & 63L;
- values[vi++] = (block2 >>> 42) & 63L;
- values[vi++] = (block2 >>> 36) & 63L;
- values[vi++] = (block2 >>> 30) & 63L;
- values[vi++] = (block2 >>> 24) & 63L;
- values[vi++] = (block2 >>> 18) & 63L;
- values[vi++] = (block2 >>> 12) & 63L;
- values[vi++] = (block2 >>> 6) & 63L;
- values[vi++] = block2 & 63L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 58);
+ values[valuesOffset++] = (int) ((block0 >>> 52) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 46) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 63L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 63L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 2) | (block1 >>> 62));
+ values[valuesOffset++] = (int) ((block1 >>> 56) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 50) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 44) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 32) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 26) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 14) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 63L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 63L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 4) | (block2 >>> 60));
+ values[valuesOffset++] = (int) ((block2 >>> 54) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 48) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 42) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 36) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 30) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 18) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 63L);
+ values[valuesOffset++] = (int) ((block2 >>> 6) & 63L);
+ values[valuesOffset++] = (int) (block2 & 63L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 2;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 3) << 4) | (byte1 >>> 4);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 15) << 2) | (byte2 >>> 6);
+ values[valuesOffset++] = byte2 & 63;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 2;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 4) | (byte4 >>> 4);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 2) | (byte5 >>> 6);
+ values[valuesOffset++] = byte5 & 63;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 2;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 2) | (byte8 >>> 6);
+ values[valuesOffset++] = byte8 & 63;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte9 >>> 2;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = byte11 & 63;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte12 >>> 2;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 4) | (byte13 >>> 4);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 2) | (byte14 >>> 6);
+ values[valuesOffset++] = byte14 & 63;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 2;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 4) | (byte16 >>> 4);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 2) | (byte17 >>> 6);
+ values[valuesOffset++] = byte17 & 63;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte18 >>> 2;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 4) | (byte19 >>> 4);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 2) | (byte20 >>> 6);
+ values[valuesOffset++] = byte20 & 63;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 2;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 2) | (byte23 >>> 6);
+ values[valuesOffset++] = byte23 & 63;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 58;
+ values[valuesOffset++] = (block0 >>> 52) & 63L;
+ values[valuesOffset++] = (block0 >>> 46) & 63L;
+ values[valuesOffset++] = (block0 >>> 40) & 63L;
+ values[valuesOffset++] = (block0 >>> 34) & 63L;
+ values[valuesOffset++] = (block0 >>> 28) & 63L;
+ values[valuesOffset++] = (block0 >>> 22) & 63L;
+ values[valuesOffset++] = (block0 >>> 16) & 63L;
+ values[valuesOffset++] = (block0 >>> 10) & 63L;
+ values[valuesOffset++] = (block0 >>> 4) & 63L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 2) | (block1 >>> 62);
+ values[valuesOffset++] = (block1 >>> 56) & 63L;
+ values[valuesOffset++] = (block1 >>> 50) & 63L;
+ values[valuesOffset++] = (block1 >>> 44) & 63L;
+ values[valuesOffset++] = (block1 >>> 38) & 63L;
+ values[valuesOffset++] = (block1 >>> 32) & 63L;
+ values[valuesOffset++] = (block1 >>> 26) & 63L;
+ values[valuesOffset++] = (block1 >>> 20) & 63L;
+ values[valuesOffset++] = (block1 >>> 14) & 63L;
+ values[valuesOffset++] = (block1 >>> 8) & 63L;
+ values[valuesOffset++] = (block1 >>> 2) & 63L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 54) & 63L;
+ values[valuesOffset++] = (block2 >>> 48) & 63L;
+ values[valuesOffset++] = (block2 >>> 42) & 63L;
+ values[valuesOffset++] = (block2 >>> 36) & 63L;
+ values[valuesOffset++] = (block2 >>> 30) & 63L;
+ values[valuesOffset++] = (block2 >>> 24) & 63L;
+ values[valuesOffset++] = (block2 >>> 18) & 63L;
+ values[valuesOffset++] = (block2 >>> 12) & 63L;
+ values[valuesOffset++] = (block2 >>> 6) & 63L;
+ values[valuesOffset++] = block2 & 63L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 2;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 3) << 4) | (byte1 >>> 4);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 15) << 2) | (byte2 >>> 6);
+ values[valuesOffset++] = byte2 & 63;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3 >>> 2;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 4) | (byte4 >>> 4);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 2) | (byte5 >>> 6);
+ values[valuesOffset++] = byte5 & 63;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6 >>> 2;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 2) | (byte8 >>> 6);
+ values[valuesOffset++] = byte8 & 63;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte9 >>> 2;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 2) | (byte11 >>> 6);
+ values[valuesOffset++] = byte11 & 63;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte12 >>> 2;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 2) | (byte14 >>> 6);
+ values[valuesOffset++] = byte14 & 63;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte15 >>> 2;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 2) | (byte17 >>> 6);
+ values[valuesOffset++] = byte17 & 63;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte18 >>> 2;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 2) | (byte20 >>> 6);
+ values[valuesOffset++] = byte20 & 63;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 2;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 2) | (byte23 >>> 6);
+ values[valuesOffset++] = byte23 & 63;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 6) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 6) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 52) | (values[vi++] << 46) | (values[vi++] << 40) | (values[vi++] << 34) | (values[vi++] << 28) | (values[vi++] << 22) | (values[vi++] << 16) | (values[vi++] << 10) | (values[vi++] << 4) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 56) | (values[vi++] << 50) | (values[vi++] << 44) | (values[vi++] << 38) | (values[vi++] << 32) | (values[vi++] << 26) | (values[vi++] << 20) | (values[vi++] << 14) | (values[vi++] << 8) | (values[vi++] << 2) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 54) | (values[vi++] << 48) | (values[vi++] << 42) | (values[vi++] << 36) | (values[vi++] << 30) | (values[vi++] << 24) | (values[vi++] << 18) | (values[vi++] << 12) | (values[vi++] << 6) | values[vi++];
- }
- }
}
+ ,
+ PACKED_7 {
- static final class Packed64BulkOperation7 extends BulkOperation {
-
- public int blocks() {
+ public int blockCount() {
return 7;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 57;
- values[vi++] = (block0 >>> 50) & 127L;
- values[vi++] = (block0 >>> 43) & 127L;
- values[vi++] = (block0 >>> 36) & 127L;
- values[vi++] = (block0 >>> 29) & 127L;
- values[vi++] = (block0 >>> 22) & 127L;
- values[vi++] = (block0 >>> 15) & 127L;
- values[vi++] = (block0 >>> 8) & 127L;
- values[vi++] = (block0 >>> 1) & 127L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1L) << 6) | (block1 >>> 58);
- values[vi++] = (block1 >>> 51) & 127L;
- values[vi++] = (block1 >>> 44) & 127L;
- values[vi++] = (block1 >>> 37) & 127L;
- values[vi++] = (block1 >>> 30) & 127L;
- values[vi++] = (block1 >>> 23) & 127L;
- values[vi++] = (block1 >>> 16) & 127L;
- values[vi++] = (block1 >>> 9) & 127L;
- values[vi++] = (block1 >>> 2) & 127L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 5) | (block2 >>> 59);
- values[vi++] = (block2 >>> 52) & 127L;
- values[vi++] = (block2 >>> 45) & 127L;
- values[vi++] = (block2 >>> 38) & 127L;
- values[vi++] = (block2 >>> 31) & 127L;
- values[vi++] = (block2 >>> 24) & 127L;
- values[vi++] = (block2 >>> 17) & 127L;
- values[vi++] = (block2 >>> 10) & 127L;
- values[vi++] = (block2 >>> 3) & 127L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 7L) << 4) | (block3 >>> 60);
- values[vi++] = (block3 >>> 53) & 127L;
- values[vi++] = (block3 >>> 46) & 127L;
- values[vi++] = (block3 >>> 39) & 127L;
- values[vi++] = (block3 >>> 32) & 127L;
- values[vi++] = (block3 >>> 25) & 127L;
- values[vi++] = (block3 >>> 18) & 127L;
- values[vi++] = (block3 >>> 11) & 127L;
- values[vi++] = (block3 >>> 4) & 127L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 3) | (block4 >>> 61);
- values[vi++] = (block4 >>> 54) & 127L;
- values[vi++] = (block4 >>> 47) & 127L;
- values[vi++] = (block4 >>> 40) & 127L;
- values[vi++] = (block4 >>> 33) & 127L;
- values[vi++] = (block4 >>> 26) & 127L;
- values[vi++] = (block4 >>> 19) & 127L;
- values[vi++] = (block4 >>> 12) & 127L;
- values[vi++] = (block4 >>> 5) & 127L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 2) | (block5 >>> 62);
- values[vi++] = (block5 >>> 55) & 127L;
- values[vi++] = (block5 >>> 48) & 127L;
- values[vi++] = (block5 >>> 41) & 127L;
- values[vi++] = (block5 >>> 34) & 127L;
- values[vi++] = (block5 >>> 27) & 127L;
- values[vi++] = (block5 >>> 20) & 127L;
- values[vi++] = (block5 >>> 13) & 127L;
- values[vi++] = (block5 >>> 6) & 127L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 1) | (block6 >>> 63);
- values[vi++] = (block6 >>> 56) & 127L;
- values[vi++] = (block6 >>> 49) & 127L;
- values[vi++] = (block6 >>> 42) & 127L;
- values[vi++] = (block6 >>> 35) & 127L;
- values[vi++] = (block6 >>> 28) & 127L;
- values[vi++] = (block6 >>> 21) & 127L;
- values[vi++] = (block6 >>> 14) & 127L;
- values[vi++] = (block6 >>> 7) & 127L;
- values[vi++] = block6 & 127L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 50) | (values[vi++] << 43) | (values[vi++] << 36) | (values[vi++] << 29) | (values[vi++] << 22) | (values[vi++] << 15) | (values[vi++] << 8) | (values[vi++] << 1) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 51) | (values[vi++] << 44) | (values[vi++] << 37) | (values[vi++] << 30) | (values[vi++] << 23) | (values[vi++] << 16) | (values[vi++] << 9) | (values[vi++] << 2) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 52) | (values[vi++] << 45) | (values[vi++] << 38) | (values[vi++] << 31) | (values[vi++] << 24) | (values[vi++] << 17) | (values[vi++] << 10) | (values[vi++] << 3) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 53) | (values[vi++] << 46) | (values[vi++] << 39) | (values[vi++] << 32) | (values[vi++] << 25) | (values[vi++] << 18) | (values[vi++] << 11) | (values[vi++] << 4) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 54) | (values[vi++] << 47) | (values[vi++] << 40) | (values[vi++] << 33) | (values[vi++] << 26) | (values[vi++] << 19) | (values[vi++] << 12) | (values[vi++] << 5) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 55) | (values[vi++] << 48) | (values[vi++] << 41) | (values[vi++] << 34) | (values[vi++] << 27) | (values[vi++] << 20) | (values[vi++] << 13) | (values[vi++] << 6) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 56) | (values[vi++] << 49) | (values[vi++] << 42) | (values[vi++] << 35) | (values[vi++] << 28) | (values[vi++] << 21) | (values[vi++] << 14) | (values[vi++] << 7) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 57);
+ values[valuesOffset++] = (int) ((block0 >>> 50) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 43) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 36) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 29) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 15) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 127L);
+ values[valuesOffset++] = (int) ((block0 >>> 1) & 127L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1L) << 6) | (block1 >>> 58));
+ values[valuesOffset++] = (int) ((block1 >>> 51) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 44) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 37) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 30) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 23) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 16) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 9) & 127L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 127L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 5) | (block2 >>> 59));
+ values[valuesOffset++] = (int) ((block2 >>> 52) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 45) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 38) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 31) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 17) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 10) & 127L);
+ values[valuesOffset++] = (int) ((block2 >>> 3) & 127L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 7L) << 4) | (block3 >>> 60));
+ values[valuesOffset++] = (int) ((block3 >>> 53) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 46) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 39) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 32) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 25) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 18) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 11) & 127L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 127L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 3) | (block4 >>> 61));
+ values[valuesOffset++] = (int) ((block4 >>> 54) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 47) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 40) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 33) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 26) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 19) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 12) & 127L);
+ values[valuesOffset++] = (int) ((block4 >>> 5) & 127L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 31L) << 2) | (block5 >>> 62));
+ values[valuesOffset++] = (int) ((block5 >>> 55) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 48) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 41) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 34) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 27) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 20) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 13) & 127L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 127L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 1) | (block6 >>> 63));
+ values[valuesOffset++] = (int) ((block6 >>> 56) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 49) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 42) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 35) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 21) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 14) & 127L);
+ values[valuesOffset++] = (int) ((block6 >>> 7) & 127L);
+ values[valuesOffset++] = (int) (block6 & 127L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 1;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 1) << 6) | (byte1 >>> 2);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 3) << 5) | (byte2 >>> 3);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 7) << 4) | (byte3 >>> 4);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 3) | (byte4 >>> 5);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 31) << 2) | (byte5 >>> 6);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 1) | (byte6 >>> 7);
+ values[valuesOffset++] = byte6 & 127;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 1;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 6) | (byte8 >>> 2);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 5) | (byte9 >>> 3);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 7) << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 3) | (byte11 >>> 5);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 31) << 2) | (byte12 >>> 6);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 63) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = byte13 & 127;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte14 >>> 1;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 1) << 6) | (byte15 >>> 2);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 5) | (byte16 >>> 3);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 7) << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 3) | (byte18 >>> 5);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 31) << 2) | (byte19 >>> 6);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 1) | (byte20 >>> 7);
+ values[valuesOffset++] = byte20 & 127;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 1;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 6) | (byte22 >>> 2);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 5) | (byte23 >>> 3);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 4) | (byte24 >>> 4);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 3) | (byte25 >>> 5);
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 31) << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 1) | (byte27 >>> 7);
+ values[valuesOffset++] = byte27 & 127;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte28 >>> 1;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 6) | (byte29 >>> 2);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 5) | (byte30 >>> 3);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 3) | (byte32 >>> 5);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 31) << 2) | (byte33 >>> 6);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 1) | (byte34 >>> 7);
+ values[valuesOffset++] = byte34 & 127;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte35 >>> 1;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 1) << 6) | (byte36 >>> 2);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 5) | (byte37 >>> 3);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 7) << 4) | (byte38 >>> 4);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 3) | (byte39 >>> 5);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 2) | (byte40 >>> 6);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 1) | (byte41 >>> 7);
+ values[valuesOffset++] = byte41 & 127;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte42 >>> 1;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 1) << 6) | (byte43 >>> 2);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 5) | (byte44 >>> 3);
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 4) | (byte45 >>> 4);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 3) | (byte46 >>> 5);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 31) << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 1) | (byte48 >>> 7);
+ values[valuesOffset++] = byte48 & 127;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte49 >>> 1;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 6) | (byte50 >>> 2);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 5) | (byte51 >>> 3);
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 7) << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 3) | (byte53 >>> 5);
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 31) << 2) | (byte54 >>> 6);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 1) | (byte55 >>> 7);
+ values[valuesOffset++] = byte55 & 127;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 57;
+ values[valuesOffset++] = (block0 >>> 50) & 127L;
+ values[valuesOffset++] = (block0 >>> 43) & 127L;
+ values[valuesOffset++] = (block0 >>> 36) & 127L;
+ values[valuesOffset++] = (block0 >>> 29) & 127L;
+ values[valuesOffset++] = (block0 >>> 22) & 127L;
+ values[valuesOffset++] = (block0 >>> 15) & 127L;
+ values[valuesOffset++] = (block0 >>> 8) & 127L;
+ values[valuesOffset++] = (block0 >>> 1) & 127L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1L) << 6) | (block1 >>> 58);
+ values[valuesOffset++] = (block1 >>> 51) & 127L;
+ values[valuesOffset++] = (block1 >>> 44) & 127L;
+ values[valuesOffset++] = (block1 >>> 37) & 127L;
+ values[valuesOffset++] = (block1 >>> 30) & 127L;
+ values[valuesOffset++] = (block1 >>> 23) & 127L;
+ values[valuesOffset++] = (block1 >>> 16) & 127L;
+ values[valuesOffset++] = (block1 >>> 9) & 127L;
+ values[valuesOffset++] = (block1 >>> 2) & 127L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 5) | (block2 >>> 59);
+ values[valuesOffset++] = (block2 >>> 52) & 127L;
+ values[valuesOffset++] = (block2 >>> 45) & 127L;
+ values[valuesOffset++] = (block2 >>> 38) & 127L;
+ values[valuesOffset++] = (block2 >>> 31) & 127L;
+ values[valuesOffset++] = (block2 >>> 24) & 127L;
+ values[valuesOffset++] = (block2 >>> 17) & 127L;
+ values[valuesOffset++] = (block2 >>> 10) & 127L;
+ values[valuesOffset++] = (block2 >>> 3) & 127L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 7L) << 4) | (block3 >>> 60);
+ values[valuesOffset++] = (block3 >>> 53) & 127L;
+ values[valuesOffset++] = (block3 >>> 46) & 127L;
+ values[valuesOffset++] = (block3 >>> 39) & 127L;
+ values[valuesOffset++] = (block3 >>> 32) & 127L;
+ values[valuesOffset++] = (block3 >>> 25) & 127L;
+ values[valuesOffset++] = (block3 >>> 18) & 127L;
+ values[valuesOffset++] = (block3 >>> 11) & 127L;
+ values[valuesOffset++] = (block3 >>> 4) & 127L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 3) | (block4 >>> 61);
+ values[valuesOffset++] = (block4 >>> 54) & 127L;
+ values[valuesOffset++] = (block4 >>> 47) & 127L;
+ values[valuesOffset++] = (block4 >>> 40) & 127L;
+ values[valuesOffset++] = (block4 >>> 33) & 127L;
+ values[valuesOffset++] = (block4 >>> 26) & 127L;
+ values[valuesOffset++] = (block4 >>> 19) & 127L;
+ values[valuesOffset++] = (block4 >>> 12) & 127L;
+ values[valuesOffset++] = (block4 >>> 5) & 127L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 2) | (block5 >>> 62);
+ values[valuesOffset++] = (block5 >>> 55) & 127L;
+ values[valuesOffset++] = (block5 >>> 48) & 127L;
+ values[valuesOffset++] = (block5 >>> 41) & 127L;
+ values[valuesOffset++] = (block5 >>> 34) & 127L;
+ values[valuesOffset++] = (block5 >>> 27) & 127L;
+ values[valuesOffset++] = (block5 >>> 20) & 127L;
+ values[valuesOffset++] = (block5 >>> 13) & 127L;
+ values[valuesOffset++] = (block5 >>> 6) & 127L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 1) | (block6 >>> 63);
+ values[valuesOffset++] = (block6 >>> 56) & 127L;
+ values[valuesOffset++] = (block6 >>> 49) & 127L;
+ values[valuesOffset++] = (block6 >>> 42) & 127L;
+ values[valuesOffset++] = (block6 >>> 35) & 127L;
+ values[valuesOffset++] = (block6 >>> 28) & 127L;
+ values[valuesOffset++] = (block6 >>> 21) & 127L;
+ values[valuesOffset++] = (block6 >>> 14) & 127L;
+ values[valuesOffset++] = (block6 >>> 7) & 127L;
+ values[valuesOffset++] = block6 & 127L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 >>> 1;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte0 & 1) << 6) | (byte1 >>> 2);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 3) << 5) | (byte2 >>> 3);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 7) << 4) | (byte3 >>> 4);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 3) | (byte4 >>> 5);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 31) << 2) | (byte5 >>> 6);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 1) | (byte6 >>> 7);
+ values[valuesOffset++] = byte6 & 127;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7 >>> 1;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 6) | (byte8 >>> 2);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 5) | (byte9 >>> 3);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 7) << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 3) | (byte11 >>> 5);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 31) << 2) | (byte12 >>> 6);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 63) << 1) | (byte13 >>> 7);
+ values[valuesOffset++] = byte13 & 127;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte14 >>> 1;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 1) << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 5) | (byte16 >>> 3);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 7) << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 3) | (byte18 >>> 5);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 31) << 2) | (byte19 >>> 6);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 1) | (byte20 >>> 7);
+ values[valuesOffset++] = byte20 & 127;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte21 >>> 1;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 6) | (byte22 >>> 2);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 5) | (byte23 >>> 3);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 4) | (byte24 >>> 4);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 3) | (byte25 >>> 5);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 31) << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 1) | (byte27 >>> 7);
+ values[valuesOffset++] = byte27 & 127;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte28 >>> 1;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 6) | (byte29 >>> 2);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 5) | (byte30 >>> 3);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 3) | (byte32 >>> 5);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 31) << 2) | (byte33 >>> 6);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 1) | (byte34 >>> 7);
+ values[valuesOffset++] = byte34 & 127;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte35 >>> 1;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 1) << 6) | (byte36 >>> 2);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 5) | (byte37 >>> 3);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 7) << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 2) | (byte40 >>> 6);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 1) | (byte41 >>> 7);
+ values[valuesOffset++] = byte41 & 127;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte42 >>> 1;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 1) << 6) | (byte43 >>> 2);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 5) | (byte44 >>> 3);
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 3) | (byte46 >>> 5);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 31) << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 1) | (byte48 >>> 7);
+ values[valuesOffset++] = byte48 & 127;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte49 >>> 1;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 6) | (byte50 >>> 2);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 5) | (byte51 >>> 3);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 7) << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 3) | (byte53 >>> 5);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 31) << 2) | (byte54 >>> 6);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 1) | (byte55 >>> 7);
+ values[valuesOffset++] = byte55 & 127;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 7) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 55) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 7) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation8 extends BulkOperation {
+ }
+ ,
+ PACKED_8 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 56;
- values[vi++] = (block0 >>> 48) & 255L;
- values[vi++] = (block0 >>> 40) & 255L;
- values[vi++] = (block0 >>> 32) & 255L;
- values[vi++] = (block0 >>> 24) & 255L;
- values[vi++] = (block0 >>> 16) & 255L;
- values[vi++] = (block0 >>> 8) & 255L;
- values[vi++] = block0 & 255L;
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 56);
+ values[valuesOffset++] = (int) ((block0 >>> 48) & 255L);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 255L);
+ values[valuesOffset++] = (int) ((block0 >>> 32) & 255L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 255L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 255L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 255L);
+ values[valuesOffset++] = (int) (block0 & 255L);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 48) | (values[vi++] << 40) | (values[vi++] << 32) | (values[vi++] << 24) | (values[vi++] << 16) | (values[vi++] << 8) | values[vi++];
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7;
}
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 56;
+ values[valuesOffset++] = (block0 >>> 48) & 255L;
+ values[valuesOffset++] = (block0 >>> 40) & 255L;
+ values[valuesOffset++] = (block0 >>> 32) & 255L;
+ values[valuesOffset++] = (block0 >>> 24) & 255L;
+ values[valuesOffset++] = (block0 >>> 16) & 255L;
+ values[valuesOffset++] = (block0 >>> 8) & 255L;
+ values[valuesOffset++] = block0 & 255L;
+ }
}
- static final class Packed64BulkOperation9 extends BulkOperation {
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte1;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte2;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte3;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte4;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte5;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte6;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte7;
+ }
+ }
- public int blocks() {
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 8) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 8) | values[valuesOffset++];
+ }
+ }
+
+ }
+ ,
+ PACKED_9 {
+
+ public int blockCount() {
return 9;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 55;
- values[vi++] = (block0 >>> 46) & 511L;
- values[vi++] = (block0 >>> 37) & 511L;
- values[vi++] = (block0 >>> 28) & 511L;
- values[vi++] = (block0 >>> 19) & 511L;
- values[vi++] = (block0 >>> 10) & 511L;
- values[vi++] = (block0 >>> 1) & 511L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1L) << 8) | (block1 >>> 56);
- values[vi++] = (block1 >>> 47) & 511L;
- values[vi++] = (block1 >>> 38) & 511L;
- values[vi++] = (block1 >>> 29) & 511L;
- values[vi++] = (block1 >>> 20) & 511L;
- values[vi++] = (block1 >>> 11) & 511L;
- values[vi++] = (block1 >>> 2) & 511L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 7) | (block2 >>> 57);
- values[vi++] = (block2 >>> 48) & 511L;
- values[vi++] = (block2 >>> 39) & 511L;
- values[vi++] = (block2 >>> 30) & 511L;
- values[vi++] = (block2 >>> 21) & 511L;
- values[vi++] = (block2 >>> 12) & 511L;
- values[vi++] = (block2 >>> 3) & 511L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 7L) << 6) | (block3 >>> 58);
- values[vi++] = (block3 >>> 49) & 511L;
- values[vi++] = (block3 >>> 40) & 511L;
- values[vi++] = (block3 >>> 31) & 511L;
- values[vi++] = (block3 >>> 22) & 511L;
- values[vi++] = (block3 >>> 13) & 511L;
- values[vi++] = (block3 >>> 4) & 511L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 5) | (block4 >>> 59);
- values[vi++] = (block4 >>> 50) & 511L;
- values[vi++] = (block4 >>> 41) & 511L;
- values[vi++] = (block4 >>> 32) & 511L;
- values[vi++] = (block4 >>> 23) & 511L;
- values[vi++] = (block4 >>> 14) & 511L;
- values[vi++] = (block4 >>> 5) & 511L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 4) | (block5 >>> 60);
- values[vi++] = (block5 >>> 51) & 511L;
- values[vi++] = (block5 >>> 42) & 511L;
- values[vi++] = (block5 >>> 33) & 511L;
- values[vi++] = (block5 >>> 24) & 511L;
- values[vi++] = (block5 >>> 15) & 511L;
- values[vi++] = (block5 >>> 6) & 511L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 3) | (block6 >>> 61);
- values[vi++] = (block6 >>> 52) & 511L;
- values[vi++] = (block6 >>> 43) & 511L;
- values[vi++] = (block6 >>> 34) & 511L;
- values[vi++] = (block6 >>> 25) & 511L;
- values[vi++] = (block6 >>> 16) & 511L;
- values[vi++] = (block6 >>> 7) & 511L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 127L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 53) & 511L;
- values[vi++] = (block7 >>> 44) & 511L;
- values[vi++] = (block7 >>> 35) & 511L;
- values[vi++] = (block7 >>> 26) & 511L;
- values[vi++] = (block7 >>> 17) & 511L;
- values[vi++] = (block7 >>> 8) & 511L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 1) | (block8 >>> 63);
- values[vi++] = (block8 >>> 54) & 511L;
- values[vi++] = (block8 >>> 45) & 511L;
- values[vi++] = (block8 >>> 36) & 511L;
- values[vi++] = (block8 >>> 27) & 511L;
- values[vi++] = (block8 >>> 18) & 511L;
- values[vi++] = (block8 >>> 9) & 511L;
- values[vi++] = block8 & 511L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 46) | (values[vi++] << 37) | (values[vi++] << 28) | (values[vi++] << 19) | (values[vi++] << 10) | (values[vi++] << 1) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 47) | (values[vi++] << 38) | (values[vi++] << 29) | (values[vi++] << 20) | (values[vi++] << 11) | (values[vi++] << 2) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 48) | (values[vi++] << 39) | (values[vi++] << 30) | (values[vi++] << 21) | (values[vi++] << 12) | (values[vi++] << 3) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 49) | (values[vi++] << 40) | (values[vi++] << 31) | (values[vi++] << 22) | (values[vi++] << 13) | (values[vi++] << 4) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 50) | (values[vi++] << 41) | (values[vi++] << 32) | (values[vi++] << 23) | (values[vi++] << 14) | (values[vi++] << 5) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 51) | (values[vi++] << 42) | (values[vi++] << 33) | (values[vi++] << 24) | (values[vi++] << 15) | (values[vi++] << 6) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 52) | (values[vi++] << 43) | (values[vi++] << 34) | (values[vi++] << 25) | (values[vi++] << 16) | (values[vi++] << 7) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 53) | (values[vi++] << 44) | (values[vi++] << 35) | (values[vi++] << 26) | (values[vi++] << 17) | (values[vi++] << 8) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 54) | (values[vi++] << 45) | (values[vi++] << 36) | (values[vi++] << 27) | (values[vi++] << 18) | (values[vi++] << 9) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 55);
+ values[valuesOffset++] = (int) ((block0 >>> 46) & 511L);
+ values[valuesOffset++] = (int) ((block0 >>> 37) & 511L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 511L);
+ values[valuesOffset++] = (int) ((block0 >>> 19) & 511L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 511L);
+ values[valuesOffset++] = (int) ((block0 >>> 1) & 511L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1L) << 8) | (block1 >>> 56));
+ values[valuesOffset++] = (int) ((block1 >>> 47) & 511L);
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 511L);
+ values[valuesOffset++] = (int) ((block1 >>> 29) & 511L);
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 511L);
+ values[valuesOffset++] = (int) ((block1 >>> 11) & 511L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 511L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 7) | (block2 >>> 57));
+ values[valuesOffset++] = (int) ((block2 >>> 48) & 511L);
+ values[valuesOffset++] = (int) ((block2 >>> 39) & 511L);
+ values[valuesOffset++] = (int) ((block2 >>> 30) & 511L);
+ values[valuesOffset++] = (int) ((block2 >>> 21) & 511L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 511L);
+ values[valuesOffset++] = (int) ((block2 >>> 3) & 511L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 7L) << 6) | (block3 >>> 58));
+ values[valuesOffset++] = (int) ((block3 >>> 49) & 511L);
+ values[valuesOffset++] = (int) ((block3 >>> 40) & 511L);
+ values[valuesOffset++] = (int) ((block3 >>> 31) & 511L);
+ values[valuesOffset++] = (int) ((block3 >>> 22) & 511L);
+ values[valuesOffset++] = (int) ((block3 >>> 13) & 511L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 511L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 5) | (block4 >>> 59));
+ values[valuesOffset++] = (int) ((block4 >>> 50) & 511L);
+ values[valuesOffset++] = (int) ((block4 >>> 41) & 511L);
+ values[valuesOffset++] = (int) ((block4 >>> 32) & 511L);
+ values[valuesOffset++] = (int) ((block4 >>> 23) & 511L);
+ values[valuesOffset++] = (int) ((block4 >>> 14) & 511L);
+ values[valuesOffset++] = (int) ((block4 >>> 5) & 511L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 31L) << 4) | (block5 >>> 60));
+ values[valuesOffset++] = (int) ((block5 >>> 51) & 511L);
+ values[valuesOffset++] = (int) ((block5 >>> 42) & 511L);
+ values[valuesOffset++] = (int) ((block5 >>> 33) & 511L);
+ values[valuesOffset++] = (int) ((block5 >>> 24) & 511L);
+ values[valuesOffset++] = (int) ((block5 >>> 15) & 511L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 511L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 3) | (block6 >>> 61));
+ values[valuesOffset++] = (int) ((block6 >>> 52) & 511L);
+ values[valuesOffset++] = (int) ((block6 >>> 43) & 511L);
+ values[valuesOffset++] = (int) ((block6 >>> 34) & 511L);
+ values[valuesOffset++] = (int) ((block6 >>> 25) & 511L);
+ values[valuesOffset++] = (int) ((block6 >>> 16) & 511L);
+ values[valuesOffset++] = (int) ((block6 >>> 7) & 511L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 127L) << 2) | (block7 >>> 62));
+ values[valuesOffset++] = (int) ((block7 >>> 53) & 511L);
+ values[valuesOffset++] = (int) ((block7 >>> 44) & 511L);
+ values[valuesOffset++] = (int) ((block7 >>> 35) & 511L);
+ values[valuesOffset++] = (int) ((block7 >>> 26) & 511L);
+ values[valuesOffset++] = (int) ((block7 >>> 17) & 511L);
+ values[valuesOffset++] = (int) ((block7 >>> 8) & 511L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 255L) << 1) | (block8 >>> 63));
+ values[valuesOffset++] = (int) ((block8 >>> 54) & 511L);
+ values[valuesOffset++] = (int) ((block8 >>> 45) & 511L);
+ values[valuesOffset++] = (int) ((block8 >>> 36) & 511L);
+ values[valuesOffset++] = (int) ((block8 >>> 27) & 511L);
+ values[valuesOffset++] = (int) ((block8 >>> 18) & 511L);
+ values[valuesOffset++] = (int) ((block8 >>> 9) & 511L);
+ values[valuesOffset++] = (int) (block8 & 511L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 1) | (byte1 >>> 7);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 127) << 2) | (byte2 >>> 6);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 63) << 3) | (byte3 >>> 5);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 31) << 4) | (byte4 >>> 4);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 5) | (byte5 >>> 3);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 6) | (byte6 >>> 2);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 7) | (byte7 >>> 1);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 8) | byte8;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 1) | (byte10 >>> 7);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 127) << 2) | (byte11 >>> 6);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 3) | (byte12 >>> 5);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 31) << 4) | (byte13 >>> 4);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 5) | (byte14 >>> 3);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 7) << 6) | (byte15 >>> 2);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 7) | (byte16 >>> 1);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 8) | byte17;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 1) | (byte19 >>> 7);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 127) << 2) | (byte20 >>> 6);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 3) | (byte21 >>> 5);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 31) << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 5) | (byte23 >>> 3);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 6) | (byte24 >>> 2);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 7) | (byte25 >>> 1);
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 1) << 8) | byte26;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 1) | (byte28 >>> 7);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 2) | (byte29 >>> 6);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 3) | (byte30 >>> 5);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 31) << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 5) | (byte32 >>> 3);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 7) << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 7) | (byte34 >>> 1);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 1) << 8) | byte35;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte36 << 1) | (byte37 >>> 7);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 2) | (byte38 >>> 6);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 3) | (byte39 >>> 5);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 4) | (byte40 >>> 4);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 5) | (byte41 >>> 3);
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 7) << 6) | (byte42 >>> 2);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 7) | (byte43 >>> 1);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 8) | byte44;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 1) | (byte46 >>> 7);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 127) << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 3) | (byte48 >>> 5);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 31) << 4) | (byte49 >>> 4);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 5) | (byte50 >>> 3);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 6) | (byte51 >>> 2);
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 7) | (byte52 >>> 1);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 1) << 8) | byte53;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 1) | (byte55 >>> 7);
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 2) | (byte56 >>> 6);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 3) | (byte57 >>> 5);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 4) | (byte58 >>> 4);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 5) | (byte59 >>> 3);
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 7) << 6) | (byte60 >>> 2);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 7) | (byte61 >>> 1);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 8) | byte62;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 1) | (byte64 >>> 7);
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 2) | (byte65 >>> 6);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 3) | (byte66 >>> 5);
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 31) << 4) | (byte67 >>> 4);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 5) | (byte68 >>> 3);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 7) << 6) | (byte69 >>> 2);
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 7) | (byte70 >>> 1);
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 8) | byte71;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 55;
+ values[valuesOffset++] = (block0 >>> 46) & 511L;
+ values[valuesOffset++] = (block0 >>> 37) & 511L;
+ values[valuesOffset++] = (block0 >>> 28) & 511L;
+ values[valuesOffset++] = (block0 >>> 19) & 511L;
+ values[valuesOffset++] = (block0 >>> 10) & 511L;
+ values[valuesOffset++] = (block0 >>> 1) & 511L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1L) << 8) | (block1 >>> 56);
+ values[valuesOffset++] = (block1 >>> 47) & 511L;
+ values[valuesOffset++] = (block1 >>> 38) & 511L;
+ values[valuesOffset++] = (block1 >>> 29) & 511L;
+ values[valuesOffset++] = (block1 >>> 20) & 511L;
+ values[valuesOffset++] = (block1 >>> 11) & 511L;
+ values[valuesOffset++] = (block1 >>> 2) & 511L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 7) | (block2 >>> 57);
+ values[valuesOffset++] = (block2 >>> 48) & 511L;
+ values[valuesOffset++] = (block2 >>> 39) & 511L;
+ values[valuesOffset++] = (block2 >>> 30) & 511L;
+ values[valuesOffset++] = (block2 >>> 21) & 511L;
+ values[valuesOffset++] = (block2 >>> 12) & 511L;
+ values[valuesOffset++] = (block2 >>> 3) & 511L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 7L) << 6) | (block3 >>> 58);
+ values[valuesOffset++] = (block3 >>> 49) & 511L;
+ values[valuesOffset++] = (block3 >>> 40) & 511L;
+ values[valuesOffset++] = (block3 >>> 31) & 511L;
+ values[valuesOffset++] = (block3 >>> 22) & 511L;
+ values[valuesOffset++] = (block3 >>> 13) & 511L;
+ values[valuesOffset++] = (block3 >>> 4) & 511L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 5) | (block4 >>> 59);
+ values[valuesOffset++] = (block4 >>> 50) & 511L;
+ values[valuesOffset++] = (block4 >>> 41) & 511L;
+ values[valuesOffset++] = (block4 >>> 32) & 511L;
+ values[valuesOffset++] = (block4 >>> 23) & 511L;
+ values[valuesOffset++] = (block4 >>> 14) & 511L;
+ values[valuesOffset++] = (block4 >>> 5) & 511L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 4) | (block5 >>> 60);
+ values[valuesOffset++] = (block5 >>> 51) & 511L;
+ values[valuesOffset++] = (block5 >>> 42) & 511L;
+ values[valuesOffset++] = (block5 >>> 33) & 511L;
+ values[valuesOffset++] = (block5 >>> 24) & 511L;
+ values[valuesOffset++] = (block5 >>> 15) & 511L;
+ values[valuesOffset++] = (block5 >>> 6) & 511L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 3) | (block6 >>> 61);
+ values[valuesOffset++] = (block6 >>> 52) & 511L;
+ values[valuesOffset++] = (block6 >>> 43) & 511L;
+ values[valuesOffset++] = (block6 >>> 34) & 511L;
+ values[valuesOffset++] = (block6 >>> 25) & 511L;
+ values[valuesOffset++] = (block6 >>> 16) & 511L;
+ values[valuesOffset++] = (block6 >>> 7) & 511L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 127L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 53) & 511L;
+ values[valuesOffset++] = (block7 >>> 44) & 511L;
+ values[valuesOffset++] = (block7 >>> 35) & 511L;
+ values[valuesOffset++] = (block7 >>> 26) & 511L;
+ values[valuesOffset++] = (block7 >>> 17) & 511L;
+ values[valuesOffset++] = (block7 >>> 8) & 511L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 1) | (block8 >>> 63);
+ values[valuesOffset++] = (block8 >>> 54) & 511L;
+ values[valuesOffset++] = (block8 >>> 45) & 511L;
+ values[valuesOffset++] = (block8 >>> 36) & 511L;
+ values[valuesOffset++] = (block8 >>> 27) & 511L;
+ values[valuesOffset++] = (block8 >>> 18) & 511L;
+ values[valuesOffset++] = (block8 >>> 9) & 511L;
+ values[valuesOffset++] = block8 & 511L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 1) | (byte1 >>> 7);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 127) << 2) | (byte2 >>> 6);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 63) << 3) | (byte3 >>> 5);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 31) << 4) | (byte4 >>> 4);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 5) | (byte5 >>> 3);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 6) | (byte6 >>> 2);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 7) | (byte7 >>> 1);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 8) | byte8;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 1) | (byte10 >>> 7);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 127) << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 3) | (byte12 >>> 5);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 31) << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 5) | (byte14 >>> 3);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 7) << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 7) | (byte16 >>> 1);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 1) | (byte19 >>> 7);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 127) << 2) | (byte20 >>> 6);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 3) | (byte21 >>> 5);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 31) << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 5) | (byte23 >>> 3);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 6) | (byte24 >>> 2);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 7) | (byte25 >>> 1);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 1) << 8) | byte26;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 1) | (byte28 >>> 7);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 2) | (byte29 >>> 6);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 3) | (byte30 >>> 5);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 31) << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 5) | (byte32 >>> 3);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 7) << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 7) | (byte34 >>> 1);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 1) << 8) | byte35;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte36 << 1) | (byte37 >>> 7);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 2) | (byte38 >>> 6);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 4) | (byte40 >>> 4);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 5) | (byte41 >>> 3);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 7) << 6) | (byte42 >>> 2);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 7) | (byte43 >>> 1);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 1) | (byte46 >>> 7);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 127) << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 3) | (byte48 >>> 5);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 31) << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 5) | (byte50 >>> 3);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 6) | (byte51 >>> 2);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 7) | (byte52 >>> 1);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 1) << 8) | byte53;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 1) | (byte55 >>> 7);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 3) | (byte57 >>> 5);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 5) | (byte59 >>> 3);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 7) << 6) | (byte60 >>> 2);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 1) | (byte64 >>> 7);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 2) | (byte65 >>> 6);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 3) | (byte66 >>> 5);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 31) << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 5) | (byte68 >>> 3);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 7) << 6) | (byte69 >>> 2);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 7) | (byte70 >>> 1);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 8) | byte71;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 9) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 9) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation10 extends BulkOperation {
+ }
+ ,
+ PACKED_10 {
- public int blocks() {
+ public int blockCount() {
return 5;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 54;
- values[vi++] = (block0 >>> 44) & 1023L;
- values[vi++] = (block0 >>> 34) & 1023L;
- values[vi++] = (block0 >>> 24) & 1023L;
- values[vi++] = (block0 >>> 14) & 1023L;
- values[vi++] = (block0 >>> 4) & 1023L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 6) | (block1 >>> 58);
- values[vi++] = (block1 >>> 48) & 1023L;
- values[vi++] = (block1 >>> 38) & 1023L;
- values[vi++] = (block1 >>> 28) & 1023L;
- values[vi++] = (block1 >>> 18) & 1023L;
- values[vi++] = (block1 >>> 8) & 1023L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 2) | (block2 >>> 62);
- values[vi++] = (block2 >>> 52) & 1023L;
- values[vi++] = (block2 >>> 42) & 1023L;
- values[vi++] = (block2 >>> 32) & 1023L;
- values[vi++] = (block2 >>> 22) & 1023L;
- values[vi++] = (block2 >>> 12) & 1023L;
- values[vi++] = (block2 >>> 2) & 1023L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 3L) << 8) | (block3 >>> 56);
- values[vi++] = (block3 >>> 46) & 1023L;
- values[vi++] = (block3 >>> 36) & 1023L;
- values[vi++] = (block3 >>> 26) & 1023L;
- values[vi++] = (block3 >>> 16) & 1023L;
- values[vi++] = (block3 >>> 6) & 1023L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 63L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 50) & 1023L;
- values[vi++] = (block4 >>> 40) & 1023L;
- values[vi++] = (block4 >>> 30) & 1023L;
- values[vi++] = (block4 >>> 20) & 1023L;
- values[vi++] = (block4 >>> 10) & 1023L;
- values[vi++] = block4 & 1023L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 54);
+ values[valuesOffset++] = (int) ((block0 >>> 44) & 1023L);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 1023L);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 1023L);
+ values[valuesOffset++] = (int) ((block0 >>> 14) & 1023L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 1023L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 6) | (block1 >>> 58));
+ values[valuesOffset++] = (int) ((block1 >>> 48) & 1023L);
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 1023L);
+ values[valuesOffset++] = (int) ((block1 >>> 28) & 1023L);
+ values[valuesOffset++] = (int) ((block1 >>> 18) & 1023L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 1023L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 2) | (block2 >>> 62));
+ values[valuesOffset++] = (int) ((block2 >>> 52) & 1023L);
+ values[valuesOffset++] = (int) ((block2 >>> 42) & 1023L);
+ values[valuesOffset++] = (int) ((block2 >>> 32) & 1023L);
+ values[valuesOffset++] = (int) ((block2 >>> 22) & 1023L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 1023L);
+ values[valuesOffset++] = (int) ((block2 >>> 2) & 1023L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 3L) << 8) | (block3 >>> 56));
+ values[valuesOffset++] = (int) ((block3 >>> 46) & 1023L);
+ values[valuesOffset++] = (int) ((block3 >>> 36) & 1023L);
+ values[valuesOffset++] = (int) ((block3 >>> 26) & 1023L);
+ values[valuesOffset++] = (int) ((block3 >>> 16) & 1023L);
+ values[valuesOffset++] = (int) ((block3 >>> 6) & 1023L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 63L) << 4) | (block4 >>> 60));
+ values[valuesOffset++] = (int) ((block4 >>> 50) & 1023L);
+ values[valuesOffset++] = (int) ((block4 >>> 40) & 1023L);
+ values[valuesOffset++] = (int) ((block4 >>> 30) & 1023L);
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 1023L);
+ values[valuesOffset++] = (int) ((block4 >>> 10) & 1023L);
+ values[valuesOffset++] = (int) (block4 & 1023L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 2) | (byte1 >>> 6);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 63) << 4) | (byte2 >>> 4);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 6) | (byte3 >>> 2);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 8) | byte4;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte5 << 2) | (byte6 >>> 6);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 63) << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 6) | (byte8 >>> 2);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 8) | byte9;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte10 << 2) | (byte11 >>> 6);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 4) | (byte12 >>> 4);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 6) | (byte13 >>> 2);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 2) | (byte16 >>> 6);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 6) | (byte18 >>> 2);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 8) | byte19;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte20 << 2) | (byte21 >>> 6);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 63) << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 6) | (byte23 >>> 2);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 8) | byte24;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 4) | (byte27 >>> 4);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 6) | (byte28 >>> 2);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 8) | byte29;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 2) | (byte31 >>> 6);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 63) << 4) | (byte32 >>> 4);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 8) | byte34;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 2) | (byte36 >>> 6);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 63) << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 6) | (byte38 >>> 2);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 8) | byte39;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 54;
+ values[valuesOffset++] = (block0 >>> 44) & 1023L;
+ values[valuesOffset++] = (block0 >>> 34) & 1023L;
+ values[valuesOffset++] = (block0 >>> 24) & 1023L;
+ values[valuesOffset++] = (block0 >>> 14) & 1023L;
+ values[valuesOffset++] = (block0 >>> 4) & 1023L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 6) | (block1 >>> 58);
+ values[valuesOffset++] = (block1 >>> 48) & 1023L;
+ values[valuesOffset++] = (block1 >>> 38) & 1023L;
+ values[valuesOffset++] = (block1 >>> 28) & 1023L;
+ values[valuesOffset++] = (block1 >>> 18) & 1023L;
+ values[valuesOffset++] = (block1 >>> 8) & 1023L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 2) | (block2 >>> 62);
+ values[valuesOffset++] = (block2 >>> 52) & 1023L;
+ values[valuesOffset++] = (block2 >>> 42) & 1023L;
+ values[valuesOffset++] = (block2 >>> 32) & 1023L;
+ values[valuesOffset++] = (block2 >>> 22) & 1023L;
+ values[valuesOffset++] = (block2 >>> 12) & 1023L;
+ values[valuesOffset++] = (block2 >>> 2) & 1023L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 3L) << 8) | (block3 >>> 56);
+ values[valuesOffset++] = (block3 >>> 46) & 1023L;
+ values[valuesOffset++] = (block3 >>> 36) & 1023L;
+ values[valuesOffset++] = (block3 >>> 26) & 1023L;
+ values[valuesOffset++] = (block3 >>> 16) & 1023L;
+ values[valuesOffset++] = (block3 >>> 6) & 1023L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 63L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 50) & 1023L;
+ values[valuesOffset++] = (block4 >>> 40) & 1023L;
+ values[valuesOffset++] = (block4 >>> 30) & 1023L;
+ values[valuesOffset++] = (block4 >>> 20) & 1023L;
+ values[valuesOffset++] = (block4 >>> 10) & 1023L;
+ values[valuesOffset++] = block4 & 1023L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 2) | (byte1 >>> 6);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 63) << 4) | (byte2 >>> 4);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 6) | (byte3 >>> 2);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 8) | byte4;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte5 << 2) | (byte6 >>> 6);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 63) << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 6) | (byte8 >>> 2);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 8) | byte9;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte10 << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 4) | (byte12 >>> 4);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 6) | (byte13 >>> 2);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 2) | (byte16 >>> 6);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 6) | (byte18 >>> 2);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 8) | byte19;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte20 << 2) | (byte21 >>> 6);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 63) << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 6) | (byte23 >>> 2);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 8) | byte24;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 6) | (byte28 >>> 2);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 2) | (byte31 >>> 6);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 63) << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 2) | (byte36 >>> 6);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 63) << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 6) | (byte38 >>> 2);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 8) | byte39;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 10) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 10) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 44) | (values[vi++] << 34) | (values[vi++] << 24) | (values[vi++] << 14) | (values[vi++] << 4) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 48) | (values[vi++] << 38) | (values[vi++] << 28) | (values[vi++] << 18) | (values[vi++] << 8) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 52) | (values[vi++] << 42) | (values[vi++] << 32) | (values[vi++] << 22) | (values[vi++] << 12) | (values[vi++] << 2) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 46) | (values[vi++] << 36) | (values[vi++] << 26) | (values[vi++] << 16) | (values[vi++] << 6) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 50) | (values[vi++] << 40) | (values[vi++] << 30) | (values[vi++] << 20) | (values[vi++] << 10) | values[vi++];
- }
- }
}
+ ,
+ PACKED_11 {
- static final class Packed64BulkOperation11 extends BulkOperation {
-
- public int blocks() {
+ public int blockCount() {
return 11;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 53;
- values[vi++] = (block0 >>> 42) & 2047L;
- values[vi++] = (block0 >>> 31) & 2047L;
- values[vi++] = (block0 >>> 20) & 2047L;
- values[vi++] = (block0 >>> 9) & 2047L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 511L) << 2) | (block1 >>> 62);
- values[vi++] = (block1 >>> 51) & 2047L;
- values[vi++] = (block1 >>> 40) & 2047L;
- values[vi++] = (block1 >>> 29) & 2047L;
- values[vi++] = (block1 >>> 18) & 2047L;
- values[vi++] = (block1 >>> 7) & 2047L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 127L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 49) & 2047L;
- values[vi++] = (block2 >>> 38) & 2047L;
- values[vi++] = (block2 >>> 27) & 2047L;
- values[vi++] = (block2 >>> 16) & 2047L;
- values[vi++] = (block2 >>> 5) & 2047L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 31L) << 6) | (block3 >>> 58);
- values[vi++] = (block3 >>> 47) & 2047L;
- values[vi++] = (block3 >>> 36) & 2047L;
- values[vi++] = (block3 >>> 25) & 2047L;
- values[vi++] = (block3 >>> 14) & 2047L;
- values[vi++] = (block3 >>> 3) & 2047L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 7L) << 8) | (block4 >>> 56);
- values[vi++] = (block4 >>> 45) & 2047L;
- values[vi++] = (block4 >>> 34) & 2047L;
- values[vi++] = (block4 >>> 23) & 2047L;
- values[vi++] = (block4 >>> 12) & 2047L;
- values[vi++] = (block4 >>> 1) & 2047L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1L) << 10) | (block5 >>> 54);
- values[vi++] = (block5 >>> 43) & 2047L;
- values[vi++] = (block5 >>> 32) & 2047L;
- values[vi++] = (block5 >>> 21) & 2047L;
- values[vi++] = (block5 >>> 10) & 2047L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1023L) << 1) | (block6 >>> 63);
- values[vi++] = (block6 >>> 52) & 2047L;
- values[vi++] = (block6 >>> 41) & 2047L;
- values[vi++] = (block6 >>> 30) & 2047L;
- values[vi++] = (block6 >>> 19) & 2047L;
- values[vi++] = (block6 >>> 8) & 2047L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 255L) << 3) | (block7 >>> 61);
- values[vi++] = (block7 >>> 50) & 2047L;
- values[vi++] = (block7 >>> 39) & 2047L;
- values[vi++] = (block7 >>> 28) & 2047L;
- values[vi++] = (block7 >>> 17) & 2047L;
- values[vi++] = (block7 >>> 6) & 2047L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 63L) << 5) | (block8 >>> 59);
- values[vi++] = (block8 >>> 48) & 2047L;
- values[vi++] = (block8 >>> 37) & 2047L;
- values[vi++] = (block8 >>> 26) & 2047L;
- values[vi++] = (block8 >>> 15) & 2047L;
- values[vi++] = (block8 >>> 4) & 2047L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 7) | (block9 >>> 57);
- values[vi++] = (block9 >>> 46) & 2047L;
- values[vi++] = (block9 >>> 35) & 2047L;
- values[vi++] = (block9 >>> 24) & 2047L;
- values[vi++] = (block9 >>> 13) & 2047L;
- values[vi++] = (block9 >>> 2) & 2047L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 3L) << 9) | (block10 >>> 55);
- values[vi++] = (block10 >>> 44) & 2047L;
- values[vi++] = (block10 >>> 33) & 2047L;
- values[vi++] = (block10 >>> 22) & 2047L;
- values[vi++] = (block10 >>> 11) & 2047L;
- values[vi++] = block10 & 2047L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 42) | (values[vi++] << 31) | (values[vi++] << 20) | (values[vi++] << 9) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 51) | (values[vi++] << 40) | (values[vi++] << 29) | (values[vi++] << 18) | (values[vi++] << 7) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 49) | (values[vi++] << 38) | (values[vi++] << 27) | (values[vi++] << 16) | (values[vi++] << 5) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 47) | (values[vi++] << 36) | (values[vi++] << 25) | (values[vi++] << 14) | (values[vi++] << 3) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 45) | (values[vi++] << 34) | (values[vi++] << 23) | (values[vi++] << 12) | (values[vi++] << 1) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 43) | (values[vi++] << 32) | (values[vi++] << 21) | (values[vi++] << 10) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 52) | (values[vi++] << 41) | (values[vi++] << 30) | (values[vi++] << 19) | (values[vi++] << 8) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 50) | (values[vi++] << 39) | (values[vi++] << 28) | (values[vi++] << 17) | (values[vi++] << 6) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 48) | (values[vi++] << 37) | (values[vi++] << 26) | (values[vi++] << 15) | (values[vi++] << 4) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 46) | (values[vi++] << 35) | (values[vi++] << 24) | (values[vi++] << 13) | (values[vi++] << 2) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 44) | (values[vi++] << 33) | (values[vi++] << 22) | (values[vi++] << 11) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 53);
+ values[valuesOffset++] = (int) ((block0 >>> 42) & 2047L);
+ values[valuesOffset++] = (int) ((block0 >>> 31) & 2047L);
+ values[valuesOffset++] = (int) ((block0 >>> 20) & 2047L);
+ values[valuesOffset++] = (int) ((block0 >>> 9) & 2047L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 511L) << 2) | (block1 >>> 62));
+ values[valuesOffset++] = (int) ((block1 >>> 51) & 2047L);
+ values[valuesOffset++] = (int) ((block1 >>> 40) & 2047L);
+ values[valuesOffset++] = (int) ((block1 >>> 29) & 2047L);
+ values[valuesOffset++] = (int) ((block1 >>> 18) & 2047L);
+ values[valuesOffset++] = (int) ((block1 >>> 7) & 2047L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 127L) << 4) | (block2 >>> 60));
+ values[valuesOffset++] = (int) ((block2 >>> 49) & 2047L);
+ values[valuesOffset++] = (int) ((block2 >>> 38) & 2047L);
+ values[valuesOffset++] = (int) ((block2 >>> 27) & 2047L);
+ values[valuesOffset++] = (int) ((block2 >>> 16) & 2047L);
+ values[valuesOffset++] = (int) ((block2 >>> 5) & 2047L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 31L) << 6) | (block3 >>> 58));
+ values[valuesOffset++] = (int) ((block3 >>> 47) & 2047L);
+ values[valuesOffset++] = (int) ((block3 >>> 36) & 2047L);
+ values[valuesOffset++] = (int) ((block3 >>> 25) & 2047L);
+ values[valuesOffset++] = (int) ((block3 >>> 14) & 2047L);
+ values[valuesOffset++] = (int) ((block3 >>> 3) & 2047L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 7L) << 8) | (block4 >>> 56));
+ values[valuesOffset++] = (int) ((block4 >>> 45) & 2047L);
+ values[valuesOffset++] = (int) ((block4 >>> 34) & 2047L);
+ values[valuesOffset++] = (int) ((block4 >>> 23) & 2047L);
+ values[valuesOffset++] = (int) ((block4 >>> 12) & 2047L);
+ values[valuesOffset++] = (int) ((block4 >>> 1) & 2047L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 1L) << 10) | (block5 >>> 54));
+ values[valuesOffset++] = (int) ((block5 >>> 43) & 2047L);
+ values[valuesOffset++] = (int) ((block5 >>> 32) & 2047L);
+ values[valuesOffset++] = (int) ((block5 >>> 21) & 2047L);
+ values[valuesOffset++] = (int) ((block5 >>> 10) & 2047L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 1023L) << 1) | (block6 >>> 63));
+ values[valuesOffset++] = (int) ((block6 >>> 52) & 2047L);
+ values[valuesOffset++] = (int) ((block6 >>> 41) & 2047L);
+ values[valuesOffset++] = (int) ((block6 >>> 30) & 2047L);
+ values[valuesOffset++] = (int) ((block6 >>> 19) & 2047L);
+ values[valuesOffset++] = (int) ((block6 >>> 8) & 2047L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 255L) << 3) | (block7 >>> 61));
+ values[valuesOffset++] = (int) ((block7 >>> 50) & 2047L);
+ values[valuesOffset++] = (int) ((block7 >>> 39) & 2047L);
+ values[valuesOffset++] = (int) ((block7 >>> 28) & 2047L);
+ values[valuesOffset++] = (int) ((block7 >>> 17) & 2047L);
+ values[valuesOffset++] = (int) ((block7 >>> 6) & 2047L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 63L) << 5) | (block8 >>> 59));
+ values[valuesOffset++] = (int) ((block8 >>> 48) & 2047L);
+ values[valuesOffset++] = (int) ((block8 >>> 37) & 2047L);
+ values[valuesOffset++] = (int) ((block8 >>> 26) & 2047L);
+ values[valuesOffset++] = (int) ((block8 >>> 15) & 2047L);
+ values[valuesOffset++] = (int) ((block8 >>> 4) & 2047L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 15L) << 7) | (block9 >>> 57));
+ values[valuesOffset++] = (int) ((block9 >>> 46) & 2047L);
+ values[valuesOffset++] = (int) ((block9 >>> 35) & 2047L);
+ values[valuesOffset++] = (int) ((block9 >>> 24) & 2047L);
+ values[valuesOffset++] = (int) ((block9 >>> 13) & 2047L);
+ values[valuesOffset++] = (int) ((block9 >>> 2) & 2047L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 3L) << 9) | (block10 >>> 55));
+ values[valuesOffset++] = (int) ((block10 >>> 44) & 2047L);
+ values[valuesOffset++] = (int) ((block10 >>> 33) & 2047L);
+ values[valuesOffset++] = (int) ((block10 >>> 22) & 2047L);
+ values[valuesOffset++] = (int) ((block10 >>> 11) & 2047L);
+ values[valuesOffset++] = (int) (block10 & 2047L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 3) | (byte1 >>> 5);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 31) << 6) | (byte2 >>> 2);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 3) << 9) | (byte3 << 1) | (byte4 >>> 7);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 127) << 4) | (byte5 >>> 4);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 15) << 7) | (byte6 >>> 1);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 1) << 10) | (byte7 << 2) | (byte8 >>> 6);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 63) << 5) | (byte9 >>> 3);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 7) << 8) | byte10;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte11 << 3) | (byte12 >>> 5);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 31) << 6) | (byte13 >>> 2);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 9) | (byte14 << 1) | (byte15 >>> 7);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 127) << 4) | (byte16 >>> 4);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 7) | (byte17 >>> 1);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 1) << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 5) | (byte20 >>> 3);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 8) | byte21;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte22 << 3) | (byte23 >>> 5);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 31) << 6) | (byte24 >>> 2);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 9) | (byte25 << 1) | (byte26 >>> 7);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 127) << 4) | (byte27 >>> 4);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 7) | (byte28 >>> 1);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 10) | (byte29 << 2) | (byte30 >>> 6);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 63) << 5) | (byte31 >>> 3);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 7) << 8) | byte32;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 3) | (byte34 >>> 5);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 31) << 6) | (byte35 >>> 2);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 9) | (byte36 << 1) | (byte37 >>> 7);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 4) | (byte38 >>> 4);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 7) | (byte39 >>> 1);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 1) << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 5) | (byte42 >>> 3);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 7) << 8) | byte43;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte44 << 3) | (byte45 >>> 5);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 31) << 6) | (byte46 >>> 2);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 9) | (byte47 << 1) | (byte48 >>> 7);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 127) << 4) | (byte49 >>> 4);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 7) | (byte50 >>> 1);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 1) << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 5) | (byte53 >>> 3);
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 8) | byte54;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 3) | (byte56 >>> 5);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 31) << 6) | (byte57 >>> 2);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 9) | (byte58 << 1) | (byte59 >>> 7);
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 127) << 4) | (byte60 >>> 4);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 15) << 7) | (byte61 >>> 1);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 5) | (byte64 >>> 3);
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 7) << 8) | byte65;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 3) | (byte67 >>> 5);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 31) << 6) | (byte68 >>> 2);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 4) | (byte71 >>> 4);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 7) | (byte72 >>> 1);
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 1) << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 5) | (byte75 >>> 3);
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte75 & 7) << 8) | byte76;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte77 << 3) | (byte78 >>> 5);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 6) | (byte79 >>> 2);
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 9) | (byte80 << 1) | (byte81 >>> 7);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 127) << 4) | (byte82 >>> 4);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 7) | (byte83 >>> 1);
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 1) << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 5) | (byte86 >>> 3);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 8) | byte87;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 53;
+ values[valuesOffset++] = (block0 >>> 42) & 2047L;
+ values[valuesOffset++] = (block0 >>> 31) & 2047L;
+ values[valuesOffset++] = (block0 >>> 20) & 2047L;
+ values[valuesOffset++] = (block0 >>> 9) & 2047L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 511L) << 2) | (block1 >>> 62);
+ values[valuesOffset++] = (block1 >>> 51) & 2047L;
+ values[valuesOffset++] = (block1 >>> 40) & 2047L;
+ values[valuesOffset++] = (block1 >>> 29) & 2047L;
+ values[valuesOffset++] = (block1 >>> 18) & 2047L;
+ values[valuesOffset++] = (block1 >>> 7) & 2047L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 127L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 49) & 2047L;
+ values[valuesOffset++] = (block2 >>> 38) & 2047L;
+ values[valuesOffset++] = (block2 >>> 27) & 2047L;
+ values[valuesOffset++] = (block2 >>> 16) & 2047L;
+ values[valuesOffset++] = (block2 >>> 5) & 2047L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 31L) << 6) | (block3 >>> 58);
+ values[valuesOffset++] = (block3 >>> 47) & 2047L;
+ values[valuesOffset++] = (block3 >>> 36) & 2047L;
+ values[valuesOffset++] = (block3 >>> 25) & 2047L;
+ values[valuesOffset++] = (block3 >>> 14) & 2047L;
+ values[valuesOffset++] = (block3 >>> 3) & 2047L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 7L) << 8) | (block4 >>> 56);
+ values[valuesOffset++] = (block4 >>> 45) & 2047L;
+ values[valuesOffset++] = (block4 >>> 34) & 2047L;
+ values[valuesOffset++] = (block4 >>> 23) & 2047L;
+ values[valuesOffset++] = (block4 >>> 12) & 2047L;
+ values[valuesOffset++] = (block4 >>> 1) & 2047L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1L) << 10) | (block5 >>> 54);
+ values[valuesOffset++] = (block5 >>> 43) & 2047L;
+ values[valuesOffset++] = (block5 >>> 32) & 2047L;
+ values[valuesOffset++] = (block5 >>> 21) & 2047L;
+ values[valuesOffset++] = (block5 >>> 10) & 2047L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1023L) << 1) | (block6 >>> 63);
+ values[valuesOffset++] = (block6 >>> 52) & 2047L;
+ values[valuesOffset++] = (block6 >>> 41) & 2047L;
+ values[valuesOffset++] = (block6 >>> 30) & 2047L;
+ values[valuesOffset++] = (block6 >>> 19) & 2047L;
+ values[valuesOffset++] = (block6 >>> 8) & 2047L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 255L) << 3) | (block7 >>> 61);
+ values[valuesOffset++] = (block7 >>> 50) & 2047L;
+ values[valuesOffset++] = (block7 >>> 39) & 2047L;
+ values[valuesOffset++] = (block7 >>> 28) & 2047L;
+ values[valuesOffset++] = (block7 >>> 17) & 2047L;
+ values[valuesOffset++] = (block7 >>> 6) & 2047L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 63L) << 5) | (block8 >>> 59);
+ values[valuesOffset++] = (block8 >>> 48) & 2047L;
+ values[valuesOffset++] = (block8 >>> 37) & 2047L;
+ values[valuesOffset++] = (block8 >>> 26) & 2047L;
+ values[valuesOffset++] = (block8 >>> 15) & 2047L;
+ values[valuesOffset++] = (block8 >>> 4) & 2047L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 7) | (block9 >>> 57);
+ values[valuesOffset++] = (block9 >>> 46) & 2047L;
+ values[valuesOffset++] = (block9 >>> 35) & 2047L;
+ values[valuesOffset++] = (block9 >>> 24) & 2047L;
+ values[valuesOffset++] = (block9 >>> 13) & 2047L;
+ values[valuesOffset++] = (block9 >>> 2) & 2047L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 3L) << 9) | (block10 >>> 55);
+ values[valuesOffset++] = (block10 >>> 44) & 2047L;
+ values[valuesOffset++] = (block10 >>> 33) & 2047L;
+ values[valuesOffset++] = (block10 >>> 22) & 2047L;
+ values[valuesOffset++] = (block10 >>> 11) & 2047L;
+ values[valuesOffset++] = block10 & 2047L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 3) | (byte1 >>> 5);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 31) << 6) | (byte2 >>> 2);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 3) << 9) | (byte3 << 1) | (byte4 >>> 7);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 127) << 4) | (byte5 >>> 4);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 15) << 7) | (byte6 >>> 1);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 1) << 10) | (byte7 << 2) | (byte8 >>> 6);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 63) << 5) | (byte9 >>> 3);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 7) << 8) | byte10;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte11 << 3) | (byte12 >>> 5);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 31) << 6) | (byte13 >>> 2);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 9) | (byte14 << 1) | (byte15 >>> 7);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 127) << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 7) | (byte17 >>> 1);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 1) << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 5) | (byte20 >>> 3);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 8) | byte21;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte22 << 3) | (byte23 >>> 5);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 31) << 6) | (byte24 >>> 2);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 9) | (byte25 << 1) | (byte26 >>> 7);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 127) << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 7) | (byte28 >>> 1);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 10) | (byte29 << 2) | (byte30 >>> 6);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 63) << 5) | (byte31 >>> 3);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 7) << 8) | byte32;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 3) | (byte34 >>> 5);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 31) << 6) | (byte35 >>> 2);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 9) | (byte36 << 1) | (byte37 >>> 7);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 7) | (byte39 >>> 1);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 1) << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 5) | (byte42 >>> 3);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 7) << 8) | byte43;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte44 << 3) | (byte45 >>> 5);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 31) << 6) | (byte46 >>> 2);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 9) | (byte47 << 1) | (byte48 >>> 7);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 127) << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 7) | (byte50 >>> 1);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 1) << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 5) | (byte53 >>> 3);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 8) | byte54;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 3) | (byte56 >>> 5);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 31) << 6) | (byte57 >>> 2);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 9) | (byte58 << 1) | (byte59 >>> 7);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 127) << 4) | (byte60 >>> 4);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 15) << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 5) | (byte64 >>> 3);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 7) << 8) | byte65;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 3) | (byte67 >>> 5);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 31) << 6) | (byte68 >>> 2);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 7) | (byte72 >>> 1);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 1) << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 5) | (byte75 >>> 3);
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte75 & 7) << 8) | byte76;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte77 << 3) | (byte78 >>> 5);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 6) | (byte79 >>> 2);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 9) | (byte80 << 1) | (byte81 >>> 7);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 127) << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 7) | (byte83 >>> 1);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 1) << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 5) | (byte86 >>> 3);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 8) | byte87;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 11) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 11) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation12 extends BulkOperation {
+ }
+ ,
+ PACKED_12 {
- public int blocks() {
+ public int blockCount() {
return 3;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 52;
- values[vi++] = (block0 >>> 40) & 4095L;
- values[vi++] = (block0 >>> 28) & 4095L;
- values[vi++] = (block0 >>> 16) & 4095L;
- values[vi++] = (block0 >>> 4) & 4095L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 8) | (block1 >>> 56);
- values[vi++] = (block1 >>> 44) & 4095L;
- values[vi++] = (block1 >>> 32) & 4095L;
- values[vi++] = (block1 >>> 20) & 4095L;
- values[vi++] = (block1 >>> 8) & 4095L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 48) & 4095L;
- values[vi++] = (block2 >>> 36) & 4095L;
- values[vi++] = (block2 >>> 24) & 4095L;
- values[vi++] = (block2 >>> 12) & 4095L;
- values[vi++] = block2 & 4095L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 52);
+ values[valuesOffset++] = (int) ((block0 >>> 40) & 4095L);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 4095L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 4095L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 4095L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 8) | (block1 >>> 56));
+ values[valuesOffset++] = (int) ((block1 >>> 44) & 4095L);
+ values[valuesOffset++] = (int) ((block1 >>> 32) & 4095L);
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 4095L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 4095L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 4) | (block2 >>> 60));
+ values[valuesOffset++] = (int) ((block2 >>> 48) & 4095L);
+ values[valuesOffset++] = (int) ((block2 >>> 36) & 4095L);
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 4095L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 4095L);
+ values[valuesOffset++] = (int) (block2 & 4095L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 4) | (byte1 >>> 4);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 15) << 8) | byte2;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte3 << 4) | (byte4 >>> 4);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 8) | byte5;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 8) | byte8;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 8) | byte11;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte12 << 4) | (byte13 >>> 4);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 4) | (byte16 >>> 4);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 8) | byte17;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 4) | (byte19 >>> 4);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 8) | byte20;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 8) | byte23;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 52;
+ values[valuesOffset++] = (block0 >>> 40) & 4095L;
+ values[valuesOffset++] = (block0 >>> 28) & 4095L;
+ values[valuesOffset++] = (block0 >>> 16) & 4095L;
+ values[valuesOffset++] = (block0 >>> 4) & 4095L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 8) | (block1 >>> 56);
+ values[valuesOffset++] = (block1 >>> 44) & 4095L;
+ values[valuesOffset++] = (block1 >>> 32) & 4095L;
+ values[valuesOffset++] = (block1 >>> 20) & 4095L;
+ values[valuesOffset++] = (block1 >>> 8) & 4095L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 48) & 4095L;
+ values[valuesOffset++] = (block2 >>> 36) & 4095L;
+ values[valuesOffset++] = (block2 >>> 24) & 4095L;
+ values[valuesOffset++] = (block2 >>> 12) & 4095L;
+ values[valuesOffset++] = block2 & 4095L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 4) | (byte1 >>> 4);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 15) << 8) | byte2;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte3 << 4) | (byte4 >>> 4);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 8) | byte5;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 8) | byte8;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 8) | byte11;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte12 << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 8) | byte23;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 12) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 12) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 40) | (values[vi++] << 28) | (values[vi++] << 16) | (values[vi++] << 4) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 44) | (values[vi++] << 32) | (values[vi++] << 20) | (values[vi++] << 8) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 48) | (values[vi++] << 36) | (values[vi++] << 24) | (values[vi++] << 12) | values[vi++];
}
- }
- }
-
- static final class Packed64BulkOperation13 extends BulkOperation {
+ ,
+ PACKED_13 {
- public int blocks() {
+ public int blockCount() {
return 13;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 51;
- values[vi++] = (block0 >>> 38) & 8191L;
- values[vi++] = (block0 >>> 25) & 8191L;
- values[vi++] = (block0 >>> 12) & 8191L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 4095L) << 1) | (block1 >>> 63);
- values[vi++] = (block1 >>> 50) & 8191L;
- values[vi++] = (block1 >>> 37) & 8191L;
- values[vi++] = (block1 >>> 24) & 8191L;
- values[vi++] = (block1 >>> 11) & 8191L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 2047L) << 2) | (block2 >>> 62);
- values[vi++] = (block2 >>> 49) & 8191L;
- values[vi++] = (block2 >>> 36) & 8191L;
- values[vi++] = (block2 >>> 23) & 8191L;
- values[vi++] = (block2 >>> 10) & 8191L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 1023L) << 3) | (block3 >>> 61);
- values[vi++] = (block3 >>> 48) & 8191L;
- values[vi++] = (block3 >>> 35) & 8191L;
- values[vi++] = (block3 >>> 22) & 8191L;
- values[vi++] = (block3 >>> 9) & 8191L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 511L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 47) & 8191L;
- values[vi++] = (block4 >>> 34) & 8191L;
- values[vi++] = (block4 >>> 21) & 8191L;
- values[vi++] = (block4 >>> 8) & 8191L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 255L) << 5) | (block5 >>> 59);
- values[vi++] = (block5 >>> 46) & 8191L;
- values[vi++] = (block5 >>> 33) & 8191L;
- values[vi++] = (block5 >>> 20) & 8191L;
- values[vi++] = (block5 >>> 7) & 8191L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 127L) << 6) | (block6 >>> 58);
- values[vi++] = (block6 >>> 45) & 8191L;
- values[vi++] = (block6 >>> 32) & 8191L;
- values[vi++] = (block6 >>> 19) & 8191L;
- values[vi++] = (block6 >>> 6) & 8191L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 63L) << 7) | (block7 >>> 57);
- values[vi++] = (block7 >>> 44) & 8191L;
- values[vi++] = (block7 >>> 31) & 8191L;
- values[vi++] = (block7 >>> 18) & 8191L;
- values[vi++] = (block7 >>> 5) & 8191L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 31L) << 8) | (block8 >>> 56);
- values[vi++] = (block8 >>> 43) & 8191L;
- values[vi++] = (block8 >>> 30) & 8191L;
- values[vi++] = (block8 >>> 17) & 8191L;
- values[vi++] = (block8 >>> 4) & 8191L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 9) | (block9 >>> 55);
- values[vi++] = (block9 >>> 42) & 8191L;
- values[vi++] = (block9 >>> 29) & 8191L;
- values[vi++] = (block9 >>> 16) & 8191L;
- values[vi++] = (block9 >>> 3) & 8191L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 7L) << 10) | (block10 >>> 54);
- values[vi++] = (block10 >>> 41) & 8191L;
- values[vi++] = (block10 >>> 28) & 8191L;
- values[vi++] = (block10 >>> 15) & 8191L;
- values[vi++] = (block10 >>> 2) & 8191L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 3L) << 11) | (block11 >>> 53);
- values[vi++] = (block11 >>> 40) & 8191L;
- values[vi++] = (block11 >>> 27) & 8191L;
- values[vi++] = (block11 >>> 14) & 8191L;
- values[vi++] = (block11 >>> 1) & 8191L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 1L) << 12) | (block12 >>> 52);
- values[vi++] = (block12 >>> 39) & 8191L;
- values[vi++] = (block12 >>> 26) & 8191L;
- values[vi++] = (block12 >>> 13) & 8191L;
- values[vi++] = block12 & 8191L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 38) | (values[vi++] << 25) | (values[vi++] << 12) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 50) | (values[vi++] << 37) | (values[vi++] << 24) | (values[vi++] << 11) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 49) | (values[vi++] << 36) | (values[vi++] << 23) | (values[vi++] << 10) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 48) | (values[vi++] << 35) | (values[vi++] << 22) | (values[vi++] << 9) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 47) | (values[vi++] << 34) | (values[vi++] << 21) | (values[vi++] << 8) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 46) | (values[vi++] << 33) | (values[vi++] << 20) | (values[vi++] << 7) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 45) | (values[vi++] << 32) | (values[vi++] << 19) | (values[vi++] << 6) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 44) | (values[vi++] << 31) | (values[vi++] << 18) | (values[vi++] << 5) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 43) | (values[vi++] << 30) | (values[vi++] << 17) | (values[vi++] << 4) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 42) | (values[vi++] << 29) | (values[vi++] << 16) | (values[vi++] << 3) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 41) | (values[vi++] << 28) | (values[vi++] << 15) | (values[vi++] << 2) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 40) | (values[vi++] << 27) | (values[vi++] << 14) | (values[vi++] << 1) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 39) | (values[vi++] << 26) | (values[vi++] << 13) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 51);
+ values[valuesOffset++] = (int) ((block0 >>> 38) & 8191L);
+ values[valuesOffset++] = (int) ((block0 >>> 25) & 8191L);
+ values[valuesOffset++] = (int) ((block0 >>> 12) & 8191L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 4095L) << 1) | (block1 >>> 63));
+ values[valuesOffset++] = (int) ((block1 >>> 50) & 8191L);
+ values[valuesOffset++] = (int) ((block1 >>> 37) & 8191L);
+ values[valuesOffset++] = (int) ((block1 >>> 24) & 8191L);
+ values[valuesOffset++] = (int) ((block1 >>> 11) & 8191L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 2047L) << 2) | (block2 >>> 62));
+ values[valuesOffset++] = (int) ((block2 >>> 49) & 8191L);
+ values[valuesOffset++] = (int) ((block2 >>> 36) & 8191L);
+ values[valuesOffset++] = (int) ((block2 >>> 23) & 8191L);
+ values[valuesOffset++] = (int) ((block2 >>> 10) & 8191L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 1023L) << 3) | (block3 >>> 61));
+ values[valuesOffset++] = (int) ((block3 >>> 48) & 8191L);
+ values[valuesOffset++] = (int) ((block3 >>> 35) & 8191L);
+ values[valuesOffset++] = (int) ((block3 >>> 22) & 8191L);
+ values[valuesOffset++] = (int) ((block3 >>> 9) & 8191L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 511L) << 4) | (block4 >>> 60));
+ values[valuesOffset++] = (int) ((block4 >>> 47) & 8191L);
+ values[valuesOffset++] = (int) ((block4 >>> 34) & 8191L);
+ values[valuesOffset++] = (int) ((block4 >>> 21) & 8191L);
+ values[valuesOffset++] = (int) ((block4 >>> 8) & 8191L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 255L) << 5) | (block5 >>> 59));
+ values[valuesOffset++] = (int) ((block5 >>> 46) & 8191L);
+ values[valuesOffset++] = (int) ((block5 >>> 33) & 8191L);
+ values[valuesOffset++] = (int) ((block5 >>> 20) & 8191L);
+ values[valuesOffset++] = (int) ((block5 >>> 7) & 8191L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 127L) << 6) | (block6 >>> 58));
+ values[valuesOffset++] = (int) ((block6 >>> 45) & 8191L);
+ values[valuesOffset++] = (int) ((block6 >>> 32) & 8191L);
+ values[valuesOffset++] = (int) ((block6 >>> 19) & 8191L);
+ values[valuesOffset++] = (int) ((block6 >>> 6) & 8191L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 63L) << 7) | (block7 >>> 57));
+ values[valuesOffset++] = (int) ((block7 >>> 44) & 8191L);
+ values[valuesOffset++] = (int) ((block7 >>> 31) & 8191L);
+ values[valuesOffset++] = (int) ((block7 >>> 18) & 8191L);
+ values[valuesOffset++] = (int) ((block7 >>> 5) & 8191L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 31L) << 8) | (block8 >>> 56));
+ values[valuesOffset++] = (int) ((block8 >>> 43) & 8191L);
+ values[valuesOffset++] = (int) ((block8 >>> 30) & 8191L);
+ values[valuesOffset++] = (int) ((block8 >>> 17) & 8191L);
+ values[valuesOffset++] = (int) ((block8 >>> 4) & 8191L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 15L) << 9) | (block9 >>> 55));
+ values[valuesOffset++] = (int) ((block9 >>> 42) & 8191L);
+ values[valuesOffset++] = (int) ((block9 >>> 29) & 8191L);
+ values[valuesOffset++] = (int) ((block9 >>> 16) & 8191L);
+ values[valuesOffset++] = (int) ((block9 >>> 3) & 8191L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 7L) << 10) | (block10 >>> 54));
+ values[valuesOffset++] = (int) ((block10 >>> 41) & 8191L);
+ values[valuesOffset++] = (int) ((block10 >>> 28) & 8191L);
+ values[valuesOffset++] = (int) ((block10 >>> 15) & 8191L);
+ values[valuesOffset++] = (int) ((block10 >>> 2) & 8191L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 3L) << 11) | (block11 >>> 53));
+ values[valuesOffset++] = (int) ((block11 >>> 40) & 8191L);
+ values[valuesOffset++] = (int) ((block11 >>> 27) & 8191L);
+ values[valuesOffset++] = (int) ((block11 >>> 14) & 8191L);
+ values[valuesOffset++] = (int) ((block11 >>> 1) & 8191L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 1L) << 12) | (block12 >>> 52));
+ values[valuesOffset++] = (int) ((block12 >>> 39) & 8191L);
+ values[valuesOffset++] = (int) ((block12 >>> 26) & 8191L);
+ values[valuesOffset++] = (int) ((block12 >>> 13) & 8191L);
+ values[valuesOffset++] = (int) (block12 & 8191L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 5) | (byte1 >>> 3);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 7) << 10) | (byte2 << 2) | (byte3 >>> 6);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 63) << 7) | (byte4 >>> 1);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 1) << 12) | (byte5 << 4) | (byte6 >>> 4);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 15) << 9) | (byte7 << 1) | (byte8 >>> 7);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 127) << 6) | (byte9 >>> 2);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 11) | (byte10 << 3) | (byte11 >>> 5);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 31) << 8) | byte12;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte13 << 5) | (byte14 >>> 3);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 7) << 10) | (byte15 << 2) | (byte16 >>> 6);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 7) | (byte17 >>> 1);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 1) << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 9) | (byte20 << 1) | (byte21 >>> 7);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 127) << 6) | (byte22 >>> 2);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 11) | (byte23 << 3) | (byte24 >>> 5);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 31) << 8) | byte25;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte26 << 5) | (byte27 >>> 3);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 7) << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 7) | (byte30 >>> 1);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 1) << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 9) | (byte33 << 1) | (byte34 >>> 7);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 127) << 6) | (byte35 >>> 2);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 11) | (byte36 << 3) | (byte37 >>> 5);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 31) << 8) | byte38;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 5) | (byte40 >>> 3);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 7) << 10) | (byte41 << 2) | (byte42 >>> 6);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 63) << 7) | (byte43 >>> 1);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 9) | (byte46 << 1) | (byte47 >>> 7);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 127) << 6) | (byte48 >>> 2);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 11) | (byte49 << 3) | (byte50 >>> 5);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 31) << 8) | byte51;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte52 << 5) | (byte53 >>> 3);
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 7) | (byte56 >>> 1);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 1) << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 9) | (byte59 << 1) | (byte60 >>> 7);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 127) << 6) | (byte61 >>> 2);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 11) | (byte62 << 3) | (byte63 >>> 5);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 31) << 8) | byte64;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte65 << 5) | (byte66 >>> 3);
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 7) << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 7) | (byte69 >>> 1);
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 1) << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 6) | (byte74 >>> 2);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 11) | (byte75 << 3) | (byte76 >>> 5);
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 31) << 8) | byte77;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 5) | (byte79 >>> 3);
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 7) << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 7) | (byte82 >>> 1);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 12) | (byte83 << 4) | (byte84 >>> 4);
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 15) << 9) | (byte85 << 1) | (byte86 >>> 7);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 127) << 6) | (byte87 >>> 2);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 11) | (byte88 << 3) | (byte89 >>> 5);
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 31) << 8) | byte90;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte91 << 5) | (byte92 >>> 3);
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 7) | (byte95 >>> 1);
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 1) << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 9) | (byte98 << 1) | (byte99 >>> 7);
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 127) << 6) | (byte100 >>> 2);
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 8) | byte103;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 51;
+ values[valuesOffset++] = (block0 >>> 38) & 8191L;
+ values[valuesOffset++] = (block0 >>> 25) & 8191L;
+ values[valuesOffset++] = (block0 >>> 12) & 8191L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 4095L) << 1) | (block1 >>> 63);
+ values[valuesOffset++] = (block1 >>> 50) & 8191L;
+ values[valuesOffset++] = (block1 >>> 37) & 8191L;
+ values[valuesOffset++] = (block1 >>> 24) & 8191L;
+ values[valuesOffset++] = (block1 >>> 11) & 8191L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 2047L) << 2) | (block2 >>> 62);
+ values[valuesOffset++] = (block2 >>> 49) & 8191L;
+ values[valuesOffset++] = (block2 >>> 36) & 8191L;
+ values[valuesOffset++] = (block2 >>> 23) & 8191L;
+ values[valuesOffset++] = (block2 >>> 10) & 8191L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 1023L) << 3) | (block3 >>> 61);
+ values[valuesOffset++] = (block3 >>> 48) & 8191L;
+ values[valuesOffset++] = (block3 >>> 35) & 8191L;
+ values[valuesOffset++] = (block3 >>> 22) & 8191L;
+ values[valuesOffset++] = (block3 >>> 9) & 8191L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 511L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 47) & 8191L;
+ values[valuesOffset++] = (block4 >>> 34) & 8191L;
+ values[valuesOffset++] = (block4 >>> 21) & 8191L;
+ values[valuesOffset++] = (block4 >>> 8) & 8191L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 255L) << 5) | (block5 >>> 59);
+ values[valuesOffset++] = (block5 >>> 46) & 8191L;
+ values[valuesOffset++] = (block5 >>> 33) & 8191L;
+ values[valuesOffset++] = (block5 >>> 20) & 8191L;
+ values[valuesOffset++] = (block5 >>> 7) & 8191L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 127L) << 6) | (block6 >>> 58);
+ values[valuesOffset++] = (block6 >>> 45) & 8191L;
+ values[valuesOffset++] = (block6 >>> 32) & 8191L;
+ values[valuesOffset++] = (block6 >>> 19) & 8191L;
+ values[valuesOffset++] = (block6 >>> 6) & 8191L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 63L) << 7) | (block7 >>> 57);
+ values[valuesOffset++] = (block7 >>> 44) & 8191L;
+ values[valuesOffset++] = (block7 >>> 31) & 8191L;
+ values[valuesOffset++] = (block7 >>> 18) & 8191L;
+ values[valuesOffset++] = (block7 >>> 5) & 8191L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 31L) << 8) | (block8 >>> 56);
+ values[valuesOffset++] = (block8 >>> 43) & 8191L;
+ values[valuesOffset++] = (block8 >>> 30) & 8191L;
+ values[valuesOffset++] = (block8 >>> 17) & 8191L;
+ values[valuesOffset++] = (block8 >>> 4) & 8191L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 9) | (block9 >>> 55);
+ values[valuesOffset++] = (block9 >>> 42) & 8191L;
+ values[valuesOffset++] = (block9 >>> 29) & 8191L;
+ values[valuesOffset++] = (block9 >>> 16) & 8191L;
+ values[valuesOffset++] = (block9 >>> 3) & 8191L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 7L) << 10) | (block10 >>> 54);
+ values[valuesOffset++] = (block10 >>> 41) & 8191L;
+ values[valuesOffset++] = (block10 >>> 28) & 8191L;
+ values[valuesOffset++] = (block10 >>> 15) & 8191L;
+ values[valuesOffset++] = (block10 >>> 2) & 8191L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 3L) << 11) | (block11 >>> 53);
+ values[valuesOffset++] = (block11 >>> 40) & 8191L;
+ values[valuesOffset++] = (block11 >>> 27) & 8191L;
+ values[valuesOffset++] = (block11 >>> 14) & 8191L;
+ values[valuesOffset++] = (block11 >>> 1) & 8191L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 1L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = (block12 >>> 39) & 8191L;
+ values[valuesOffset++] = (block12 >>> 26) & 8191L;
+ values[valuesOffset++] = (block12 >>> 13) & 8191L;
+ values[valuesOffset++] = block12 & 8191L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 5) | (byte1 >>> 3);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 7) << 10) | (byte2 << 2) | (byte3 >>> 6);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 63) << 7) | (byte4 >>> 1);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 1) << 12) | (byte5 << 4) | (byte6 >>> 4);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 15) << 9) | (byte7 << 1) | (byte8 >>> 7);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 127) << 6) | (byte9 >>> 2);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 11) | (byte10 << 3) | (byte11 >>> 5);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 31) << 8) | byte12;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte13 << 5) | (byte14 >>> 3);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 7) << 10) | (byte15 << 2) | (byte16 >>> 6);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 7) | (byte17 >>> 1);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 1) << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 9) | (byte20 << 1) | (byte21 >>> 7);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 127) << 6) | (byte22 >>> 2);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 11) | (byte23 << 3) | (byte24 >>> 5);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 31) << 8) | byte25;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte26 << 5) | (byte27 >>> 3);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 7) << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 7) | (byte30 >>> 1);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 1) << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 9) | (byte33 << 1) | (byte34 >>> 7);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 127) << 6) | (byte35 >>> 2);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 11) | (byte36 << 3) | (byte37 >>> 5);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 31) << 8) | byte38;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 5) | (byte40 >>> 3);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 7) << 10) | (byte41 << 2) | (byte42 >>> 6);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 63) << 7) | (byte43 >>> 1);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 9) | (byte46 << 1) | (byte47 >>> 7);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 127) << 6) | (byte48 >>> 2);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 11) | (byte49 << 3) | (byte50 >>> 5);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 31) << 8) | byte51;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte52 << 5) | (byte53 >>> 3);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 7) | (byte56 >>> 1);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 1) << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 9) | (byte59 << 1) | (byte60 >>> 7);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 127) << 6) | (byte61 >>> 2);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 11) | (byte62 << 3) | (byte63 >>> 5);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 31) << 8) | byte64;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte65 << 5) | (byte66 >>> 3);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 7) << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 7) | (byte69 >>> 1);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 1) << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 6) | (byte74 >>> 2);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 11) | (byte75 << 3) | (byte76 >>> 5);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 31) << 8) | byte77;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 5) | (byte79 >>> 3);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 7) << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 7) | (byte82 >>> 1);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 12) | (byte83 << 4) | (byte84 >>> 4);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 15) << 9) | (byte85 << 1) | (byte86 >>> 7);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 127) << 6) | (byte87 >>> 2);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 11) | (byte88 << 3) | (byte89 >>> 5);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 31) << 8) | byte90;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte91 << 5) | (byte92 >>> 3);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 7) | (byte95 >>> 1);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 1) << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 9) | (byte98 << 1) | (byte99 >>> 7);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 127) << 6) | (byte100 >>> 2);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 8) | byte103;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 13) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 13) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation14 extends BulkOperation {
+ }
+ ,
+ PACKED_14 {
- public int blocks() {
+ public int blockCount() {
return 7;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 50;
- values[vi++] = (block0 >>> 36) & 16383L;
- values[vi++] = (block0 >>> 22) & 16383L;
- values[vi++] = (block0 >>> 8) & 16383L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 255L) << 6) | (block1 >>> 58);
- values[vi++] = (block1 >>> 44) & 16383L;
- values[vi++] = (block1 >>> 30) & 16383L;
- values[vi++] = (block1 >>> 16) & 16383L;
- values[vi++] = (block1 >>> 2) & 16383L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 12) | (block2 >>> 52);
- values[vi++] = (block2 >>> 38) & 16383L;
- values[vi++] = (block2 >>> 24) & 16383L;
- values[vi++] = (block2 >>> 10) & 16383L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 1023L) << 4) | (block3 >>> 60);
- values[vi++] = (block3 >>> 46) & 16383L;
- values[vi++] = (block3 >>> 32) & 16383L;
- values[vi++] = (block3 >>> 18) & 16383L;
- values[vi++] = (block3 >>> 4) & 16383L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 10) | (block4 >>> 54);
- values[vi++] = (block4 >>> 40) & 16383L;
- values[vi++] = (block4 >>> 26) & 16383L;
- values[vi++] = (block4 >>> 12) & 16383L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 4095L) << 2) | (block5 >>> 62);
- values[vi++] = (block5 >>> 48) & 16383L;
- values[vi++] = (block5 >>> 34) & 16383L;
- values[vi++] = (block5 >>> 20) & 16383L;
- values[vi++] = (block5 >>> 6) & 16383L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 8) | (block6 >>> 56);
- values[vi++] = (block6 >>> 42) & 16383L;
- values[vi++] = (block6 >>> 28) & 16383L;
- values[vi++] = (block6 >>> 14) & 16383L;
- values[vi++] = block6 & 16383L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 36) | (values[vi++] << 22) | (values[vi++] << 8) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 44) | (values[vi++] << 30) | (values[vi++] << 16) | (values[vi++] << 2) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 38) | (values[vi++] << 24) | (values[vi++] << 10) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 46) | (values[vi++] << 32) | (values[vi++] << 18) | (values[vi++] << 4) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 40) | (values[vi++] << 26) | (values[vi++] << 12) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 48) | (values[vi++] << 34) | (values[vi++] << 20) | (values[vi++] << 6) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 42) | (values[vi++] << 28) | (values[vi++] << 14) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 50);
+ values[valuesOffset++] = (int) ((block0 >>> 36) & 16383L);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 16383L);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 16383L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 255L) << 6) | (block1 >>> 58));
+ values[valuesOffset++] = (int) ((block1 >>> 44) & 16383L);
+ values[valuesOffset++] = (int) ((block1 >>> 30) & 16383L);
+ values[valuesOffset++] = (int) ((block1 >>> 16) & 16383L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 16383L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 12) | (block2 >>> 52));
+ values[valuesOffset++] = (int) ((block2 >>> 38) & 16383L);
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 16383L);
+ values[valuesOffset++] = (int) ((block2 >>> 10) & 16383L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 1023L) << 4) | (block3 >>> 60));
+ values[valuesOffset++] = (int) ((block3 >>> 46) & 16383L);
+ values[valuesOffset++] = (int) ((block3 >>> 32) & 16383L);
+ values[valuesOffset++] = (int) ((block3 >>> 18) & 16383L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 16383L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 10) | (block4 >>> 54));
+ values[valuesOffset++] = (int) ((block4 >>> 40) & 16383L);
+ values[valuesOffset++] = (int) ((block4 >>> 26) & 16383L);
+ values[valuesOffset++] = (int) ((block4 >>> 12) & 16383L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 4095L) << 2) | (block5 >>> 62));
+ values[valuesOffset++] = (int) ((block5 >>> 48) & 16383L);
+ values[valuesOffset++] = (int) ((block5 >>> 34) & 16383L);
+ values[valuesOffset++] = (int) ((block5 >>> 20) & 16383L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 16383L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 8) | (block6 >>> 56));
+ values[valuesOffset++] = (int) ((block6 >>> 42) & 16383L);
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 16383L);
+ values[valuesOffset++] = (int) ((block6 >>> 14) & 16383L);
+ values[valuesOffset++] = (int) (block6 & 16383L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 6) | (byte1 >>> 2);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 3) << 12) | (byte2 << 4) | (byte3 >>> 4);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 10) | (byte4 << 2) | (byte5 >>> 6);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 8) | byte6;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte7 << 6) | (byte8 >>> 2);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 10) | (byte11 << 2) | (byte12 >>> 6);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 63) << 8) | byte13;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte14 << 6) | (byte15 >>> 2);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 8) | byte20;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 6) | (byte22 >>> 2);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 12) | (byte23 << 4) | (byte24 >>> 4);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 8) | byte27;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte28 << 6) | (byte29 >>> 2);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 10) | (byte32 << 2) | (byte33 >>> 6);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 8) | byte34;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 6) | (byte36 >>> 2);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 10) | (byte39 << 2) | (byte40 >>> 6);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 8) | byte41;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 6) | (byte43 >>> 2);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 8) | byte48;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 6) | (byte50 >>> 2);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 10) | (byte53 << 2) | (byte54 >>> 6);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 8) | byte55;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 50;
+ values[valuesOffset++] = (block0 >>> 36) & 16383L;
+ values[valuesOffset++] = (block0 >>> 22) & 16383L;
+ values[valuesOffset++] = (block0 >>> 8) & 16383L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 255L) << 6) | (block1 >>> 58);
+ values[valuesOffset++] = (block1 >>> 44) & 16383L;
+ values[valuesOffset++] = (block1 >>> 30) & 16383L;
+ values[valuesOffset++] = (block1 >>> 16) & 16383L;
+ values[valuesOffset++] = (block1 >>> 2) & 16383L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 12) | (block2 >>> 52);
+ values[valuesOffset++] = (block2 >>> 38) & 16383L;
+ values[valuesOffset++] = (block2 >>> 24) & 16383L;
+ values[valuesOffset++] = (block2 >>> 10) & 16383L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 1023L) << 4) | (block3 >>> 60);
+ values[valuesOffset++] = (block3 >>> 46) & 16383L;
+ values[valuesOffset++] = (block3 >>> 32) & 16383L;
+ values[valuesOffset++] = (block3 >>> 18) & 16383L;
+ values[valuesOffset++] = (block3 >>> 4) & 16383L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 10) | (block4 >>> 54);
+ values[valuesOffset++] = (block4 >>> 40) & 16383L;
+ values[valuesOffset++] = (block4 >>> 26) & 16383L;
+ values[valuesOffset++] = (block4 >>> 12) & 16383L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 4095L) << 2) | (block5 >>> 62);
+ values[valuesOffset++] = (block5 >>> 48) & 16383L;
+ values[valuesOffset++] = (block5 >>> 34) & 16383L;
+ values[valuesOffset++] = (block5 >>> 20) & 16383L;
+ values[valuesOffset++] = (block5 >>> 6) & 16383L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 8) | (block6 >>> 56);
+ values[valuesOffset++] = (block6 >>> 42) & 16383L;
+ values[valuesOffset++] = (block6 >>> 28) & 16383L;
+ values[valuesOffset++] = (block6 >>> 14) & 16383L;
+ values[valuesOffset++] = block6 & 16383L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 6) | (byte1 >>> 2);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 3) << 12) | (byte2 << 4) | (byte3 >>> 4);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 10) | (byte4 << 2) | (byte5 >>> 6);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 8) | byte6;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte7 << 6) | (byte8 >>> 2);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 10) | (byte11 << 2) | (byte12 >>> 6);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 63) << 8) | byte13;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte14 << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 6) | (byte22 >>> 2);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 12) | (byte23 << 4) | (byte24 >>> 4);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 8) | byte27;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte28 << 6) | (byte29 >>> 2);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 10) | (byte32 << 2) | (byte33 >>> 6);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 6) | (byte36 >>> 2);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 10) | (byte39 << 2) | (byte40 >>> 6);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 8) | byte41;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 6) | (byte43 >>> 2);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 8) | byte48;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 6) | (byte50 >>> 2);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 10) | (byte53 << 2) | (byte54 >>> 6);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 8) | byte55;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 14) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 14) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation15 extends BulkOperation {
+ }
+ ,
+ PACKED_15 {
- public int blocks() {
+ public int blockCount() {
return 15;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 49;
- values[vi++] = (block0 >>> 34) & 32767L;
- values[vi++] = (block0 >>> 19) & 32767L;
- values[vi++] = (block0 >>> 4) & 32767L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 11) | (block1 >>> 53);
- values[vi++] = (block1 >>> 38) & 32767L;
- values[vi++] = (block1 >>> 23) & 32767L;
- values[vi++] = (block1 >>> 8) & 32767L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 7) | (block2 >>> 57);
- values[vi++] = (block2 >>> 42) & 32767L;
- values[vi++] = (block2 >>> 27) & 32767L;
- values[vi++] = (block2 >>> 12) & 32767L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 3) | (block3 >>> 61);
- values[vi++] = (block3 >>> 46) & 32767L;
- values[vi++] = (block3 >>> 31) & 32767L;
- values[vi++] = (block3 >>> 16) & 32767L;
- values[vi++] = (block3 >>> 1) & 32767L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1L) << 14) | (block4 >>> 50);
- values[vi++] = (block4 >>> 35) & 32767L;
- values[vi++] = (block4 >>> 20) & 32767L;
- values[vi++] = (block4 >>> 5) & 32767L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 10) | (block5 >>> 54);
- values[vi++] = (block5 >>> 39) & 32767L;
- values[vi++] = (block5 >>> 24) & 32767L;
- values[vi++] = (block5 >>> 9) & 32767L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 511L) << 6) | (block6 >>> 58);
- values[vi++] = (block6 >>> 43) & 32767L;
- values[vi++] = (block6 >>> 28) & 32767L;
- values[vi++] = (block6 >>> 13) & 32767L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 8191L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 47) & 32767L;
- values[vi++] = (block7 >>> 32) & 32767L;
- values[vi++] = (block7 >>> 17) & 32767L;
- values[vi++] = (block7 >>> 2) & 32767L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 3L) << 13) | (block8 >>> 51);
- values[vi++] = (block8 >>> 36) & 32767L;
- values[vi++] = (block8 >>> 21) & 32767L;
- values[vi++] = (block8 >>> 6) & 32767L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 63L) << 9) | (block9 >>> 55);
- values[vi++] = (block9 >>> 40) & 32767L;
- values[vi++] = (block9 >>> 25) & 32767L;
- values[vi++] = (block9 >>> 10) & 32767L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 5) | (block10 >>> 59);
- values[vi++] = (block10 >>> 44) & 32767L;
- values[vi++] = (block10 >>> 29) & 32767L;
- values[vi++] = (block10 >>> 14) & 32767L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 16383L) << 1) | (block11 >>> 63);
- values[vi++] = (block11 >>> 48) & 32767L;
- values[vi++] = (block11 >>> 33) & 32767L;
- values[vi++] = (block11 >>> 18) & 32767L;
- values[vi++] = (block11 >>> 3) & 32767L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 7L) << 12) | (block12 >>> 52);
- values[vi++] = (block12 >>> 37) & 32767L;
- values[vi++] = (block12 >>> 22) & 32767L;
- values[vi++] = (block12 >>> 7) & 32767L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 127L) << 8) | (block13 >>> 56);
- values[vi++] = (block13 >>> 41) & 32767L;
- values[vi++] = (block13 >>> 26) & 32767L;
- values[vi++] = (block13 >>> 11) & 32767L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2047L) << 4) | (block14 >>> 60);
- values[vi++] = (block14 >>> 45) & 32767L;
- values[vi++] = (block14 >>> 30) & 32767L;
- values[vi++] = (block14 >>> 15) & 32767L;
- values[vi++] = block14 & 32767L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 34) | (values[vi++] << 19) | (values[vi++] << 4) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 38) | (values[vi++] << 23) | (values[vi++] << 8) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 42) | (values[vi++] << 27) | (values[vi++] << 12) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 46) | (values[vi++] << 31) | (values[vi++] << 16) | (values[vi++] << 1) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 35) | (values[vi++] << 20) | (values[vi++] << 5) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 39) | (values[vi++] << 24) | (values[vi++] << 9) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 43) | (values[vi++] << 28) | (values[vi++] << 13) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 47) | (values[vi++] << 32) | (values[vi++] << 17) | (values[vi++] << 2) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 36) | (values[vi++] << 21) | (values[vi++] << 6) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 40) | (values[vi++] << 25) | (values[vi++] << 10) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 44) | (values[vi++] << 29) | (values[vi++] << 14) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 48) | (values[vi++] << 33) | (values[vi++] << 18) | (values[vi++] << 3) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 37) | (values[vi++] << 22) | (values[vi++] << 7) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 41) | (values[vi++] << 26) | (values[vi++] << 11) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 45) | (values[vi++] << 30) | (values[vi++] << 15) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 49);
+ values[valuesOffset++] = (int) ((block0 >>> 34) & 32767L);
+ values[valuesOffset++] = (int) ((block0 >>> 19) & 32767L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 32767L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 11) | (block1 >>> 53));
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 32767L);
+ values[valuesOffset++] = (int) ((block1 >>> 23) & 32767L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 32767L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 7) | (block2 >>> 57));
+ values[valuesOffset++] = (int) ((block2 >>> 42) & 32767L);
+ values[valuesOffset++] = (int) ((block2 >>> 27) & 32767L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 32767L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 4095L) << 3) | (block3 >>> 61));
+ values[valuesOffset++] = (int) ((block3 >>> 46) & 32767L);
+ values[valuesOffset++] = (int) ((block3 >>> 31) & 32767L);
+ values[valuesOffset++] = (int) ((block3 >>> 16) & 32767L);
+ values[valuesOffset++] = (int) ((block3 >>> 1) & 32767L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 1L) << 14) | (block4 >>> 50));
+ values[valuesOffset++] = (int) ((block4 >>> 35) & 32767L);
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 32767L);
+ values[valuesOffset++] = (int) ((block4 >>> 5) & 32767L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 31L) << 10) | (block5 >>> 54));
+ values[valuesOffset++] = (int) ((block5 >>> 39) & 32767L);
+ values[valuesOffset++] = (int) ((block5 >>> 24) & 32767L);
+ values[valuesOffset++] = (int) ((block5 >>> 9) & 32767L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 511L) << 6) | (block6 >>> 58));
+ values[valuesOffset++] = (int) ((block6 >>> 43) & 32767L);
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 32767L);
+ values[valuesOffset++] = (int) ((block6 >>> 13) & 32767L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 8191L) << 2) | (block7 >>> 62));
+ values[valuesOffset++] = (int) ((block7 >>> 47) & 32767L);
+ values[valuesOffset++] = (int) ((block7 >>> 32) & 32767L);
+ values[valuesOffset++] = (int) ((block7 >>> 17) & 32767L);
+ values[valuesOffset++] = (int) ((block7 >>> 2) & 32767L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 3L) << 13) | (block8 >>> 51));
+ values[valuesOffset++] = (int) ((block8 >>> 36) & 32767L);
+ values[valuesOffset++] = (int) ((block8 >>> 21) & 32767L);
+ values[valuesOffset++] = (int) ((block8 >>> 6) & 32767L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 63L) << 9) | (block9 >>> 55));
+ values[valuesOffset++] = (int) ((block9 >>> 40) & 32767L);
+ values[valuesOffset++] = (int) ((block9 >>> 25) & 32767L);
+ values[valuesOffset++] = (int) ((block9 >>> 10) & 32767L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 1023L) << 5) | (block10 >>> 59));
+ values[valuesOffset++] = (int) ((block10 >>> 44) & 32767L);
+ values[valuesOffset++] = (int) ((block10 >>> 29) & 32767L);
+ values[valuesOffset++] = (int) ((block10 >>> 14) & 32767L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 16383L) << 1) | (block11 >>> 63));
+ values[valuesOffset++] = (int) ((block11 >>> 48) & 32767L);
+ values[valuesOffset++] = (int) ((block11 >>> 33) & 32767L);
+ values[valuesOffset++] = (int) ((block11 >>> 18) & 32767L);
+ values[valuesOffset++] = (int) ((block11 >>> 3) & 32767L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 7L) << 12) | (block12 >>> 52));
+ values[valuesOffset++] = (int) ((block12 >>> 37) & 32767L);
+ values[valuesOffset++] = (int) ((block12 >>> 22) & 32767L);
+ values[valuesOffset++] = (int) ((block12 >>> 7) & 32767L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 127L) << 8) | (block13 >>> 56));
+ values[valuesOffset++] = (int) ((block13 >>> 41) & 32767L);
+ values[valuesOffset++] = (int) ((block13 >>> 26) & 32767L);
+ values[valuesOffset++] = (int) ((block13 >>> 11) & 32767L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 2047L) << 4) | (block14 >>> 60));
+ values[valuesOffset++] = (int) ((block14 >>> 45) & 32767L);
+ values[valuesOffset++] = (int) ((block14 >>> 30) & 32767L);
+ values[valuesOffset++] = (int) ((block14 >>> 15) & 32767L);
+ values[valuesOffset++] = (int) (block14 & 32767L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 7) | (byte1 >>> 1);
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 14) | (byte2 << 6) | (byte3 >>> 2);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 13) | (byte4 << 5) | (byte5 >>> 3);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 11) | (byte8 << 3) | (byte9 >>> 5);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 31) << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 9) | (byte12 << 1) | (byte13 >>> 7);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 127) << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 7) | (byte16 >>> 1);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 13) | (byte19 << 5) | (byte20 >>> 3);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 11) | (byte23 << 3) | (byte24 >>> 5);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 31) << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 9) | (byte27 << 1) | (byte28 >>> 7);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 8) | byte29;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 7) | (byte31 >>> 1);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 13) | (byte34 << 5) | (byte35 >>> 3);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 9) | (byte42 << 1) | (byte43 >>> 7);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 127) << 8) | byte44;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 7) | (byte46 >>> 1);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 1) << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 13) | (byte49 << 5) | (byte50 >>> 3);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 11) | (byte53 << 3) | (byte54 >>> 5);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 31) << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 9) | (byte57 << 1) | (byte58 >>> 7);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 127) << 8) | byte59;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte60 << 7) | (byte61 >>> 1);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 11) | (byte68 << 3) | (byte69 >>> 5);
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 31) << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 8) | byte74;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 7) | (byte76 >>> 1);
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 1) << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 13) | (byte79 << 5) | (byte80 >>> 3);
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 7) << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 9) | (byte87 << 1) | (byte88 >>> 7);
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte88 & 127) << 8) | byte89;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 7) | (byte91 >>> 1);
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 11) | (byte98 << 3) | (byte99 >>> 5);
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 31) << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 8) | byte104;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 7) | (byte106 >>> 1);
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 13) | (byte109 << 5) | (byte110 >>> 3);
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 7) << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 11) | (byte113 << 3) | (byte114 >>> 5);
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 31) << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 8) | byte119;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 49;
+ values[valuesOffset++] = (block0 >>> 34) & 32767L;
+ values[valuesOffset++] = (block0 >>> 19) & 32767L;
+ values[valuesOffset++] = (block0 >>> 4) & 32767L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 11) | (block1 >>> 53);
+ values[valuesOffset++] = (block1 >>> 38) & 32767L;
+ values[valuesOffset++] = (block1 >>> 23) & 32767L;
+ values[valuesOffset++] = (block1 >>> 8) & 32767L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 7) | (block2 >>> 57);
+ values[valuesOffset++] = (block2 >>> 42) & 32767L;
+ values[valuesOffset++] = (block2 >>> 27) & 32767L;
+ values[valuesOffset++] = (block2 >>> 12) & 32767L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 3) | (block3 >>> 61);
+ values[valuesOffset++] = (block3 >>> 46) & 32767L;
+ values[valuesOffset++] = (block3 >>> 31) & 32767L;
+ values[valuesOffset++] = (block3 >>> 16) & 32767L;
+ values[valuesOffset++] = (block3 >>> 1) & 32767L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1L) << 14) | (block4 >>> 50);
+ values[valuesOffset++] = (block4 >>> 35) & 32767L;
+ values[valuesOffset++] = (block4 >>> 20) & 32767L;
+ values[valuesOffset++] = (block4 >>> 5) & 32767L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 10) | (block5 >>> 54);
+ values[valuesOffset++] = (block5 >>> 39) & 32767L;
+ values[valuesOffset++] = (block5 >>> 24) & 32767L;
+ values[valuesOffset++] = (block5 >>> 9) & 32767L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 511L) << 6) | (block6 >>> 58);
+ values[valuesOffset++] = (block6 >>> 43) & 32767L;
+ values[valuesOffset++] = (block6 >>> 28) & 32767L;
+ values[valuesOffset++] = (block6 >>> 13) & 32767L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 8191L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 47) & 32767L;
+ values[valuesOffset++] = (block7 >>> 32) & 32767L;
+ values[valuesOffset++] = (block7 >>> 17) & 32767L;
+ values[valuesOffset++] = (block7 >>> 2) & 32767L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 3L) << 13) | (block8 >>> 51);
+ values[valuesOffset++] = (block8 >>> 36) & 32767L;
+ values[valuesOffset++] = (block8 >>> 21) & 32767L;
+ values[valuesOffset++] = (block8 >>> 6) & 32767L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 63L) << 9) | (block9 >>> 55);
+ values[valuesOffset++] = (block9 >>> 40) & 32767L;
+ values[valuesOffset++] = (block9 >>> 25) & 32767L;
+ values[valuesOffset++] = (block9 >>> 10) & 32767L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 5) | (block10 >>> 59);
+ values[valuesOffset++] = (block10 >>> 44) & 32767L;
+ values[valuesOffset++] = (block10 >>> 29) & 32767L;
+ values[valuesOffset++] = (block10 >>> 14) & 32767L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 16383L) << 1) | (block11 >>> 63);
+ values[valuesOffset++] = (block11 >>> 48) & 32767L;
+ values[valuesOffset++] = (block11 >>> 33) & 32767L;
+ values[valuesOffset++] = (block11 >>> 18) & 32767L;
+ values[valuesOffset++] = (block11 >>> 3) & 32767L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 7L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = (block12 >>> 37) & 32767L;
+ values[valuesOffset++] = (block12 >>> 22) & 32767L;
+ values[valuesOffset++] = (block12 >>> 7) & 32767L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 127L) << 8) | (block13 >>> 56);
+ values[valuesOffset++] = (block13 >>> 41) & 32767L;
+ values[valuesOffset++] = (block13 >>> 26) & 32767L;
+ values[valuesOffset++] = (block13 >>> 11) & 32767L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2047L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = (block14 >>> 45) & 32767L;
+ values[valuesOffset++] = (block14 >>> 30) & 32767L;
+ values[valuesOffset++] = (block14 >>> 15) & 32767L;
+ values[valuesOffset++] = block14 & 32767L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 7) | (byte1 >>> 1);
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte1 & 1) << 14) | (byte2 << 6) | (byte3 >>> 2);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 13) | (byte4 << 5) | (byte5 >>> 3);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 11) | (byte8 << 3) | (byte9 >>> 5);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 31) << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 9) | (byte12 << 1) | (byte13 >>> 7);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 127) << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 7) | (byte16 >>> 1);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 13) | (byte19 << 5) | (byte20 >>> 3);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 11) | (byte23 << 3) | (byte24 >>> 5);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 31) << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 9) | (byte27 << 1) | (byte28 >>> 7);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 7) | (byte31 >>> 1);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 13) | (byte34 << 5) | (byte35 >>> 3);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 9) | (byte42 << 1) | (byte43 >>> 7);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 127) << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 7) | (byte46 >>> 1);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 1) << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 13) | (byte49 << 5) | (byte50 >>> 3);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 11) | (byte53 << 3) | (byte54 >>> 5);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 31) << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 9) | (byte57 << 1) | (byte58 >>> 7);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 127) << 8) | byte59;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte60 << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 11) | (byte68 << 3) | (byte69 >>> 5);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 31) << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 8) | byte74;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 7) | (byte76 >>> 1);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 1) << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 13) | (byte79 << 5) | (byte80 >>> 3);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 7) << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 9) | (byte87 << 1) | (byte88 >>> 7);
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte88 & 127) << 8) | byte89;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 7) | (byte91 >>> 1);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 11) | (byte98 << 3) | (byte99 >>> 5);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 31) << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 7) | (byte106 >>> 1);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 13) | (byte109 << 5) | (byte110 >>> 3);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 7) << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 11) | (byte113 << 3) | (byte114 >>> 5);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 31) << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 8) | byte119;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 15) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 15) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation16 extends BulkOperation {
+ }
+ ,
+ PACKED_16 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 4;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 48);
+ values[valuesOffset++] = (int) ((block0 >>> 32) & 65535L);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 65535L);
+ values[valuesOffset++] = (int) (block0 & 65535L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 8) | byte1;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte2 << 8) | byte3;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte4 << 8) | byte5;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 8) | byte7;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 48;
- values[vi++] = (block0 >>> 32) & 65535L;
- values[vi++] = (block0 >>> 16) & 65535L;
- values[vi++] = block0 & 65535L;
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 48;
+ values[valuesOffset++] = (block0 >>> 32) & 65535L;
+ values[valuesOffset++] = (block0 >>> 16) & 65535L;
+ values[valuesOffset++] = block0 & 65535L;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 32) | (values[vi++] << 16) | values[vi++];
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 8) | byte1;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte2 << 8) | byte3;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte4 << 8) | byte5;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 8) | byte7;
+ }
}
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 16) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 16) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation17 extends BulkOperation {
+ }
+ ,
+ PACKED_17 {
- public int blocks() {
+ public int blockCount() {
return 17;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 47;
- values[vi++] = (block0 >>> 30) & 131071L;
- values[vi++] = (block0 >>> 13) & 131071L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 8191L) << 4) | (block1 >>> 60);
- values[vi++] = (block1 >>> 43) & 131071L;
- values[vi++] = (block1 >>> 26) & 131071L;
- values[vi++] = (block1 >>> 9) & 131071L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 511L) << 8) | (block2 >>> 56);
- values[vi++] = (block2 >>> 39) & 131071L;
- values[vi++] = (block2 >>> 22) & 131071L;
- values[vi++] = (block2 >>> 5) & 131071L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 31L) << 12) | (block3 >>> 52);
- values[vi++] = (block3 >>> 35) & 131071L;
- values[vi++] = (block3 >>> 18) & 131071L;
- values[vi++] = (block3 >>> 1) & 131071L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1L) << 16) | (block4 >>> 48);
- values[vi++] = (block4 >>> 31) & 131071L;
- values[vi++] = (block4 >>> 14) & 131071L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 16383L) << 3) | (block5 >>> 61);
- values[vi++] = (block5 >>> 44) & 131071L;
- values[vi++] = (block5 >>> 27) & 131071L;
- values[vi++] = (block5 >>> 10) & 131071L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1023L) << 7) | (block6 >>> 57);
- values[vi++] = (block6 >>> 40) & 131071L;
- values[vi++] = (block6 >>> 23) & 131071L;
- values[vi++] = (block6 >>> 6) & 131071L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 63L) << 11) | (block7 >>> 53);
- values[vi++] = (block7 >>> 36) & 131071L;
- values[vi++] = (block7 >>> 19) & 131071L;
- values[vi++] = (block7 >>> 2) & 131071L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 3L) << 15) | (block8 >>> 49);
- values[vi++] = (block8 >>> 32) & 131071L;
- values[vi++] = (block8 >>> 15) & 131071L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 32767L) << 2) | (block9 >>> 62);
- values[vi++] = (block9 >>> 45) & 131071L;
- values[vi++] = (block9 >>> 28) & 131071L;
- values[vi++] = (block9 >>> 11) & 131071L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 2047L) << 6) | (block10 >>> 58);
- values[vi++] = (block10 >>> 41) & 131071L;
- values[vi++] = (block10 >>> 24) & 131071L;
- values[vi++] = (block10 >>> 7) & 131071L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 127L) << 10) | (block11 >>> 54);
- values[vi++] = (block11 >>> 37) & 131071L;
- values[vi++] = (block11 >>> 20) & 131071L;
- values[vi++] = (block11 >>> 3) & 131071L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 7L) << 14) | (block12 >>> 50);
- values[vi++] = (block12 >>> 33) & 131071L;
- values[vi++] = (block12 >>> 16) & 131071L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 65535L) << 1) | (block13 >>> 63);
- values[vi++] = (block13 >>> 46) & 131071L;
- values[vi++] = (block13 >>> 29) & 131071L;
- values[vi++] = (block13 >>> 12) & 131071L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4095L) << 5) | (block14 >>> 59);
- values[vi++] = (block14 >>> 42) & 131071L;
- values[vi++] = (block14 >>> 25) & 131071L;
- values[vi++] = (block14 >>> 8) & 131071L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 255L) << 9) | (block15 >>> 55);
- values[vi++] = (block15 >>> 38) & 131071L;
- values[vi++] = (block15 >>> 21) & 131071L;
- values[vi++] = (block15 >>> 4) & 131071L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 15L) << 13) | (block16 >>> 51);
- values[vi++] = (block16 >>> 34) & 131071L;
- values[vi++] = (block16 >>> 17) & 131071L;
- values[vi++] = block16 & 131071L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 30) | (values[vi++] << 13) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 43) | (values[vi++] << 26) | (values[vi++] << 9) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 39) | (values[vi++] << 22) | (values[vi++] << 5) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 35) | (values[vi++] << 18) | (values[vi++] << 1) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 31) | (values[vi++] << 14) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 44) | (values[vi++] << 27) | (values[vi++] << 10) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 40) | (values[vi++] << 23) | (values[vi++] << 6) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 36) | (values[vi++] << 19) | (values[vi++] << 2) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 32) | (values[vi++] << 15) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 45) | (values[vi++] << 28) | (values[vi++] << 11) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 41) | (values[vi++] << 24) | (values[vi++] << 7) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 37) | (values[vi++] << 20) | (values[vi++] << 3) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 33) | (values[vi++] << 16) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 46) | (values[vi++] << 29) | (values[vi++] << 12) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 42) | (values[vi++] << 25) | (values[vi++] << 8) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 38) | (values[vi++] << 21) | (values[vi++] << 4) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 34) | (values[vi++] << 17) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 47);
+ values[valuesOffset++] = (int) ((block0 >>> 30) & 131071L);
+ values[valuesOffset++] = (int) ((block0 >>> 13) & 131071L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 8191L) << 4) | (block1 >>> 60));
+ values[valuesOffset++] = (int) ((block1 >>> 43) & 131071L);
+ values[valuesOffset++] = (int) ((block1 >>> 26) & 131071L);
+ values[valuesOffset++] = (int) ((block1 >>> 9) & 131071L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 511L) << 8) | (block2 >>> 56));
+ values[valuesOffset++] = (int) ((block2 >>> 39) & 131071L);
+ values[valuesOffset++] = (int) ((block2 >>> 22) & 131071L);
+ values[valuesOffset++] = (int) ((block2 >>> 5) & 131071L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 31L) << 12) | (block3 >>> 52));
+ values[valuesOffset++] = (int) ((block3 >>> 35) & 131071L);
+ values[valuesOffset++] = (int) ((block3 >>> 18) & 131071L);
+ values[valuesOffset++] = (int) ((block3 >>> 1) & 131071L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 1L) << 16) | (block4 >>> 48));
+ values[valuesOffset++] = (int) ((block4 >>> 31) & 131071L);
+ values[valuesOffset++] = (int) ((block4 >>> 14) & 131071L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 16383L) << 3) | (block5 >>> 61));
+ values[valuesOffset++] = (int) ((block5 >>> 44) & 131071L);
+ values[valuesOffset++] = (int) ((block5 >>> 27) & 131071L);
+ values[valuesOffset++] = (int) ((block5 >>> 10) & 131071L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 1023L) << 7) | (block6 >>> 57));
+ values[valuesOffset++] = (int) ((block6 >>> 40) & 131071L);
+ values[valuesOffset++] = (int) ((block6 >>> 23) & 131071L);
+ values[valuesOffset++] = (int) ((block6 >>> 6) & 131071L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 63L) << 11) | (block7 >>> 53));
+ values[valuesOffset++] = (int) ((block7 >>> 36) & 131071L);
+ values[valuesOffset++] = (int) ((block7 >>> 19) & 131071L);
+ values[valuesOffset++] = (int) ((block7 >>> 2) & 131071L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 3L) << 15) | (block8 >>> 49));
+ values[valuesOffset++] = (int) ((block8 >>> 32) & 131071L);
+ values[valuesOffset++] = (int) ((block8 >>> 15) & 131071L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 32767L) << 2) | (block9 >>> 62));
+ values[valuesOffset++] = (int) ((block9 >>> 45) & 131071L);
+ values[valuesOffset++] = (int) ((block9 >>> 28) & 131071L);
+ values[valuesOffset++] = (int) ((block9 >>> 11) & 131071L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 2047L) << 6) | (block10 >>> 58));
+ values[valuesOffset++] = (int) ((block10 >>> 41) & 131071L);
+ values[valuesOffset++] = (int) ((block10 >>> 24) & 131071L);
+ values[valuesOffset++] = (int) ((block10 >>> 7) & 131071L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 127L) << 10) | (block11 >>> 54));
+ values[valuesOffset++] = (int) ((block11 >>> 37) & 131071L);
+ values[valuesOffset++] = (int) ((block11 >>> 20) & 131071L);
+ values[valuesOffset++] = (int) ((block11 >>> 3) & 131071L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 7L) << 14) | (block12 >>> 50));
+ values[valuesOffset++] = (int) ((block12 >>> 33) & 131071L);
+ values[valuesOffset++] = (int) ((block12 >>> 16) & 131071L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 65535L) << 1) | (block13 >>> 63));
+ values[valuesOffset++] = (int) ((block13 >>> 46) & 131071L);
+ values[valuesOffset++] = (int) ((block13 >>> 29) & 131071L);
+ values[valuesOffset++] = (int) ((block13 >>> 12) & 131071L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 4095L) << 5) | (block14 >>> 59));
+ values[valuesOffset++] = (int) ((block14 >>> 42) & 131071L);
+ values[valuesOffset++] = (int) ((block14 >>> 25) & 131071L);
+ values[valuesOffset++] = (int) ((block14 >>> 8) & 131071L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 255L) << 9) | (block15 >>> 55));
+ values[valuesOffset++] = (int) ((block15 >>> 38) & 131071L);
+ values[valuesOffset++] = (int) ((block15 >>> 21) & 131071L);
+ values[valuesOffset++] = (int) ((block15 >>> 4) & 131071L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 15L) << 13) | (block16 >>> 51));
+ values[valuesOffset++] = (int) ((block16 >>> 34) & 131071L);
+ values[valuesOffset++] = (int) ((block16 >>> 17) & 131071L);
+ values[valuesOffset++] = (int) (block16 & 131071L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 9) | (byte1 << 1) | (byte2 >>> 7);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 127) << 10) | (byte3 << 2) | (byte4 >>> 6);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 63) << 11) | (byte5 << 3) | (byte6 >>> 5);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 31) << 12) | (byte7 << 4) | (byte8 >>> 4);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 15) << 13) | (byte9 << 5) | (byte10 >>> 3);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 7) << 14) | (byte11 << 6) | (byte12 >>> 2);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 15) | (byte13 << 7) | (byte14 >>> 1);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 1) << 16) | (byte15 << 8) | byte16;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte17 << 9) | (byte18 << 1) | (byte19 >>> 7);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 127) << 10) | (byte20 << 2) | (byte21 >>> 6);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 63) << 11) | (byte22 << 3) | (byte23 >>> 5);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 31) << 12) | (byte24 << 4) | (byte25 >>> 4);
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 15) << 13) | (byte26 << 5) | (byte27 >>> 3);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 7) << 14) | (byte28 << 6) | (byte29 >>> 2);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 15) | (byte30 << 7) | (byte31 >>> 1);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 16) | (byte32 << 8) | byte33;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte34 << 9) | (byte35 << 1) | (byte36 >>> 7);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 127) << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 11) | (byte39 << 3) | (byte40 >>> 5);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 31) << 12) | (byte41 << 4) | (byte42 >>> 4);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 15) << 13) | (byte43 << 5) | (byte44 >>> 3);
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 14) | (byte45 << 6) | (byte46 >>> 2);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 15) | (byte47 << 7) | (byte48 >>> 1);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 1) << 16) | (byte49 << 8) | byte50;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte51 << 9) | (byte52 << 1) | (byte53 >>> 7);
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 127) << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 11) | (byte56 << 3) | (byte57 >>> 5);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 12) | (byte58 << 4) | (byte59 >>> 4);
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 15) << 13) | (byte60 << 5) | (byte61 >>> 3);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 7) << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 15) | (byte64 << 7) | (byte65 >>> 1);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 1) << 16) | (byte66 << 8) | byte67;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte68 << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 10) | (byte71 << 2) | (byte72 >>> 6);
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 63) << 11) | (byte73 << 3) | (byte74 >>> 5);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 31) << 12) | (byte75 << 4) | (byte76 >>> 4);
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 15) << 13) | (byte77 << 5) | (byte78 >>> 3);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 7) << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 15) | (byte81 << 7) | (byte82 >>> 1);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 16) | (byte83 << 8) | byte84;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte85 << 9) | (byte86 << 1) | (byte87 >>> 7);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 127) << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 11) | (byte90 << 3) | (byte91 >>> 5);
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 31) << 12) | (byte92 << 4) | (byte93 >>> 4);
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 15) << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 15) | (byte98 << 7) | (byte99 >>> 1);
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 1) << 16) | (byte100 << 8) | byte101;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte102 << 9) | (byte103 << 1) | (byte104 >>> 7);
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 127) << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 11) | (byte107 << 3) | (byte108 >>> 5);
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 31) << 12) | (byte109 << 4) | (byte110 >>> 4);
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 15) << 13) | (byte111 << 5) | (byte112 >>> 3);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 7) << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 15) | (byte115 << 7) | (byte116 >>> 1);
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 1) << 16) | (byte117 << 8) | byte118;
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 11) | (byte124 << 3) | (byte125 >>> 5);
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 31) << 12) | (byte126 << 4) | (byte127 >>> 4);
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 15) << 13) | (byte128 << 5) | (byte129 >>> 3);
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 7) << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 16) | (byte134 << 8) | byte135;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 47;
+ values[valuesOffset++] = (block0 >>> 30) & 131071L;
+ values[valuesOffset++] = (block0 >>> 13) & 131071L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 8191L) << 4) | (block1 >>> 60);
+ values[valuesOffset++] = (block1 >>> 43) & 131071L;
+ values[valuesOffset++] = (block1 >>> 26) & 131071L;
+ values[valuesOffset++] = (block1 >>> 9) & 131071L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 511L) << 8) | (block2 >>> 56);
+ values[valuesOffset++] = (block2 >>> 39) & 131071L;
+ values[valuesOffset++] = (block2 >>> 22) & 131071L;
+ values[valuesOffset++] = (block2 >>> 5) & 131071L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 31L) << 12) | (block3 >>> 52);
+ values[valuesOffset++] = (block3 >>> 35) & 131071L;
+ values[valuesOffset++] = (block3 >>> 18) & 131071L;
+ values[valuesOffset++] = (block3 >>> 1) & 131071L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1L) << 16) | (block4 >>> 48);
+ values[valuesOffset++] = (block4 >>> 31) & 131071L;
+ values[valuesOffset++] = (block4 >>> 14) & 131071L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 16383L) << 3) | (block5 >>> 61);
+ values[valuesOffset++] = (block5 >>> 44) & 131071L;
+ values[valuesOffset++] = (block5 >>> 27) & 131071L;
+ values[valuesOffset++] = (block5 >>> 10) & 131071L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1023L) << 7) | (block6 >>> 57);
+ values[valuesOffset++] = (block6 >>> 40) & 131071L;
+ values[valuesOffset++] = (block6 >>> 23) & 131071L;
+ values[valuesOffset++] = (block6 >>> 6) & 131071L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 63L) << 11) | (block7 >>> 53);
+ values[valuesOffset++] = (block7 >>> 36) & 131071L;
+ values[valuesOffset++] = (block7 >>> 19) & 131071L;
+ values[valuesOffset++] = (block7 >>> 2) & 131071L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 3L) << 15) | (block8 >>> 49);
+ values[valuesOffset++] = (block8 >>> 32) & 131071L;
+ values[valuesOffset++] = (block8 >>> 15) & 131071L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 32767L) << 2) | (block9 >>> 62);
+ values[valuesOffset++] = (block9 >>> 45) & 131071L;
+ values[valuesOffset++] = (block9 >>> 28) & 131071L;
+ values[valuesOffset++] = (block9 >>> 11) & 131071L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 2047L) << 6) | (block10 >>> 58);
+ values[valuesOffset++] = (block10 >>> 41) & 131071L;
+ values[valuesOffset++] = (block10 >>> 24) & 131071L;
+ values[valuesOffset++] = (block10 >>> 7) & 131071L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 127L) << 10) | (block11 >>> 54);
+ values[valuesOffset++] = (block11 >>> 37) & 131071L;
+ values[valuesOffset++] = (block11 >>> 20) & 131071L;
+ values[valuesOffset++] = (block11 >>> 3) & 131071L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 7L) << 14) | (block12 >>> 50);
+ values[valuesOffset++] = (block12 >>> 33) & 131071L;
+ values[valuesOffset++] = (block12 >>> 16) & 131071L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 65535L) << 1) | (block13 >>> 63);
+ values[valuesOffset++] = (block13 >>> 46) & 131071L;
+ values[valuesOffset++] = (block13 >>> 29) & 131071L;
+ values[valuesOffset++] = (block13 >>> 12) & 131071L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4095L) << 5) | (block14 >>> 59);
+ values[valuesOffset++] = (block14 >>> 42) & 131071L;
+ values[valuesOffset++] = (block14 >>> 25) & 131071L;
+ values[valuesOffset++] = (block14 >>> 8) & 131071L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 255L) << 9) | (block15 >>> 55);
+ values[valuesOffset++] = (block15 >>> 38) & 131071L;
+ values[valuesOffset++] = (block15 >>> 21) & 131071L;
+ values[valuesOffset++] = (block15 >>> 4) & 131071L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 15L) << 13) | (block16 >>> 51);
+ values[valuesOffset++] = (block16 >>> 34) & 131071L;
+ values[valuesOffset++] = (block16 >>> 17) & 131071L;
+ values[valuesOffset++] = block16 & 131071L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 9) | (byte1 << 1) | (byte2 >>> 7);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 127) << 10) | (byte3 << 2) | (byte4 >>> 6);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 63) << 11) | (byte5 << 3) | (byte6 >>> 5);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 31) << 12) | (byte7 << 4) | (byte8 >>> 4);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 15) << 13) | (byte9 << 5) | (byte10 >>> 3);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 7) << 14) | (byte11 << 6) | (byte12 >>> 2);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 15) | (byte13 << 7) | (byte14 >>> 1);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 1) << 16) | (byte15 << 8) | byte16;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte17 << 9) | (byte18 << 1) | (byte19 >>> 7);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 127) << 10) | (byte20 << 2) | (byte21 >>> 6);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 63) << 11) | (byte22 << 3) | (byte23 >>> 5);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 31) << 12) | (byte24 << 4) | (byte25 >>> 4);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 15) << 13) | (byte26 << 5) | (byte27 >>> 3);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 7) << 14) | (byte28 << 6) | (byte29 >>> 2);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 15) | (byte30 << 7) | (byte31 >>> 1);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 16) | (byte32 << 8) | byte33;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte34 << 9) | (byte35 << 1) | (byte36 >>> 7);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 127) << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 11) | (byte39 << 3) | (byte40 >>> 5);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 31) << 12) | (byte41 << 4) | (byte42 >>> 4);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 15) << 13) | (byte43 << 5) | (byte44 >>> 3);
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 14) | (byte45 << 6) | (byte46 >>> 2);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 15) | (byte47 << 7) | (byte48 >>> 1);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 1) << 16) | (byte49 << 8) | byte50;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte51 << 9) | (byte52 << 1) | (byte53 >>> 7);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 127) << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 11) | (byte56 << 3) | (byte57 >>> 5);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 12) | (byte58 << 4) | (byte59 >>> 4);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 15) << 13) | (byte60 << 5) | (byte61 >>> 3);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 7) << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 15) | (byte64 << 7) | (byte65 >>> 1);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 1) << 16) | (byte66 << 8) | byte67;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte68 << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 10) | (byte71 << 2) | (byte72 >>> 6);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 63) << 11) | (byte73 << 3) | (byte74 >>> 5);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 31) << 12) | (byte75 << 4) | (byte76 >>> 4);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 15) << 13) | (byte77 << 5) | (byte78 >>> 3);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 7) << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 15) | (byte81 << 7) | (byte82 >>> 1);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 16) | (byte83 << 8) | byte84;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte85 << 9) | (byte86 << 1) | (byte87 >>> 7);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 127) << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 11) | (byte90 << 3) | (byte91 >>> 5);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 31) << 12) | (byte92 << 4) | (byte93 >>> 4);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 15) << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 15) | (byte98 << 7) | (byte99 >>> 1);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 1) << 16) | (byte100 << 8) | byte101;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte102 << 9) | (byte103 << 1) | (byte104 >>> 7);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 127) << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 11) | (byte107 << 3) | (byte108 >>> 5);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 31) << 12) | (byte109 << 4) | (byte110 >>> 4);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 15) << 13) | (byte111 << 5) | (byte112 >>> 3);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 7) << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 15) | (byte115 << 7) | (byte116 >>> 1);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 1) << 16) | (byte117 << 8) | byte118;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 11) | (byte124 << 3) | (byte125 >>> 5);
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 31) << 12) | (byte126 << 4) | (byte127 >>> 4);
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 15) << 13) | (byte128 << 5) | (byte129 >>> 3);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 7) << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 16) | (byte134 << 8) | byte135;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 17) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 17) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation18 extends BulkOperation {
+ }
+ ,
+ PACKED_18 {
- public int blocks() {
+ public int blockCount() {
return 9;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 46;
- values[vi++] = (block0 >>> 28) & 262143L;
- values[vi++] = (block0 >>> 10) & 262143L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1023L) << 8) | (block1 >>> 56);
- values[vi++] = (block1 >>> 38) & 262143L;
- values[vi++] = (block1 >>> 20) & 262143L;
- values[vi++] = (block1 >>> 2) & 262143L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 16) | (block2 >>> 48);
- values[vi++] = (block2 >>> 30) & 262143L;
- values[vi++] = (block2 >>> 12) & 262143L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 6) | (block3 >>> 58);
- values[vi++] = (block3 >>> 40) & 262143L;
- values[vi++] = (block3 >>> 22) & 262143L;
- values[vi++] = (block3 >>> 4) & 262143L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 14) | (block4 >>> 50);
- values[vi++] = (block4 >>> 32) & 262143L;
- values[vi++] = (block4 >>> 14) & 262143L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 16383L) << 4) | (block5 >>> 60);
- values[vi++] = (block5 >>> 42) & 262143L;
- values[vi++] = (block5 >>> 24) & 262143L;
- values[vi++] = (block5 >>> 6) & 262143L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 12) | (block6 >>> 52);
- values[vi++] = (block6 >>> 34) & 262143L;
- values[vi++] = (block6 >>> 16) & 262143L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 65535L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 44) & 262143L;
- values[vi++] = (block7 >>> 26) & 262143L;
- values[vi++] = (block7 >>> 8) & 262143L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 10) | (block8 >>> 54);
- values[vi++] = (block8 >>> 36) & 262143L;
- values[vi++] = (block8 >>> 18) & 262143L;
- values[vi++] = block8 & 262143L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 28) | (values[vi++] << 10) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 38) | (values[vi++] << 20) | (values[vi++] << 2) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 30) | (values[vi++] << 12) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 40) | (values[vi++] << 22) | (values[vi++] << 4) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 32) | (values[vi++] << 14) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 42) | (values[vi++] << 24) | (values[vi++] << 6) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 34) | (values[vi++] << 16) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 44) | (values[vi++] << 26) | (values[vi++] << 8) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 36) | (values[vi++] << 18) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 46);
+ values[valuesOffset++] = (int) ((block0 >>> 28) & 262143L);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 262143L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1023L) << 8) | (block1 >>> 56));
+ values[valuesOffset++] = (int) ((block1 >>> 38) & 262143L);
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 262143L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 262143L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 16) | (block2 >>> 48));
+ values[valuesOffset++] = (int) ((block2 >>> 30) & 262143L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 262143L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 4095L) << 6) | (block3 >>> 58));
+ values[valuesOffset++] = (int) ((block3 >>> 40) & 262143L);
+ values[valuesOffset++] = (int) ((block3 >>> 22) & 262143L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 262143L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 14) | (block4 >>> 50));
+ values[valuesOffset++] = (int) ((block4 >>> 32) & 262143L);
+ values[valuesOffset++] = (int) ((block4 >>> 14) & 262143L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 16383L) << 4) | (block5 >>> 60));
+ values[valuesOffset++] = (int) ((block5 >>> 42) & 262143L);
+ values[valuesOffset++] = (int) ((block5 >>> 24) & 262143L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 262143L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 12) | (block6 >>> 52));
+ values[valuesOffset++] = (int) ((block6 >>> 34) & 262143L);
+ values[valuesOffset++] = (int) ((block6 >>> 16) & 262143L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 65535L) << 2) | (block7 >>> 62));
+ values[valuesOffset++] = (int) ((block7 >>> 44) & 262143L);
+ values[valuesOffset++] = (int) ((block7 >>> 26) & 262143L);
+ values[valuesOffset++] = (int) ((block7 >>> 8) & 262143L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 255L) << 10) | (block8 >>> 54));
+ values[valuesOffset++] = (int) ((block8 >>> 36) & 262143L);
+ values[valuesOffset++] = (int) ((block8 >>> 18) & 262143L);
+ values[valuesOffset++] = (int) (block8 & 262143L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 10) | (byte1 << 2) | (byte2 >>> 6);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 63) << 12) | (byte3 << 4) | (byte4 >>> 4);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 14) | (byte5 << 6) | (byte6 >>> 2);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 16) | (byte7 << 8) | byte8;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 16) | (byte16 << 8) | byte17;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 10) | (byte19 << 2) | (byte20 >>> 6);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 14) | (byte23 << 6) | (byte24 >>> 2);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 16) | (byte25 << 8) | byte26;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 16) | (byte34 << 8) | byte35;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte36 << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 16) | (byte43 << 8) | byte44;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 14) | (byte50 << 6) | (byte51 >>> 2);
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 16) | (byte52 << 8) | byte53;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 14) | (byte59 << 6) | (byte60 >>> 2);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 16) | (byte61 << 8) | byte62;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 10) | (byte64 << 2) | (byte65 >>> 6);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 14) | (byte68 << 6) | (byte69 >>> 2);
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 16) | (byte70 << 8) | byte71;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 46;
+ values[valuesOffset++] = (block0 >>> 28) & 262143L;
+ values[valuesOffset++] = (block0 >>> 10) & 262143L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1023L) << 8) | (block1 >>> 56);
+ values[valuesOffset++] = (block1 >>> 38) & 262143L;
+ values[valuesOffset++] = (block1 >>> 20) & 262143L;
+ values[valuesOffset++] = (block1 >>> 2) & 262143L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 16) | (block2 >>> 48);
+ values[valuesOffset++] = (block2 >>> 30) & 262143L;
+ values[valuesOffset++] = (block2 >>> 12) & 262143L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 6) | (block3 >>> 58);
+ values[valuesOffset++] = (block3 >>> 40) & 262143L;
+ values[valuesOffset++] = (block3 >>> 22) & 262143L;
+ values[valuesOffset++] = (block3 >>> 4) & 262143L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 14) | (block4 >>> 50);
+ values[valuesOffset++] = (block4 >>> 32) & 262143L;
+ values[valuesOffset++] = (block4 >>> 14) & 262143L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 16383L) << 4) | (block5 >>> 60);
+ values[valuesOffset++] = (block5 >>> 42) & 262143L;
+ values[valuesOffset++] = (block5 >>> 24) & 262143L;
+ values[valuesOffset++] = (block5 >>> 6) & 262143L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 12) | (block6 >>> 52);
+ values[valuesOffset++] = (block6 >>> 34) & 262143L;
+ values[valuesOffset++] = (block6 >>> 16) & 262143L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 65535L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 44) & 262143L;
+ values[valuesOffset++] = (block7 >>> 26) & 262143L;
+ values[valuesOffset++] = (block7 >>> 8) & 262143L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 10) | (block8 >>> 54);
+ values[valuesOffset++] = (block8 >>> 36) & 262143L;
+ values[valuesOffset++] = (block8 >>> 18) & 262143L;
+ values[valuesOffset++] = block8 & 262143L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 10) | (byte1 << 2) | (byte2 >>> 6);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 63) << 12) | (byte3 << 4) | (byte4 >>> 4);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 14) | (byte5 << 6) | (byte6 >>> 2);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 16) | (byte7 << 8) | byte8;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 16) | (byte16 << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 10) | (byte19 << 2) | (byte20 >>> 6);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 14) | (byte23 << 6) | (byte24 >>> 2);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 16) | (byte25 << 8) | byte26;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 16) | (byte34 << 8) | byte35;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte36 << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 16) | (byte43 << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 14) | (byte50 << 6) | (byte51 >>> 2);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 16) | (byte52 << 8) | byte53;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 14) | (byte59 << 6) | (byte60 >>> 2);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 16) | (byte61 << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 10) | (byte64 << 2) | (byte65 >>> 6);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 14) | (byte68 << 6) | (byte69 >>> 2);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 16) | (byte70 << 8) | byte71;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 18) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 18) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation19 extends BulkOperation {
+ }
+ ,
+ PACKED_19 {
- public int blocks() {
+ public int blockCount() {
return 19;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 45;
- values[vi++] = (block0 >>> 26) & 524287L;
- values[vi++] = (block0 >>> 7) & 524287L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 127L) << 12) | (block1 >>> 52);
- values[vi++] = (block1 >>> 33) & 524287L;
- values[vi++] = (block1 >>> 14) & 524287L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 16383L) << 5) | (block2 >>> 59);
- values[vi++] = (block2 >>> 40) & 524287L;
- values[vi++] = (block2 >>> 21) & 524287L;
- values[vi++] = (block2 >>> 2) & 524287L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 3L) << 17) | (block3 >>> 47);
- values[vi++] = (block3 >>> 28) & 524287L;
- values[vi++] = (block3 >>> 9) & 524287L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 511L) << 10) | (block4 >>> 54);
- values[vi++] = (block4 >>> 35) & 524287L;
- values[vi++] = (block4 >>> 16) & 524287L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 65535L) << 3) | (block5 >>> 61);
- values[vi++] = (block5 >>> 42) & 524287L;
- values[vi++] = (block5 >>> 23) & 524287L;
- values[vi++] = (block5 >>> 4) & 524287L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 15L) << 15) | (block6 >>> 49);
- values[vi++] = (block6 >>> 30) & 524287L;
- values[vi++] = (block6 >>> 11) & 524287L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 2047L) << 8) | (block7 >>> 56);
- values[vi++] = (block7 >>> 37) & 524287L;
- values[vi++] = (block7 >>> 18) & 524287L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 262143L) << 1) | (block8 >>> 63);
- values[vi++] = (block8 >>> 44) & 524287L;
- values[vi++] = (block8 >>> 25) & 524287L;
- values[vi++] = (block8 >>> 6) & 524287L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 63L) << 13) | (block9 >>> 51);
- values[vi++] = (block9 >>> 32) & 524287L;
- values[vi++] = (block9 >>> 13) & 524287L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 8191L) << 6) | (block10 >>> 58);
- values[vi++] = (block10 >>> 39) & 524287L;
- values[vi++] = (block10 >>> 20) & 524287L;
- values[vi++] = (block10 >>> 1) & 524287L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 1L) << 18) | (block11 >>> 46);
- values[vi++] = (block11 >>> 27) & 524287L;
- values[vi++] = (block11 >>> 8) & 524287L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 255L) << 11) | (block12 >>> 53);
- values[vi++] = (block12 >>> 34) & 524287L;
- values[vi++] = (block12 >>> 15) & 524287L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 32767L) << 4) | (block13 >>> 60);
- values[vi++] = (block13 >>> 41) & 524287L;
- values[vi++] = (block13 >>> 22) & 524287L;
- values[vi++] = (block13 >>> 3) & 524287L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 7L) << 16) | (block14 >>> 48);
- values[vi++] = (block14 >>> 29) & 524287L;
- values[vi++] = (block14 >>> 10) & 524287L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1023L) << 9) | (block15 >>> 55);
- values[vi++] = (block15 >>> 36) & 524287L;
- values[vi++] = (block15 >>> 17) & 524287L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 131071L) << 2) | (block16 >>> 62);
- values[vi++] = (block16 >>> 43) & 524287L;
- values[vi++] = (block16 >>> 24) & 524287L;
- values[vi++] = (block16 >>> 5) & 524287L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 31L) << 14) | (block17 >>> 50);
- values[vi++] = (block17 >>> 31) & 524287L;
- values[vi++] = (block17 >>> 12) & 524287L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 4095L) << 7) | (block18 >>> 57);
- values[vi++] = (block18 >>> 38) & 524287L;
- values[vi++] = (block18 >>> 19) & 524287L;
- values[vi++] = block18 & 524287L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 26) | (values[vi++] << 7) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 33) | (values[vi++] << 14) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 40) | (values[vi++] << 21) | (values[vi++] << 2) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 28) | (values[vi++] << 9) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 35) | (values[vi++] << 16) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 42) | (values[vi++] << 23) | (values[vi++] << 4) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 30) | (values[vi++] << 11) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 37) | (values[vi++] << 18) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 44) | (values[vi++] << 25) | (values[vi++] << 6) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 32) | (values[vi++] << 13) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 39) | (values[vi++] << 20) | (values[vi++] << 1) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 27) | (values[vi++] << 8) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 34) | (values[vi++] << 15) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 41) | (values[vi++] << 22) | (values[vi++] << 3) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 29) | (values[vi++] << 10) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 36) | (values[vi++] << 17) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 43) | (values[vi++] << 24) | (values[vi++] << 5) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 31) | (values[vi++] << 12) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 38) | (values[vi++] << 19) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 45);
+ values[valuesOffset++] = (int) ((block0 >>> 26) & 524287L);
+ values[valuesOffset++] = (int) ((block0 >>> 7) & 524287L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 127L) << 12) | (block1 >>> 52));
+ values[valuesOffset++] = (int) ((block1 >>> 33) & 524287L);
+ values[valuesOffset++] = (int) ((block1 >>> 14) & 524287L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 16383L) << 5) | (block2 >>> 59));
+ values[valuesOffset++] = (int) ((block2 >>> 40) & 524287L);
+ values[valuesOffset++] = (int) ((block2 >>> 21) & 524287L);
+ values[valuesOffset++] = (int) ((block2 >>> 2) & 524287L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 3L) << 17) | (block3 >>> 47));
+ values[valuesOffset++] = (int) ((block3 >>> 28) & 524287L);
+ values[valuesOffset++] = (int) ((block3 >>> 9) & 524287L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 511L) << 10) | (block4 >>> 54));
+ values[valuesOffset++] = (int) ((block4 >>> 35) & 524287L);
+ values[valuesOffset++] = (int) ((block4 >>> 16) & 524287L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 65535L) << 3) | (block5 >>> 61));
+ values[valuesOffset++] = (int) ((block5 >>> 42) & 524287L);
+ values[valuesOffset++] = (int) ((block5 >>> 23) & 524287L);
+ values[valuesOffset++] = (int) ((block5 >>> 4) & 524287L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 15L) << 15) | (block6 >>> 49));
+ values[valuesOffset++] = (int) ((block6 >>> 30) & 524287L);
+ values[valuesOffset++] = (int) ((block6 >>> 11) & 524287L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 2047L) << 8) | (block7 >>> 56));
+ values[valuesOffset++] = (int) ((block7 >>> 37) & 524287L);
+ values[valuesOffset++] = (int) ((block7 >>> 18) & 524287L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 262143L) << 1) | (block8 >>> 63));
+ values[valuesOffset++] = (int) ((block8 >>> 44) & 524287L);
+ values[valuesOffset++] = (int) ((block8 >>> 25) & 524287L);
+ values[valuesOffset++] = (int) ((block8 >>> 6) & 524287L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 63L) << 13) | (block9 >>> 51));
+ values[valuesOffset++] = (int) ((block9 >>> 32) & 524287L);
+ values[valuesOffset++] = (int) ((block9 >>> 13) & 524287L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 8191L) << 6) | (block10 >>> 58));
+ values[valuesOffset++] = (int) ((block10 >>> 39) & 524287L);
+ values[valuesOffset++] = (int) ((block10 >>> 20) & 524287L);
+ values[valuesOffset++] = (int) ((block10 >>> 1) & 524287L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 1L) << 18) | (block11 >>> 46));
+ values[valuesOffset++] = (int) ((block11 >>> 27) & 524287L);
+ values[valuesOffset++] = (int) ((block11 >>> 8) & 524287L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 255L) << 11) | (block12 >>> 53));
+ values[valuesOffset++] = (int) ((block12 >>> 34) & 524287L);
+ values[valuesOffset++] = (int) ((block12 >>> 15) & 524287L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 32767L) << 4) | (block13 >>> 60));
+ values[valuesOffset++] = (int) ((block13 >>> 41) & 524287L);
+ values[valuesOffset++] = (int) ((block13 >>> 22) & 524287L);
+ values[valuesOffset++] = (int) ((block13 >>> 3) & 524287L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 7L) << 16) | (block14 >>> 48));
+ values[valuesOffset++] = (int) ((block14 >>> 29) & 524287L);
+ values[valuesOffset++] = (int) ((block14 >>> 10) & 524287L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 1023L) << 9) | (block15 >>> 55));
+ values[valuesOffset++] = (int) ((block15 >>> 36) & 524287L);
+ values[valuesOffset++] = (int) ((block15 >>> 17) & 524287L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 131071L) << 2) | (block16 >>> 62));
+ values[valuesOffset++] = (int) ((block16 >>> 43) & 524287L);
+ values[valuesOffset++] = (int) ((block16 >>> 24) & 524287L);
+ values[valuesOffset++] = (int) ((block16 >>> 5) & 524287L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 31L) << 14) | (block17 >>> 50));
+ values[valuesOffset++] = (int) ((block17 >>> 31) & 524287L);
+ values[valuesOffset++] = (int) ((block17 >>> 12) & 524287L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 4095L) << 7) | (block18 >>> 57));
+ values[valuesOffset++] = (int) ((block18 >>> 38) & 524287L);
+ values[valuesOffset++] = (int) ((block18 >>> 19) & 524287L);
+ values[valuesOffset++] = (int) (block18 & 524287L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 11) | (byte1 << 3) | (byte2 >>> 5);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 31) << 14) | (byte3 << 6) | (byte4 >>> 2);
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 3) << 17) | (byte5 << 9) | (byte6 << 1) | (byte7 >>> 7);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 127) << 12) | (byte8 << 4) | (byte9 >>> 4);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 15) << 15) | (byte10 << 7) | (byte11 >>> 1);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 1) << 18) | (byte12 << 10) | (byte13 << 2) | (byte14 >>> 6);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 63) << 13) | (byte15 << 5) | (byte16 >>> 3);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 7) << 16) | (byte17 << 8) | byte18;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte19 << 11) | (byte20 << 3) | (byte21 >>> 5);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 31) << 14) | (byte22 << 6) | (byte23 >>> 2);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 17) | (byte24 << 9) | (byte25 << 1) | (byte26 >>> 7);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 127) << 12) | (byte27 << 4) | (byte28 >>> 4);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 15) << 15) | (byte29 << 7) | (byte30 >>> 1);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 1) << 18) | (byte31 << 10) | (byte32 << 2) | (byte33 >>> 6);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 13) | (byte34 << 5) | (byte35 >>> 3);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 16) | (byte36 << 8) | byte37;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte38 << 11) | (byte39 << 3) | (byte40 >>> 5);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 31) << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 17) | (byte43 << 9) | (byte44 << 1) | (byte45 >>> 7);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 127) << 12) | (byte46 << 4) | (byte47 >>> 4);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 15) << 15) | (byte48 << 7) | (byte49 >>> 1);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 18) | (byte50 << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 13) | (byte53 << 5) | (byte54 >>> 3);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 7) << 16) | (byte55 << 8) | byte56;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte57 << 11) | (byte58 << 3) | (byte59 >>> 5);
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 31) << 14) | (byte60 << 6) | (byte61 >>> 2);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 17) | (byte62 << 9) | (byte63 << 1) | (byte64 >>> 7);
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 12) | (byte65 << 4) | (byte66 >>> 4);
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 15) << 15) | (byte67 << 7) | (byte68 >>> 1);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 1) << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 13) | (byte72 << 5) | (byte73 >>> 3);
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 7) << 16) | (byte74 << 8) | byte75;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte76 << 11) | (byte77 << 3) | (byte78 >>> 5);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 17) | (byte81 << 9) | (byte82 << 1) | (byte83 >>> 7);
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 127) << 12) | (byte84 << 4) | (byte85 >>> 4);
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 15) << 15) | (byte86 << 7) | (byte87 >>> 1);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 1) << 18) | (byte88 << 10) | (byte89 << 2) | (byte90 >>> 6);
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 63) << 13) | (byte91 << 5) | (byte92 >>> 3);
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 16) | (byte93 << 8) | byte94;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte95 << 11) | (byte96 << 3) | (byte97 >>> 5);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 31) << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 17) | (byte100 << 9) | (byte101 << 1) | (byte102 >>> 7);
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 127) << 12) | (byte103 << 4) | (byte104 >>> 4);
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 15) << 15) | (byte105 << 7) | (byte106 >>> 1);
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 13) | (byte110 << 5) | (byte111 >>> 3);
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 7) << 16) | (byte112 << 8) | byte113;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte114 << 11) | (byte115 << 3) | (byte116 >>> 5);
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 31) << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 17) | (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 12) | (byte122 << 4) | (byte123 >>> 4);
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 15) << 15) | (byte124 << 7) | (byte125 >>> 1);
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 1) << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 13) | (byte129 << 5) | (byte130 >>> 3);
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 7) << 16) | (byte131 << 8) | byte132;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte133 << 11) | (byte134 << 3) | (byte135 >>> 5);
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 31) << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 17) | (byte138 << 9) | (byte139 << 1) | (byte140 >>> 7);
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 127) << 12) | (byte141 << 4) | (byte142 >>> 4);
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte142 & 15) << 15) | (byte143 << 7) | (byte144 >>> 1);
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 1) << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 16) | (byte150 << 8) | byte151;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 45;
+ values[valuesOffset++] = (block0 >>> 26) & 524287L;
+ values[valuesOffset++] = (block0 >>> 7) & 524287L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 127L) << 12) | (block1 >>> 52);
+ values[valuesOffset++] = (block1 >>> 33) & 524287L;
+ values[valuesOffset++] = (block1 >>> 14) & 524287L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 16383L) << 5) | (block2 >>> 59);
+ values[valuesOffset++] = (block2 >>> 40) & 524287L;
+ values[valuesOffset++] = (block2 >>> 21) & 524287L;
+ values[valuesOffset++] = (block2 >>> 2) & 524287L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 3L) << 17) | (block3 >>> 47);
+ values[valuesOffset++] = (block3 >>> 28) & 524287L;
+ values[valuesOffset++] = (block3 >>> 9) & 524287L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 511L) << 10) | (block4 >>> 54);
+ values[valuesOffset++] = (block4 >>> 35) & 524287L;
+ values[valuesOffset++] = (block4 >>> 16) & 524287L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 65535L) << 3) | (block5 >>> 61);
+ values[valuesOffset++] = (block5 >>> 42) & 524287L;
+ values[valuesOffset++] = (block5 >>> 23) & 524287L;
+ values[valuesOffset++] = (block5 >>> 4) & 524287L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 15L) << 15) | (block6 >>> 49);
+ values[valuesOffset++] = (block6 >>> 30) & 524287L;
+ values[valuesOffset++] = (block6 >>> 11) & 524287L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 2047L) << 8) | (block7 >>> 56);
+ values[valuesOffset++] = (block7 >>> 37) & 524287L;
+ values[valuesOffset++] = (block7 >>> 18) & 524287L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 262143L) << 1) | (block8 >>> 63);
+ values[valuesOffset++] = (block8 >>> 44) & 524287L;
+ values[valuesOffset++] = (block8 >>> 25) & 524287L;
+ values[valuesOffset++] = (block8 >>> 6) & 524287L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 63L) << 13) | (block9 >>> 51);
+ values[valuesOffset++] = (block9 >>> 32) & 524287L;
+ values[valuesOffset++] = (block9 >>> 13) & 524287L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 8191L) << 6) | (block10 >>> 58);
+ values[valuesOffset++] = (block10 >>> 39) & 524287L;
+ values[valuesOffset++] = (block10 >>> 20) & 524287L;
+ values[valuesOffset++] = (block10 >>> 1) & 524287L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 1L) << 18) | (block11 >>> 46);
+ values[valuesOffset++] = (block11 >>> 27) & 524287L;
+ values[valuesOffset++] = (block11 >>> 8) & 524287L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 255L) << 11) | (block12 >>> 53);
+ values[valuesOffset++] = (block12 >>> 34) & 524287L;
+ values[valuesOffset++] = (block12 >>> 15) & 524287L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 32767L) << 4) | (block13 >>> 60);
+ values[valuesOffset++] = (block13 >>> 41) & 524287L;
+ values[valuesOffset++] = (block13 >>> 22) & 524287L;
+ values[valuesOffset++] = (block13 >>> 3) & 524287L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 7L) << 16) | (block14 >>> 48);
+ values[valuesOffset++] = (block14 >>> 29) & 524287L;
+ values[valuesOffset++] = (block14 >>> 10) & 524287L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1023L) << 9) | (block15 >>> 55);
+ values[valuesOffset++] = (block15 >>> 36) & 524287L;
+ values[valuesOffset++] = (block15 >>> 17) & 524287L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 131071L) << 2) | (block16 >>> 62);
+ values[valuesOffset++] = (block16 >>> 43) & 524287L;
+ values[valuesOffset++] = (block16 >>> 24) & 524287L;
+ values[valuesOffset++] = (block16 >>> 5) & 524287L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 31L) << 14) | (block17 >>> 50);
+ values[valuesOffset++] = (block17 >>> 31) & 524287L;
+ values[valuesOffset++] = (block17 >>> 12) & 524287L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 4095L) << 7) | (block18 >>> 57);
+ values[valuesOffset++] = (block18 >>> 38) & 524287L;
+ values[valuesOffset++] = (block18 >>> 19) & 524287L;
+ values[valuesOffset++] = block18 & 524287L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 11) | (byte1 << 3) | (byte2 >>> 5);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 31) << 14) | (byte3 << 6) | (byte4 >>> 2);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 3) << 17) | (byte5 << 9) | (byte6 << 1) | (byte7 >>> 7);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 127) << 12) | (byte8 << 4) | (byte9 >>> 4);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 15) << 15) | (byte10 << 7) | (byte11 >>> 1);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 1) << 18) | (byte12 << 10) | (byte13 << 2) | (byte14 >>> 6);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 63) << 13) | (byte15 << 5) | (byte16 >>> 3);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 7) << 16) | (byte17 << 8) | byte18;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte19 << 11) | (byte20 << 3) | (byte21 >>> 5);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 31) << 14) | (byte22 << 6) | (byte23 >>> 2);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 17) | (byte24 << 9) | (byte25 << 1) | (byte26 >>> 7);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 127) << 12) | (byte27 << 4) | (byte28 >>> 4);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 15) << 15) | (byte29 << 7) | (byte30 >>> 1);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 1) << 18) | (byte31 << 10) | (byte32 << 2) | (byte33 >>> 6);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 13) | (byte34 << 5) | (byte35 >>> 3);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 16) | (byte36 << 8) | byte37;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte38 << 11) | (byte39 << 3) | (byte40 >>> 5);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 31) << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 17) | (byte43 << 9) | (byte44 << 1) | (byte45 >>> 7);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 127) << 12) | (byte46 << 4) | (byte47 >>> 4);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 15) << 15) | (byte48 << 7) | (byte49 >>> 1);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 18) | (byte50 << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 13) | (byte53 << 5) | (byte54 >>> 3);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 7) << 16) | (byte55 << 8) | byte56;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte57 << 11) | (byte58 << 3) | (byte59 >>> 5);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 31) << 14) | (byte60 << 6) | (byte61 >>> 2);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 17) | (byte62 << 9) | (byte63 << 1) | (byte64 >>> 7);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 12) | (byte65 << 4) | (byte66 >>> 4);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 15) << 15) | (byte67 << 7) | (byte68 >>> 1);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 1) << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 13) | (byte72 << 5) | (byte73 >>> 3);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 7) << 16) | (byte74 << 8) | byte75;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte76 << 11) | (byte77 << 3) | (byte78 >>> 5);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 17) | (byte81 << 9) | (byte82 << 1) | (byte83 >>> 7);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 127) << 12) | (byte84 << 4) | (byte85 >>> 4);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 15) << 15) | (byte86 << 7) | (byte87 >>> 1);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 1) << 18) | (byte88 << 10) | (byte89 << 2) | (byte90 >>> 6);
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 63) << 13) | (byte91 << 5) | (byte92 >>> 3);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 16) | (byte93 << 8) | byte94;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte95 << 11) | (byte96 << 3) | (byte97 >>> 5);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 31) << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 17) | (byte100 << 9) | (byte101 << 1) | (byte102 >>> 7);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 127) << 12) | (byte103 << 4) | (byte104 >>> 4);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 15) << 15) | (byte105 << 7) | (byte106 >>> 1);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 13) | (byte110 << 5) | (byte111 >>> 3);
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 7) << 16) | (byte112 << 8) | byte113;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte114 << 11) | (byte115 << 3) | (byte116 >>> 5);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 31) << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 17) | (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 12) | (byte122 << 4) | (byte123 >>> 4);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 15) << 15) | (byte124 << 7) | (byte125 >>> 1);
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 1) << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 13) | (byte129 << 5) | (byte130 >>> 3);
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 7) << 16) | (byte131 << 8) | byte132;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte133 << 11) | (byte134 << 3) | (byte135 >>> 5);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 31) << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 17) | (byte138 << 9) | (byte139 << 1) | (byte140 >>> 7);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 127) << 12) | (byte141 << 4) | (byte142 >>> 4);
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte142 & 15) << 15) | (byte143 << 7) | (byte144 >>> 1);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 1) << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 16) | (byte150 << 8) | byte151;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 19) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 19) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation20 extends BulkOperation {
+ }
+ ,
+ PACKED_20 {
- public int blocks() {
+ public int blockCount() {
return 5;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 44;
- values[vi++] = (block0 >>> 24) & 1048575L;
- values[vi++] = (block0 >>> 4) & 1048575L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 16) | (block1 >>> 48);
- values[vi++] = (block1 >>> 28) & 1048575L;
- values[vi++] = (block1 >>> 8) & 1048575L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 12) | (block2 >>> 52);
- values[vi++] = (block2 >>> 32) & 1048575L;
- values[vi++] = (block2 >>> 12) & 1048575L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 8) | (block3 >>> 56);
- values[vi++] = (block3 >>> 36) & 1048575L;
- values[vi++] = (block3 >>> 16) & 1048575L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 65535L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 40) & 1048575L;
- values[vi++] = (block4 >>> 20) & 1048575L;
- values[vi++] = block4 & 1048575L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 44);
+ values[valuesOffset++] = (int) ((block0 >>> 24) & 1048575L);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 1048575L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 16) | (block1 >>> 48));
+ values[valuesOffset++] = (int) ((block1 >>> 28) & 1048575L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 1048575L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 12) | (block2 >>> 52));
+ values[valuesOffset++] = (int) ((block2 >>> 32) & 1048575L);
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 1048575L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 4095L) << 8) | (block3 >>> 56));
+ values[valuesOffset++] = (int) ((block3 >>> 36) & 1048575L);
+ values[valuesOffset++] = (int) ((block3 >>> 16) & 1048575L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 65535L) << 4) | (block4 >>> 60));
+ values[valuesOffset++] = (int) ((block4 >>> 40) & 1048575L);
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 1048575L);
+ values[valuesOffset++] = (int) (block4 & 1048575L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 12) | (byte1 << 4) | (byte2 >>> 4);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 16) | (byte3 << 8) | byte4;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte5 << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 16) | (byte8 << 8) | byte9;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte10 << 12) | (byte11 << 4) | (byte12 >>> 4);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 16) | (byte13 << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 16) | (byte18 << 8) | byte19;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 16) | (byte23 << 8) | byte24;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 16) | (byte28 << 8) | byte29;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 16) | (byte33 << 8) | byte34;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 16) | (byte38 << 8) | byte39;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 44;
+ values[valuesOffset++] = (block0 >>> 24) & 1048575L;
+ values[valuesOffset++] = (block0 >>> 4) & 1048575L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 16) | (block1 >>> 48);
+ values[valuesOffset++] = (block1 >>> 28) & 1048575L;
+ values[valuesOffset++] = (block1 >>> 8) & 1048575L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 12) | (block2 >>> 52);
+ values[valuesOffset++] = (block2 >>> 32) & 1048575L;
+ values[valuesOffset++] = (block2 >>> 12) & 1048575L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 8) | (block3 >>> 56);
+ values[valuesOffset++] = (block3 >>> 36) & 1048575L;
+ values[valuesOffset++] = (block3 >>> 16) & 1048575L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 65535L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 40) & 1048575L;
+ values[valuesOffset++] = (block4 >>> 20) & 1048575L;
+ values[valuesOffset++] = block4 & 1048575L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 12) | (byte1 << 4) | (byte2 >>> 4);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 15) << 16) | (byte3 << 8) | byte4;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte5 << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 16) | (byte8 << 8) | byte9;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte10 << 12) | (byte11 << 4) | (byte12 >>> 4);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 16) | (byte13 << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 16) | (byte18 << 8) | byte19;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 16) | (byte23 << 8) | byte24;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 16) | (byte28 << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 16) | (byte33 << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 16) | (byte38 << 8) | byte39;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 20) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 20) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 24) | (values[vi++] << 4) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 28) | (values[vi++] << 8) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 32) | (values[vi++] << 12) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 36) | (values[vi++] << 16) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 40) | (values[vi++] << 20) | values[vi++];
- }
}
- }
-
- static final class Packed64BulkOperation21 extends BulkOperation {
+ ,
+ PACKED_21 {
- public int blocks() {
+ public int blockCount() {
return 21;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 43;
- values[vi++] = (block0 >>> 22) & 2097151L;
- values[vi++] = (block0 >>> 1) & 2097151L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1L) << 20) | (block1 >>> 44);
- values[vi++] = (block1 >>> 23) & 2097151L;
- values[vi++] = (block1 >>> 2) & 2097151L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 19) | (block2 >>> 45);
- values[vi++] = (block2 >>> 24) & 2097151L;
- values[vi++] = (block2 >>> 3) & 2097151L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 7L) << 18) | (block3 >>> 46);
- values[vi++] = (block3 >>> 25) & 2097151L;
- values[vi++] = (block3 >>> 4) & 2097151L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 17) | (block4 >>> 47);
- values[vi++] = (block4 >>> 26) & 2097151L;
- values[vi++] = (block4 >>> 5) & 2097151L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 16) | (block5 >>> 48);
- values[vi++] = (block5 >>> 27) & 2097151L;
- values[vi++] = (block5 >>> 6) & 2097151L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 15) | (block6 >>> 49);
- values[vi++] = (block6 >>> 28) & 2097151L;
- values[vi++] = (block6 >>> 7) & 2097151L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 127L) << 14) | (block7 >>> 50);
- values[vi++] = (block7 >>> 29) & 2097151L;
- values[vi++] = (block7 >>> 8) & 2097151L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 13) | (block8 >>> 51);
- values[vi++] = (block8 >>> 30) & 2097151L;
- values[vi++] = (block8 >>> 9) & 2097151L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 511L) << 12) | (block9 >>> 52);
- values[vi++] = (block9 >>> 31) & 2097151L;
- values[vi++] = (block9 >>> 10) & 2097151L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 11) | (block10 >>> 53);
- values[vi++] = (block10 >>> 32) & 2097151L;
- values[vi++] = (block10 >>> 11) & 2097151L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 2047L) << 10) | (block11 >>> 54);
- values[vi++] = (block11 >>> 33) & 2097151L;
- values[vi++] = (block11 >>> 12) & 2097151L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4095L) << 9) | (block12 >>> 55);
- values[vi++] = (block12 >>> 34) & 2097151L;
- values[vi++] = (block12 >>> 13) & 2097151L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 8191L) << 8) | (block13 >>> 56);
- values[vi++] = (block13 >>> 35) & 2097151L;
- values[vi++] = (block13 >>> 14) & 2097151L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 16383L) << 7) | (block14 >>> 57);
- values[vi++] = (block14 >>> 36) & 2097151L;
- values[vi++] = (block14 >>> 15) & 2097151L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 32767L) << 6) | (block15 >>> 58);
- values[vi++] = (block15 >>> 37) & 2097151L;
- values[vi++] = (block15 >>> 16) & 2097151L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 65535L) << 5) | (block16 >>> 59);
- values[vi++] = (block16 >>> 38) & 2097151L;
- values[vi++] = (block16 >>> 17) & 2097151L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 131071L) << 4) | (block17 >>> 60);
- values[vi++] = (block17 >>> 39) & 2097151L;
- values[vi++] = (block17 >>> 18) & 2097151L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 262143L) << 3) | (block18 >>> 61);
- values[vi++] = (block18 >>> 40) & 2097151L;
- values[vi++] = (block18 >>> 19) & 2097151L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 524287L) << 2) | (block19 >>> 62);
- values[vi++] = (block19 >>> 41) & 2097151L;
- values[vi++] = (block19 >>> 20) & 2097151L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1048575L) << 1) | (block20 >>> 63);
- values[vi++] = (block20 >>> 42) & 2097151L;
- values[vi++] = (block20 >>> 21) & 2097151L;
- values[vi++] = block20 & 2097151L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 22) | (values[vi++] << 1) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 23) | (values[vi++] << 2) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 24) | (values[vi++] << 3) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 25) | (values[vi++] << 4) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 26) | (values[vi++] << 5) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 27) | (values[vi++] << 6) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 28) | (values[vi++] << 7) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 29) | (values[vi++] << 8) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 30) | (values[vi++] << 9) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 31) | (values[vi++] << 10) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 32) | (values[vi++] << 11) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 33) | (values[vi++] << 12) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 34) | (values[vi++] << 13) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 35) | (values[vi++] << 14) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 36) | (values[vi++] << 15) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 37) | (values[vi++] << 16) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 38) | (values[vi++] << 17) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 39) | (values[vi++] << 18) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 40) | (values[vi++] << 19) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 41) | (values[vi++] << 20) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 42) | (values[vi++] << 21) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 43);
+ values[valuesOffset++] = (int) ((block0 >>> 22) & 2097151L);
+ values[valuesOffset++] = (int) ((block0 >>> 1) & 2097151L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1L) << 20) | (block1 >>> 44));
+ values[valuesOffset++] = (int) ((block1 >>> 23) & 2097151L);
+ values[valuesOffset++] = (int) ((block1 >>> 2) & 2097151L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 3L) << 19) | (block2 >>> 45));
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 2097151L);
+ values[valuesOffset++] = (int) ((block2 >>> 3) & 2097151L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 7L) << 18) | (block3 >>> 46));
+ values[valuesOffset++] = (int) ((block3 >>> 25) & 2097151L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 2097151L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 17) | (block4 >>> 47));
+ values[valuesOffset++] = (int) ((block4 >>> 26) & 2097151L);
+ values[valuesOffset++] = (int) ((block4 >>> 5) & 2097151L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 31L) << 16) | (block5 >>> 48));
+ values[valuesOffset++] = (int) ((block5 >>> 27) & 2097151L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 2097151L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 15) | (block6 >>> 49));
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 2097151L);
+ values[valuesOffset++] = (int) ((block6 >>> 7) & 2097151L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 127L) << 14) | (block7 >>> 50));
+ values[valuesOffset++] = (int) ((block7 >>> 29) & 2097151L);
+ values[valuesOffset++] = (int) ((block7 >>> 8) & 2097151L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 255L) << 13) | (block8 >>> 51));
+ values[valuesOffset++] = (int) ((block8 >>> 30) & 2097151L);
+ values[valuesOffset++] = (int) ((block8 >>> 9) & 2097151L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 511L) << 12) | (block9 >>> 52));
+ values[valuesOffset++] = (int) ((block9 >>> 31) & 2097151L);
+ values[valuesOffset++] = (int) ((block9 >>> 10) & 2097151L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 1023L) << 11) | (block10 >>> 53));
+ values[valuesOffset++] = (int) ((block10 >>> 32) & 2097151L);
+ values[valuesOffset++] = (int) ((block10 >>> 11) & 2097151L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 2047L) << 10) | (block11 >>> 54));
+ values[valuesOffset++] = (int) ((block11 >>> 33) & 2097151L);
+ values[valuesOffset++] = (int) ((block11 >>> 12) & 2097151L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 4095L) << 9) | (block12 >>> 55));
+ values[valuesOffset++] = (int) ((block12 >>> 34) & 2097151L);
+ values[valuesOffset++] = (int) ((block12 >>> 13) & 2097151L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 8191L) << 8) | (block13 >>> 56));
+ values[valuesOffset++] = (int) ((block13 >>> 35) & 2097151L);
+ values[valuesOffset++] = (int) ((block13 >>> 14) & 2097151L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 16383L) << 7) | (block14 >>> 57));
+ values[valuesOffset++] = (int) ((block14 >>> 36) & 2097151L);
+ values[valuesOffset++] = (int) ((block14 >>> 15) & 2097151L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 32767L) << 6) | (block15 >>> 58));
+ values[valuesOffset++] = (int) ((block15 >>> 37) & 2097151L);
+ values[valuesOffset++] = (int) ((block15 >>> 16) & 2097151L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 65535L) << 5) | (block16 >>> 59));
+ values[valuesOffset++] = (int) ((block16 >>> 38) & 2097151L);
+ values[valuesOffset++] = (int) ((block16 >>> 17) & 2097151L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 131071L) << 4) | (block17 >>> 60));
+ values[valuesOffset++] = (int) ((block17 >>> 39) & 2097151L);
+ values[valuesOffset++] = (int) ((block17 >>> 18) & 2097151L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 262143L) << 3) | (block18 >>> 61));
+ values[valuesOffset++] = (int) ((block18 >>> 40) & 2097151L);
+ values[valuesOffset++] = (int) ((block18 >>> 19) & 2097151L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 524287L) << 2) | (block19 >>> 62));
+ values[valuesOffset++] = (int) ((block19 >>> 41) & 2097151L);
+ values[valuesOffset++] = (int) ((block19 >>> 20) & 2097151L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 1048575L) << 1) | (block20 >>> 63));
+ values[valuesOffset++] = (int) ((block20 >>> 42) & 2097151L);
+ values[valuesOffset++] = (int) ((block20 >>> 21) & 2097151L);
+ values[valuesOffset++] = (int) (block20 & 2097151L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 13) | (byte1 << 5) | (byte2 >>> 3);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 7) << 18) | (byte3 << 10) | (byte4 << 2) | (byte5 >>> 6);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 15) | (byte6 << 7) | (byte7 >>> 1);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 20) | (byte8 << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 17) | (byte11 << 9) | (byte12 << 1) | (byte13 >>> 7);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 127) << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 19) | (byte16 << 11) | (byte17 << 3) | (byte18 >>> 5);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 31) << 16) | (byte19 << 8) | byte20;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 13) | (byte22 << 5) | (byte23 >>> 3);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 15) | (byte27 << 7) | (byte28 >>> 1);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 17) | (byte32 << 9) | (byte33 << 1) | (byte34 >>> 7);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 127) << 14) | (byte35 << 6) | (byte36 >>> 2);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 19) | (byte37 << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 16) | (byte40 << 8) | byte41;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 13) | (byte43 << 5) | (byte44 >>> 3);
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 15) | (byte48 << 7) | (byte49 >>> 1);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 17) | (byte53 << 9) | (byte54 << 1) | (byte55 >>> 7);
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 19) | (byte58 << 11) | (byte59 << 3) | (byte60 >>> 5);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 31) << 16) | (byte61 << 8) | byte62;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 15) | (byte69 << 7) | (byte70 >>> 1);
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 20) | (byte71 << 12) | (byte72 << 4) | (byte73 >>> 4);
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 15) << 17) | (byte74 << 9) | (byte75 << 1) | (byte76 >>> 7);
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 127) << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 19) | (byte79 << 11) | (byte80 << 3) | (byte81 >>> 5);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 31) << 16) | (byte82 << 8) | byte83;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte84 << 13) | (byte85 << 5) | (byte86 >>> 3);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 18) | (byte87 << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 15) | (byte90 << 7) | (byte91 >>> 1);
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 17) | (byte95 << 9) | (byte96 << 1) | (byte97 >>> 7);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 127) << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 19) | (byte100 << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 16) | (byte103 << 8) | byte104;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 13) | (byte106 << 5) | (byte107 >>> 3);
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 7) << 18) | (byte108 << 10) | (byte109 << 2) | (byte110 >>> 6);
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 63) << 15) | (byte111 << 7) | (byte112 >>> 1);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 1) << 20) | (byte113 << 12) | (byte114 << 4) | (byte115 >>> 4);
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 15) << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 19) | (byte121 << 11) | (byte122 << 3) | (byte123 >>> 5);
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 31) << 16) | (byte124 << 8) | byte125;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte126 << 13) | (byte127 << 5) | (byte128 >>> 3);
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 7) << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 20) | (byte134 << 12) | (byte135 << 4) | (byte136 >>> 4);
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte136 & 15) << 17) | (byte137 << 9) | (byte138 << 1) | (byte139 >>> 7);
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 127) << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 19) | (byte142 << 11) | (byte143 << 3) | (byte144 >>> 5);
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 31) << 16) | (byte145 << 8) | byte146;
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte147 << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 15) | (byte153 << 7) | (byte154 >>> 1);
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte154 & 1) << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 17) | (byte158 << 9) | (byte159 << 1) | (byte160 >>> 7);
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte160 & 127) << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 16) | (byte166 << 8) | byte167;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 43;
+ values[valuesOffset++] = (block0 >>> 22) & 2097151L;
+ values[valuesOffset++] = (block0 >>> 1) & 2097151L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1L) << 20) | (block1 >>> 44);
+ values[valuesOffset++] = (block1 >>> 23) & 2097151L;
+ values[valuesOffset++] = (block1 >>> 2) & 2097151L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 19) | (block2 >>> 45);
+ values[valuesOffset++] = (block2 >>> 24) & 2097151L;
+ values[valuesOffset++] = (block2 >>> 3) & 2097151L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 7L) << 18) | (block3 >>> 46);
+ values[valuesOffset++] = (block3 >>> 25) & 2097151L;
+ values[valuesOffset++] = (block3 >>> 4) & 2097151L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 17) | (block4 >>> 47);
+ values[valuesOffset++] = (block4 >>> 26) & 2097151L;
+ values[valuesOffset++] = (block4 >>> 5) & 2097151L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 16) | (block5 >>> 48);
+ values[valuesOffset++] = (block5 >>> 27) & 2097151L;
+ values[valuesOffset++] = (block5 >>> 6) & 2097151L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 15) | (block6 >>> 49);
+ values[valuesOffset++] = (block6 >>> 28) & 2097151L;
+ values[valuesOffset++] = (block6 >>> 7) & 2097151L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 127L) << 14) | (block7 >>> 50);
+ values[valuesOffset++] = (block7 >>> 29) & 2097151L;
+ values[valuesOffset++] = (block7 >>> 8) & 2097151L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 13) | (block8 >>> 51);
+ values[valuesOffset++] = (block8 >>> 30) & 2097151L;
+ values[valuesOffset++] = (block8 >>> 9) & 2097151L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 511L) << 12) | (block9 >>> 52);
+ values[valuesOffset++] = (block9 >>> 31) & 2097151L;
+ values[valuesOffset++] = (block9 >>> 10) & 2097151L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 11) | (block10 >>> 53);
+ values[valuesOffset++] = (block10 >>> 32) & 2097151L;
+ values[valuesOffset++] = (block10 >>> 11) & 2097151L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 2047L) << 10) | (block11 >>> 54);
+ values[valuesOffset++] = (block11 >>> 33) & 2097151L;
+ values[valuesOffset++] = (block11 >>> 12) & 2097151L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4095L) << 9) | (block12 >>> 55);
+ values[valuesOffset++] = (block12 >>> 34) & 2097151L;
+ values[valuesOffset++] = (block12 >>> 13) & 2097151L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 8191L) << 8) | (block13 >>> 56);
+ values[valuesOffset++] = (block13 >>> 35) & 2097151L;
+ values[valuesOffset++] = (block13 >>> 14) & 2097151L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 16383L) << 7) | (block14 >>> 57);
+ values[valuesOffset++] = (block14 >>> 36) & 2097151L;
+ values[valuesOffset++] = (block14 >>> 15) & 2097151L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 32767L) << 6) | (block15 >>> 58);
+ values[valuesOffset++] = (block15 >>> 37) & 2097151L;
+ values[valuesOffset++] = (block15 >>> 16) & 2097151L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 65535L) << 5) | (block16 >>> 59);
+ values[valuesOffset++] = (block16 >>> 38) & 2097151L;
+ values[valuesOffset++] = (block16 >>> 17) & 2097151L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 131071L) << 4) | (block17 >>> 60);
+ values[valuesOffset++] = (block17 >>> 39) & 2097151L;
+ values[valuesOffset++] = (block17 >>> 18) & 2097151L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 262143L) << 3) | (block18 >>> 61);
+ values[valuesOffset++] = (block18 >>> 40) & 2097151L;
+ values[valuesOffset++] = (block18 >>> 19) & 2097151L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 524287L) << 2) | (block19 >>> 62);
+ values[valuesOffset++] = (block19 >>> 41) & 2097151L;
+ values[valuesOffset++] = (block19 >>> 20) & 2097151L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1048575L) << 1) | (block20 >>> 63);
+ values[valuesOffset++] = (block20 >>> 42) & 2097151L;
+ values[valuesOffset++] = (block20 >>> 21) & 2097151L;
+ values[valuesOffset++] = block20 & 2097151L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 13) | (byte1 << 5) | (byte2 >>> 3);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 7) << 18) | (byte3 << 10) | (byte4 << 2) | (byte5 >>> 6);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 15) | (byte6 << 7) | (byte7 >>> 1);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 20) | (byte8 << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 17) | (byte11 << 9) | (byte12 << 1) | (byte13 >>> 7);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 127) << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 19) | (byte16 << 11) | (byte17 << 3) | (byte18 >>> 5);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 31) << 16) | (byte19 << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 13) | (byte22 << 5) | (byte23 >>> 3);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 15) | (byte27 << 7) | (byte28 >>> 1);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 17) | (byte32 << 9) | (byte33 << 1) | (byte34 >>> 7);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 127) << 14) | (byte35 << 6) | (byte36 >>> 2);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 19) | (byte37 << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 16) | (byte40 << 8) | byte41;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 13) | (byte43 << 5) | (byte44 >>> 3);
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 15) | (byte48 << 7) | (byte49 >>> 1);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 17) | (byte53 << 9) | (byte54 << 1) | (byte55 >>> 7);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 19) | (byte58 << 11) | (byte59 << 3) | (byte60 >>> 5);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 31) << 16) | (byte61 << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 15) | (byte69 << 7) | (byte70 >>> 1);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 20) | (byte71 << 12) | (byte72 << 4) | (byte73 >>> 4);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 15) << 17) | (byte74 << 9) | (byte75 << 1) | (byte76 >>> 7);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 127) << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 19) | (byte79 << 11) | (byte80 << 3) | (byte81 >>> 5);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 31) << 16) | (byte82 << 8) | byte83;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte84 << 13) | (byte85 << 5) | (byte86 >>> 3);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 18) | (byte87 << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 15) | (byte90 << 7) | (byte91 >>> 1);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 17) | (byte95 << 9) | (byte96 << 1) | (byte97 >>> 7);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 127) << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 19) | (byte100 << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 16) | (byte103 << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 13) | (byte106 << 5) | (byte107 >>> 3);
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 7) << 18) | (byte108 << 10) | (byte109 << 2) | (byte110 >>> 6);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 63) << 15) | (byte111 << 7) | (byte112 >>> 1);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 1) << 20) | (byte113 << 12) | (byte114 << 4) | (byte115 >>> 4);
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 15) << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 19) | (byte121 << 11) | (byte122 << 3) | (byte123 >>> 5);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 31) << 16) | (byte124 << 8) | byte125;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte126 << 13) | (byte127 << 5) | (byte128 >>> 3);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 7) << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 20) | (byte134 << 12) | (byte135 << 4) | (byte136 >>> 4);
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte136 & 15) << 17) | (byte137 << 9) | (byte138 << 1) | (byte139 >>> 7);
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 127) << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 19) | (byte142 << 11) | (byte143 << 3) | (byte144 >>> 5);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 31) << 16) | (byte145 << 8) | byte146;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte147 << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 15) | (byte153 << 7) | (byte154 >>> 1);
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte154 & 1) << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 17) | (byte158 << 9) | (byte159 << 1) | (byte160 >>> 7);
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte160 & 127) << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 16) | (byte166 << 8) | byte167;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 21) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 21) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation22 extends BulkOperation {
+ }
+ ,
+ PACKED_22 {
- public int blocks() {
+ public int blockCount() {
return 11;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 42;
- values[vi++] = (block0 >>> 20) & 4194303L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1048575L) << 2) | (block1 >>> 62);
- values[vi++] = (block1 >>> 40) & 4194303L;
- values[vi++] = (block1 >>> 18) & 4194303L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 262143L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 38) & 4194303L;
- values[vi++] = (block2 >>> 16) & 4194303L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 65535L) << 6) | (block3 >>> 58);
- values[vi++] = (block3 >>> 36) & 4194303L;
- values[vi++] = (block3 >>> 14) & 4194303L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 16383L) << 8) | (block4 >>> 56);
- values[vi++] = (block4 >>> 34) & 4194303L;
- values[vi++] = (block4 >>> 12) & 4194303L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 4095L) << 10) | (block5 >>> 54);
- values[vi++] = (block5 >>> 32) & 4194303L;
- values[vi++] = (block5 >>> 10) & 4194303L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1023L) << 12) | (block6 >>> 52);
- values[vi++] = (block6 >>> 30) & 4194303L;
- values[vi++] = (block6 >>> 8) & 4194303L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 255L) << 14) | (block7 >>> 50);
- values[vi++] = (block7 >>> 28) & 4194303L;
- values[vi++] = (block7 >>> 6) & 4194303L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 63L) << 16) | (block8 >>> 48);
- values[vi++] = (block8 >>> 26) & 4194303L;
- values[vi++] = (block8 >>> 4) & 4194303L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 18) | (block9 >>> 46);
- values[vi++] = (block9 >>> 24) & 4194303L;
- values[vi++] = (block9 >>> 2) & 4194303L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 3L) << 20) | (block10 >>> 44);
- values[vi++] = (block10 >>> 22) & 4194303L;
- values[vi++] = block10 & 4194303L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 20) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 40) | (values[vi++] << 18) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 38) | (values[vi++] << 16) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 36) | (values[vi++] << 14) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 34) | (values[vi++] << 12) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 32) | (values[vi++] << 10) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 30) | (values[vi++] << 8) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 28) | (values[vi++] << 6) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 26) | (values[vi++] << 4) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 24) | (values[vi++] << 2) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 22) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 42);
+ values[valuesOffset++] = (int) ((block0 >>> 20) & 4194303L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1048575L) << 2) | (block1 >>> 62));
+ values[valuesOffset++] = (int) ((block1 >>> 40) & 4194303L);
+ values[valuesOffset++] = (int) ((block1 >>> 18) & 4194303L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 262143L) << 4) | (block2 >>> 60));
+ values[valuesOffset++] = (int) ((block2 >>> 38) & 4194303L);
+ values[valuesOffset++] = (int) ((block2 >>> 16) & 4194303L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 65535L) << 6) | (block3 >>> 58));
+ values[valuesOffset++] = (int) ((block3 >>> 36) & 4194303L);
+ values[valuesOffset++] = (int) ((block3 >>> 14) & 4194303L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 16383L) << 8) | (block4 >>> 56));
+ values[valuesOffset++] = (int) ((block4 >>> 34) & 4194303L);
+ values[valuesOffset++] = (int) ((block4 >>> 12) & 4194303L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 4095L) << 10) | (block5 >>> 54));
+ values[valuesOffset++] = (int) ((block5 >>> 32) & 4194303L);
+ values[valuesOffset++] = (int) ((block5 >>> 10) & 4194303L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 1023L) << 12) | (block6 >>> 52));
+ values[valuesOffset++] = (int) ((block6 >>> 30) & 4194303L);
+ values[valuesOffset++] = (int) ((block6 >>> 8) & 4194303L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 255L) << 14) | (block7 >>> 50));
+ values[valuesOffset++] = (int) ((block7 >>> 28) & 4194303L);
+ values[valuesOffset++] = (int) ((block7 >>> 6) & 4194303L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 63L) << 16) | (block8 >>> 48));
+ values[valuesOffset++] = (int) ((block8 >>> 26) & 4194303L);
+ values[valuesOffset++] = (int) ((block8 >>> 4) & 4194303L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 15L) << 18) | (block9 >>> 46));
+ values[valuesOffset++] = (int) ((block9 >>> 24) & 4194303L);
+ values[valuesOffset++] = (int) ((block9 >>> 2) & 4194303L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 3L) << 20) | (block10 >>> 44));
+ values[valuesOffset++] = (int) ((block10 >>> 22) & 4194303L);
+ values[valuesOffset++] = (int) (block10 & 4194303L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 14) | (byte1 << 6) | (byte2 >>> 2);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 3) << 20) | (byte3 << 12) | (byte4 << 4) | (byte5 >>> 4);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 15) << 18) | (byte6 << 10) | (byte7 << 2) | (byte8 >>> 6);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 63) << 16) | (byte9 << 8) | byte10;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte11 << 14) | (byte12 << 6) | (byte13 >>> 2);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 20) | (byte14 << 12) | (byte15 << 4) | (byte16 >>> 4);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 18) | (byte17 << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 16) | (byte20 << 8) | byte21;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte22 << 14) | (byte23 << 6) | (byte24 >>> 2);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 20) | (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 18) | (byte28 << 10) | (byte29 << 2) | (byte30 >>> 6);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 63) << 16) | (byte31 << 8) | byte32;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 14) | (byte34 << 6) | (byte35 >>> 2);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 20) | (byte36 << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 16) | (byte42 << 8) | byte43;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte44 << 14) | (byte45 << 6) | (byte46 >>> 2);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 20) | (byte47 << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 18) | (byte50 << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 16) | (byte53 << 8) | byte54;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 20) | (byte58 << 12) | (byte59 << 4) | (byte60 >>> 4);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 15) << 18) | (byte61 << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 16) | (byte64 << 8) | byte65;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 16) | (byte75 << 8) | byte76;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte77 << 14) | (byte78 << 6) | (byte79 >>> 2);
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 18) | (byte83 << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 16) | (byte86 << 8) | byte87;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 42;
+ values[valuesOffset++] = (block0 >>> 20) & 4194303L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1048575L) << 2) | (block1 >>> 62);
+ values[valuesOffset++] = (block1 >>> 40) & 4194303L;
+ values[valuesOffset++] = (block1 >>> 18) & 4194303L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 262143L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 38) & 4194303L;
+ values[valuesOffset++] = (block2 >>> 16) & 4194303L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 65535L) << 6) | (block3 >>> 58);
+ values[valuesOffset++] = (block3 >>> 36) & 4194303L;
+ values[valuesOffset++] = (block3 >>> 14) & 4194303L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 16383L) << 8) | (block4 >>> 56);
+ values[valuesOffset++] = (block4 >>> 34) & 4194303L;
+ values[valuesOffset++] = (block4 >>> 12) & 4194303L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 4095L) << 10) | (block5 >>> 54);
+ values[valuesOffset++] = (block5 >>> 32) & 4194303L;
+ values[valuesOffset++] = (block5 >>> 10) & 4194303L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1023L) << 12) | (block6 >>> 52);
+ values[valuesOffset++] = (block6 >>> 30) & 4194303L;
+ values[valuesOffset++] = (block6 >>> 8) & 4194303L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 255L) << 14) | (block7 >>> 50);
+ values[valuesOffset++] = (block7 >>> 28) & 4194303L;
+ values[valuesOffset++] = (block7 >>> 6) & 4194303L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 63L) << 16) | (block8 >>> 48);
+ values[valuesOffset++] = (block8 >>> 26) & 4194303L;
+ values[valuesOffset++] = (block8 >>> 4) & 4194303L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 18) | (block9 >>> 46);
+ values[valuesOffset++] = (block9 >>> 24) & 4194303L;
+ values[valuesOffset++] = (block9 >>> 2) & 4194303L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 3L) << 20) | (block10 >>> 44);
+ values[valuesOffset++] = (block10 >>> 22) & 4194303L;
+ values[valuesOffset++] = block10 & 4194303L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 14) | (byte1 << 6) | (byte2 >>> 2);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 3) << 20) | (byte3 << 12) | (byte4 << 4) | (byte5 >>> 4);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 15) << 18) | (byte6 << 10) | (byte7 << 2) | (byte8 >>> 6);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 63) << 16) | (byte9 << 8) | byte10;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte11 << 14) | (byte12 << 6) | (byte13 >>> 2);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 20) | (byte14 << 12) | (byte15 << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 18) | (byte17 << 10) | (byte18 << 2) | (byte19 >>> 6);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 63) << 16) | (byte20 << 8) | byte21;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte22 << 14) | (byte23 << 6) | (byte24 >>> 2);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 20) | (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 18) | (byte28 << 10) | (byte29 << 2) | (byte30 >>> 6);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 63) << 16) | (byte31 << 8) | byte32;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 14) | (byte34 << 6) | (byte35 >>> 2);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 20) | (byte36 << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 16) | (byte42 << 8) | byte43;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte44 << 14) | (byte45 << 6) | (byte46 >>> 2);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 20) | (byte47 << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 18) | (byte50 << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 16) | (byte53 << 8) | byte54;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 20) | (byte58 << 12) | (byte59 << 4) | (byte60 >>> 4);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 15) << 18) | (byte61 << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 16) | (byte64 << 8) | byte65;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 16) | (byte75 << 8) | byte76;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte77 << 14) | (byte78 << 6) | (byte79 >>> 2);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 18) | (byte83 << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 16) | (byte86 << 8) | byte87;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 22) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 22) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation23 extends BulkOperation {
+ }
+ ,
+ PACKED_23 {
- public int blocks() {
+ public int blockCount() {
return 23;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 41;
- values[vi++] = (block0 >>> 18) & 8388607L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 262143L) << 5) | (block1 >>> 59);
- values[vi++] = (block1 >>> 36) & 8388607L;
- values[vi++] = (block1 >>> 13) & 8388607L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 8191L) << 10) | (block2 >>> 54);
- values[vi++] = (block2 >>> 31) & 8388607L;
- values[vi++] = (block2 >>> 8) & 8388607L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 255L) << 15) | (block3 >>> 49);
- values[vi++] = (block3 >>> 26) & 8388607L;
- values[vi++] = (block3 >>> 3) & 8388607L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 7L) << 20) | (block4 >>> 44);
- values[vi++] = (block4 >>> 21) & 8388607L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 2097151L) << 2) | (block5 >>> 62);
- values[vi++] = (block5 >>> 39) & 8388607L;
- values[vi++] = (block5 >>> 16) & 8388607L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 65535L) << 7) | (block6 >>> 57);
- values[vi++] = (block6 >>> 34) & 8388607L;
- values[vi++] = (block6 >>> 11) & 8388607L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 2047L) << 12) | (block7 >>> 52);
- values[vi++] = (block7 >>> 29) & 8388607L;
- values[vi++] = (block7 >>> 6) & 8388607L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 63L) << 17) | (block8 >>> 47);
- values[vi++] = (block8 >>> 24) & 8388607L;
- values[vi++] = (block8 >>> 1) & 8388607L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 1L) << 22) | (block9 >>> 42);
- values[vi++] = (block9 >>> 19) & 8388607L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 524287L) << 4) | (block10 >>> 60);
- values[vi++] = (block10 >>> 37) & 8388607L;
- values[vi++] = (block10 >>> 14) & 8388607L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 16383L) << 9) | (block11 >>> 55);
- values[vi++] = (block11 >>> 32) & 8388607L;
- values[vi++] = (block11 >>> 9) & 8388607L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 511L) << 14) | (block12 >>> 50);
- values[vi++] = (block12 >>> 27) & 8388607L;
- values[vi++] = (block12 >>> 4) & 8388607L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 15L) << 19) | (block13 >>> 45);
- values[vi++] = (block13 >>> 22) & 8388607L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4194303L) << 1) | (block14 >>> 63);
- values[vi++] = (block14 >>> 40) & 8388607L;
- values[vi++] = (block14 >>> 17) & 8388607L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 131071L) << 6) | (block15 >>> 58);
- values[vi++] = (block15 >>> 35) & 8388607L;
- values[vi++] = (block15 >>> 12) & 8388607L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 4095L) << 11) | (block16 >>> 53);
- values[vi++] = (block16 >>> 30) & 8388607L;
- values[vi++] = (block16 >>> 7) & 8388607L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 127L) << 16) | (block17 >>> 48);
- values[vi++] = (block17 >>> 25) & 8388607L;
- values[vi++] = (block17 >>> 2) & 8388607L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 3L) << 21) | (block18 >>> 43);
- values[vi++] = (block18 >>> 20) & 8388607L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1048575L) << 3) | (block19 >>> 61);
- values[vi++] = (block19 >>> 38) & 8388607L;
- values[vi++] = (block19 >>> 15) & 8388607L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 32767L) << 8) | (block20 >>> 56);
- values[vi++] = (block20 >>> 33) & 8388607L;
- values[vi++] = (block20 >>> 10) & 8388607L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 1023L) << 13) | (block21 >>> 51);
- values[vi++] = (block21 >>> 28) & 8388607L;
- values[vi++] = (block21 >>> 5) & 8388607L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 31L) << 18) | (block22 >>> 46);
- values[vi++] = (block22 >>> 23) & 8388607L;
- values[vi++] = block22 & 8388607L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 18) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 36) | (values[vi++] << 13) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 31) | (values[vi++] << 8) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 26) | (values[vi++] << 3) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 21) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 39) | (values[vi++] << 16) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 34) | (values[vi++] << 11) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 29) | (values[vi++] << 6) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 24) | (values[vi++] << 1) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 19) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 37) | (values[vi++] << 14) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 32) | (values[vi++] << 9) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 27) | (values[vi++] << 4) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 22) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 40) | (values[vi++] << 17) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 35) | (values[vi++] << 12) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 30) | (values[vi++] << 7) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 25) | (values[vi++] << 2) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 20) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 38) | (values[vi++] << 15) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 33) | (values[vi++] << 10) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 28) | (values[vi++] << 5) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 23) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 41);
+ values[valuesOffset++] = (int) ((block0 >>> 18) & 8388607L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 262143L) << 5) | (block1 >>> 59));
+ values[valuesOffset++] = (int) ((block1 >>> 36) & 8388607L);
+ values[valuesOffset++] = (int) ((block1 >>> 13) & 8388607L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 8191L) << 10) | (block2 >>> 54));
+ values[valuesOffset++] = (int) ((block2 >>> 31) & 8388607L);
+ values[valuesOffset++] = (int) ((block2 >>> 8) & 8388607L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 255L) << 15) | (block3 >>> 49));
+ values[valuesOffset++] = (int) ((block3 >>> 26) & 8388607L);
+ values[valuesOffset++] = (int) ((block3 >>> 3) & 8388607L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 7L) << 20) | (block4 >>> 44));
+ values[valuesOffset++] = (int) ((block4 >>> 21) & 8388607L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 2097151L) << 2) | (block5 >>> 62));
+ values[valuesOffset++] = (int) ((block5 >>> 39) & 8388607L);
+ values[valuesOffset++] = (int) ((block5 >>> 16) & 8388607L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 65535L) << 7) | (block6 >>> 57));
+ values[valuesOffset++] = (int) ((block6 >>> 34) & 8388607L);
+ values[valuesOffset++] = (int) ((block6 >>> 11) & 8388607L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 2047L) << 12) | (block7 >>> 52));
+ values[valuesOffset++] = (int) ((block7 >>> 29) & 8388607L);
+ values[valuesOffset++] = (int) ((block7 >>> 6) & 8388607L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 63L) << 17) | (block8 >>> 47));
+ values[valuesOffset++] = (int) ((block8 >>> 24) & 8388607L);
+ values[valuesOffset++] = (int) ((block8 >>> 1) & 8388607L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 1L) << 22) | (block9 >>> 42));
+ values[valuesOffset++] = (int) ((block9 >>> 19) & 8388607L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 524287L) << 4) | (block10 >>> 60));
+ values[valuesOffset++] = (int) ((block10 >>> 37) & 8388607L);
+ values[valuesOffset++] = (int) ((block10 >>> 14) & 8388607L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 16383L) << 9) | (block11 >>> 55));
+ values[valuesOffset++] = (int) ((block11 >>> 32) & 8388607L);
+ values[valuesOffset++] = (int) ((block11 >>> 9) & 8388607L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 511L) << 14) | (block12 >>> 50));
+ values[valuesOffset++] = (int) ((block12 >>> 27) & 8388607L);
+ values[valuesOffset++] = (int) ((block12 >>> 4) & 8388607L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 15L) << 19) | (block13 >>> 45));
+ values[valuesOffset++] = (int) ((block13 >>> 22) & 8388607L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 4194303L) << 1) | (block14 >>> 63));
+ values[valuesOffset++] = (int) ((block14 >>> 40) & 8388607L);
+ values[valuesOffset++] = (int) ((block14 >>> 17) & 8388607L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 131071L) << 6) | (block15 >>> 58));
+ values[valuesOffset++] = (int) ((block15 >>> 35) & 8388607L);
+ values[valuesOffset++] = (int) ((block15 >>> 12) & 8388607L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 4095L) << 11) | (block16 >>> 53));
+ values[valuesOffset++] = (int) ((block16 >>> 30) & 8388607L);
+ values[valuesOffset++] = (int) ((block16 >>> 7) & 8388607L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 127L) << 16) | (block17 >>> 48));
+ values[valuesOffset++] = (int) ((block17 >>> 25) & 8388607L);
+ values[valuesOffset++] = (int) ((block17 >>> 2) & 8388607L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 3L) << 21) | (block18 >>> 43));
+ values[valuesOffset++] = (int) ((block18 >>> 20) & 8388607L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 1048575L) << 3) | (block19 >>> 61));
+ values[valuesOffset++] = (int) ((block19 >>> 38) & 8388607L);
+ values[valuesOffset++] = (int) ((block19 >>> 15) & 8388607L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 32767L) << 8) | (block20 >>> 56));
+ values[valuesOffset++] = (int) ((block20 >>> 33) & 8388607L);
+ values[valuesOffset++] = (int) ((block20 >>> 10) & 8388607L);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block20 & 1023L) << 13) | (block21 >>> 51));
+ values[valuesOffset++] = (int) ((block21 >>> 28) & 8388607L);
+ values[valuesOffset++] = (int) ((block21 >>> 5) & 8388607L);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block21 & 31L) << 18) | (block22 >>> 46));
+ values[valuesOffset++] = (int) ((block22 >>> 23) & 8388607L);
+ values[valuesOffset++] = (int) (block22 & 8388607L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 15) | (byte1 << 7) | (byte2 >>> 1);
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 1) << 22) | (byte3 << 14) | (byte4 << 6) | (byte5 >>> 2);
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 3) << 21) | (byte6 << 13) | (byte7 << 5) | (byte8 >>> 3);
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 7) << 20) | (byte9 << 12) | (byte10 << 4) | (byte11 >>> 4);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 15) << 19) | (byte12 << 11) | (byte13 << 3) | (byte14 >>> 5);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 31) << 18) | (byte15 << 10) | (byte16 << 2) | (byte17 >>> 6);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 63) << 17) | (byte18 << 9) | (byte19 << 1) | (byte20 >>> 7);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 127) << 16) | (byte21 << 8) | byte22;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte23 << 15) | (byte24 << 7) | (byte25 >>> 1);
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 1) << 22) | (byte26 << 14) | (byte27 << 6) | (byte28 >>> 2);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 21) | (byte29 << 13) | (byte30 << 5) | (byte31 >>> 3);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 7) << 20) | (byte32 << 12) | (byte33 << 4) | (byte34 >>> 4);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 15) << 19) | (byte35 << 11) | (byte36 << 3) | (byte37 >>> 5);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 31) << 18) | (byte38 << 10) | (byte39 << 2) | (byte40 >>> 6);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 17) | (byte41 << 9) | (byte42 << 1) | (byte43 >>> 7);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 127) << 16) | (byte44 << 8) | byte45;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte46 << 15) | (byte47 << 7) | (byte48 >>> 1);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 1) << 22) | (byte49 << 14) | (byte50 << 6) | (byte51 >>> 2);
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 21) | (byte52 << 13) | (byte53 << 5) | (byte54 >>> 3);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 7) << 20) | (byte55 << 12) | (byte56 << 4) | (byte57 >>> 4);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 15) << 19) | (byte58 << 11) | (byte59 << 3) | (byte60 >>> 5);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 31) << 18) | (byte61 << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 17) | (byte64 << 9) | (byte65 << 1) | (byte66 >>> 7);
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 127) << 16) | (byte67 << 8) | byte68;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte69 << 15) | (byte70 << 7) | (byte71 >>> 1);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 1) << 22) | (byte72 << 14) | (byte73 << 6) | (byte74 >>> 2);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 21) | (byte75 << 13) | (byte76 << 5) | (byte77 >>> 3);
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 7) << 20) | (byte78 << 12) | (byte79 << 4) | (byte80 >>> 4);
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 15) << 19) | (byte81 << 11) | (byte82 << 3) | (byte83 >>> 5);
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 31) << 18) | (byte84 << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 17) | (byte87 << 9) | (byte88 << 1) | (byte89 >>> 7);
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 127) << 16) | (byte90 << 8) | byte91;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte92 << 15) | (byte93 << 7) | (byte94 >>> 1);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 1) << 22) | (byte95 << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 21) | (byte98 << 13) | (byte99 << 5) | (byte100 >>> 3);
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 7) << 20) | (byte101 << 12) | (byte102 << 4) | (byte103 >>> 4);
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 15) << 19) | (byte104 << 11) | (byte105 << 3) | (byte106 >>> 5);
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 31) << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 17) | (byte110 << 9) | (byte111 << 1) | (byte112 >>> 7);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 127) << 16) | (byte113 << 8) | byte114;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte115 << 15) | (byte116 << 7) | (byte117 >>> 1);
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte117 & 1) << 22) | (byte118 << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 21) | (byte121 << 13) | (byte122 << 5) | (byte123 >>> 3);
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 7) << 20) | (byte124 << 12) | (byte125 << 4) | (byte126 >>> 4);
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 15) << 19) | (byte127 << 11) | (byte128 << 3) | (byte129 >>> 5);
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 31) << 18) | (byte130 << 10) | (byte131 << 2) | (byte132 >>> 6);
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte132 & 63) << 17) | (byte133 << 9) | (byte134 << 1) | (byte135 >>> 7);
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 127) << 16) | (byte136 << 8) | byte137;
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte138 << 15) | (byte139 << 7) | (byte140 >>> 1);
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 1) << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 21) | (byte144 << 13) | (byte145 << 5) | (byte146 >>> 3);
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 7) << 20) | (byte147 << 12) | (byte148 << 4) | (byte149 >>> 4);
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 15) << 19) | (byte150 << 11) | (byte151 << 3) | (byte152 >>> 5);
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 31) << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 17) | (byte156 << 9) | (byte157 << 1) | (byte158 >>> 7);
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 127) << 16) | (byte159 << 8) | byte160;
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte161 << 15) | (byte162 << 7) | (byte163 >>> 1);
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 1) << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ final int byte168 = blocks[blocksOffset++] & 0xFF;
+ final int byte169 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 21) | (byte167 << 13) | (byte168 << 5) | (byte169 >>> 3);
+ final int byte170 = blocks[blocksOffset++] & 0xFF;
+ final int byte171 = blocks[blocksOffset++] & 0xFF;
+ final int byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte169 & 7) << 20) | (byte170 << 12) | (byte171 << 4) | (byte172 >>> 4);
+ final int byte173 = blocks[blocksOffset++] & 0xFF;
+ final int byte174 = blocks[blocksOffset++] & 0xFF;
+ final int byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 15) << 19) | (byte173 << 11) | (byte174 << 3) | (byte175 >>> 5);
+ final int byte176 = blocks[blocksOffset++] & 0xFF;
+ final int byte177 = blocks[blocksOffset++] & 0xFF;
+ final int byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 31) << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final int byte179 = blocks[blocksOffset++] & 0xFF;
+ final int byte180 = blocks[blocksOffset++] & 0xFF;
+ final int byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 17) | (byte179 << 9) | (byte180 << 1) | (byte181 >>> 7);
+ final int byte182 = blocks[blocksOffset++] & 0xFF;
+ final int byte183 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 127) << 16) | (byte182 << 8) | byte183;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 41;
+ values[valuesOffset++] = (block0 >>> 18) & 8388607L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 262143L) << 5) | (block1 >>> 59);
+ values[valuesOffset++] = (block1 >>> 36) & 8388607L;
+ values[valuesOffset++] = (block1 >>> 13) & 8388607L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 8191L) << 10) | (block2 >>> 54);
+ values[valuesOffset++] = (block2 >>> 31) & 8388607L;
+ values[valuesOffset++] = (block2 >>> 8) & 8388607L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 255L) << 15) | (block3 >>> 49);
+ values[valuesOffset++] = (block3 >>> 26) & 8388607L;
+ values[valuesOffset++] = (block3 >>> 3) & 8388607L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 7L) << 20) | (block4 >>> 44);
+ values[valuesOffset++] = (block4 >>> 21) & 8388607L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 2097151L) << 2) | (block5 >>> 62);
+ values[valuesOffset++] = (block5 >>> 39) & 8388607L;
+ values[valuesOffset++] = (block5 >>> 16) & 8388607L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 65535L) << 7) | (block6 >>> 57);
+ values[valuesOffset++] = (block6 >>> 34) & 8388607L;
+ values[valuesOffset++] = (block6 >>> 11) & 8388607L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 2047L) << 12) | (block7 >>> 52);
+ values[valuesOffset++] = (block7 >>> 29) & 8388607L;
+ values[valuesOffset++] = (block7 >>> 6) & 8388607L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 63L) << 17) | (block8 >>> 47);
+ values[valuesOffset++] = (block8 >>> 24) & 8388607L;
+ values[valuesOffset++] = (block8 >>> 1) & 8388607L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 1L) << 22) | (block9 >>> 42);
+ values[valuesOffset++] = (block9 >>> 19) & 8388607L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 524287L) << 4) | (block10 >>> 60);
+ values[valuesOffset++] = (block10 >>> 37) & 8388607L;
+ values[valuesOffset++] = (block10 >>> 14) & 8388607L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 16383L) << 9) | (block11 >>> 55);
+ values[valuesOffset++] = (block11 >>> 32) & 8388607L;
+ values[valuesOffset++] = (block11 >>> 9) & 8388607L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 511L) << 14) | (block12 >>> 50);
+ values[valuesOffset++] = (block12 >>> 27) & 8388607L;
+ values[valuesOffset++] = (block12 >>> 4) & 8388607L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 15L) << 19) | (block13 >>> 45);
+ values[valuesOffset++] = (block13 >>> 22) & 8388607L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4194303L) << 1) | (block14 >>> 63);
+ values[valuesOffset++] = (block14 >>> 40) & 8388607L;
+ values[valuesOffset++] = (block14 >>> 17) & 8388607L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 131071L) << 6) | (block15 >>> 58);
+ values[valuesOffset++] = (block15 >>> 35) & 8388607L;
+ values[valuesOffset++] = (block15 >>> 12) & 8388607L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 4095L) << 11) | (block16 >>> 53);
+ values[valuesOffset++] = (block16 >>> 30) & 8388607L;
+ values[valuesOffset++] = (block16 >>> 7) & 8388607L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 127L) << 16) | (block17 >>> 48);
+ values[valuesOffset++] = (block17 >>> 25) & 8388607L;
+ values[valuesOffset++] = (block17 >>> 2) & 8388607L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 3L) << 21) | (block18 >>> 43);
+ values[valuesOffset++] = (block18 >>> 20) & 8388607L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1048575L) << 3) | (block19 >>> 61);
+ values[valuesOffset++] = (block19 >>> 38) & 8388607L;
+ values[valuesOffset++] = (block19 >>> 15) & 8388607L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 32767L) << 8) | (block20 >>> 56);
+ values[valuesOffset++] = (block20 >>> 33) & 8388607L;
+ values[valuesOffset++] = (block20 >>> 10) & 8388607L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 1023L) << 13) | (block21 >>> 51);
+ values[valuesOffset++] = (block21 >>> 28) & 8388607L;
+ values[valuesOffset++] = (block21 >>> 5) & 8388607L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 31L) << 18) | (block22 >>> 46);
+ values[valuesOffset++] = (block22 >>> 23) & 8388607L;
+ values[valuesOffset++] = block22 & 8388607L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 15) | (byte1 << 7) | (byte2 >>> 1);
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte2 & 1) << 22) | (byte3 << 14) | (byte4 << 6) | (byte5 >>> 2);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 3) << 21) | (byte6 << 13) | (byte7 << 5) | (byte8 >>> 3);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 7) << 20) | (byte9 << 12) | (byte10 << 4) | (byte11 >>> 4);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 15) << 19) | (byte12 << 11) | (byte13 << 3) | (byte14 >>> 5);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 31) << 18) | (byte15 << 10) | (byte16 << 2) | (byte17 >>> 6);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 63) << 17) | (byte18 << 9) | (byte19 << 1) | (byte20 >>> 7);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 127) << 16) | (byte21 << 8) | byte22;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte23 << 15) | (byte24 << 7) | (byte25 >>> 1);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 1) << 22) | (byte26 << 14) | (byte27 << 6) | (byte28 >>> 2);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 21) | (byte29 << 13) | (byte30 << 5) | (byte31 >>> 3);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 7) << 20) | (byte32 << 12) | (byte33 << 4) | (byte34 >>> 4);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 15) << 19) | (byte35 << 11) | (byte36 << 3) | (byte37 >>> 5);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 31) << 18) | (byte38 << 10) | (byte39 << 2) | (byte40 >>> 6);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 17) | (byte41 << 9) | (byte42 << 1) | (byte43 >>> 7);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 127) << 16) | (byte44 << 8) | byte45;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte46 << 15) | (byte47 << 7) | (byte48 >>> 1);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 1) << 22) | (byte49 << 14) | (byte50 << 6) | (byte51 >>> 2);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 21) | (byte52 << 13) | (byte53 << 5) | (byte54 >>> 3);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 7) << 20) | (byte55 << 12) | (byte56 << 4) | (byte57 >>> 4);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 15) << 19) | (byte58 << 11) | (byte59 << 3) | (byte60 >>> 5);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 31) << 18) | (byte61 << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 17) | (byte64 << 9) | (byte65 << 1) | (byte66 >>> 7);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 127) << 16) | (byte67 << 8) | byte68;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte69 << 15) | (byte70 << 7) | (byte71 >>> 1);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 1) << 22) | (byte72 << 14) | (byte73 << 6) | (byte74 >>> 2);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 21) | (byte75 << 13) | (byte76 << 5) | (byte77 >>> 3);
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 7) << 20) | (byte78 << 12) | (byte79 << 4) | (byte80 >>> 4);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 15) << 19) | (byte81 << 11) | (byte82 << 3) | (byte83 >>> 5);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 31) << 18) | (byte84 << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 17) | (byte87 << 9) | (byte88 << 1) | (byte89 >>> 7);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 127) << 16) | (byte90 << 8) | byte91;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte92 << 15) | (byte93 << 7) | (byte94 >>> 1);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 1) << 22) | (byte95 << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 21) | (byte98 << 13) | (byte99 << 5) | (byte100 >>> 3);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 7) << 20) | (byte101 << 12) | (byte102 << 4) | (byte103 >>> 4);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 15) << 19) | (byte104 << 11) | (byte105 << 3) | (byte106 >>> 5);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 31) << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 17) | (byte110 << 9) | (byte111 << 1) | (byte112 >>> 7);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 127) << 16) | (byte113 << 8) | byte114;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte115 << 15) | (byte116 << 7) | (byte117 >>> 1);
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte117 & 1) << 22) | (byte118 << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 21) | (byte121 << 13) | (byte122 << 5) | (byte123 >>> 3);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 7) << 20) | (byte124 << 12) | (byte125 << 4) | (byte126 >>> 4);
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 15) << 19) | (byte127 << 11) | (byte128 << 3) | (byte129 >>> 5);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 31) << 18) | (byte130 << 10) | (byte131 << 2) | (byte132 >>> 6);
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte132 & 63) << 17) | (byte133 << 9) | (byte134 << 1) | (byte135 >>> 7);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 127) << 16) | (byte136 << 8) | byte137;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte138 << 15) | (byte139 << 7) | (byte140 >>> 1);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 1) << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 21) | (byte144 << 13) | (byte145 << 5) | (byte146 >>> 3);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 7) << 20) | (byte147 << 12) | (byte148 << 4) | (byte149 >>> 4);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 15) << 19) | (byte150 << 11) | (byte151 << 3) | (byte152 >>> 5);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 31) << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 17) | (byte156 << 9) | (byte157 << 1) | (byte158 >>> 7);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 127) << 16) | (byte159 << 8) | byte160;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte161 << 15) | (byte162 << 7) | (byte163 >>> 1);
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 1) << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 21) | (byte167 << 13) | (byte168 << 5) | (byte169 >>> 3);
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte169 & 7) << 20) | (byte170 << 12) | (byte171 << 4) | (byte172 >>> 4);
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 15) << 19) | (byte173 << 11) | (byte174 << 3) | (byte175 >>> 5);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 31) << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 17) | (byte179 << 9) | (byte180 << 1) | (byte181 >>> 7);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 127) << 16) | (byte182 << 8) | byte183;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 23) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 23) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation24 extends BulkOperation {
+ }
+ ,
+ PACKED_24 {
- public int blocks() {
+ public int blockCount() {
return 3;
}
- public int values() {
+ public int valueCount() {
return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 40;
- values[vi++] = (block0 >>> 16) & 16777215L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 65535L) << 8) | (block1 >>> 56);
- values[vi++] = (block1 >>> 32) & 16777215L;
- values[vi++] = (block1 >>> 8) & 16777215L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 16) | (block2 >>> 48);
- values[vi++] = (block2 >>> 24) & 16777215L;
- values[vi++] = block2 & 16777215L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 40);
+ values[valuesOffset++] = (int) ((block0 >>> 16) & 16777215L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 65535L) << 8) | (block1 >>> 56));
+ values[valuesOffset++] = (int) ((block1 >>> 32) & 16777215L);
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 16777215L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 16) | (block2 >>> 48));
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 16777215L);
+ values[valuesOffset++] = (int) (block2 & 16777215L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 16) | (byte1 << 8) | byte2;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte3 << 16) | (byte4 << 8) | byte5;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 16) | (byte7 << 8) | byte8;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 16) | (byte10 << 8) | byte11;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte12 << 16) | (byte13 << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 16) | (byte16 << 8) | byte17;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 16) | (byte19 << 8) | byte20;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 16) | (byte22 << 8) | byte23;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 40;
+ values[valuesOffset++] = (block0 >>> 16) & 16777215L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 65535L) << 8) | (block1 >>> 56);
+ values[valuesOffset++] = (block1 >>> 32) & 16777215L;
+ values[valuesOffset++] = (block1 >>> 8) & 16777215L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 16) | (block2 >>> 48);
+ values[valuesOffset++] = (block2 >>> 24) & 16777215L;
+ values[valuesOffset++] = block2 & 16777215L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 16) | (byte1 << 8) | byte2;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte3 << 16) | (byte4 << 8) | byte5;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 16) | (byte7 << 8) | byte8;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 16) | (byte10 << 8) | byte11;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte12 << 16) | (byte13 << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 16) | (byte16 << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 16) | (byte19 << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 16) | (byte22 << 8) | byte23;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 24) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 24) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 16) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 32) | (values[vi++] << 8) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 24) | values[vi++];
- }
}
- }
-
- static final class Packed64BulkOperation25 extends BulkOperation {
+ ,
+ PACKED_25 {
- public int blocks() {
+ public int blockCount() {
return 25;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 39;
- values[vi++] = (block0 >>> 14) & 33554431L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 16383L) << 11) | (block1 >>> 53);
- values[vi++] = (block1 >>> 28) & 33554431L;
- values[vi++] = (block1 >>> 3) & 33554431L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 7L) << 22) | (block2 >>> 42);
- values[vi++] = (block2 >>> 17) & 33554431L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 131071L) << 8) | (block3 >>> 56);
- values[vi++] = (block3 >>> 31) & 33554431L;
- values[vi++] = (block3 >>> 6) & 33554431L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 63L) << 19) | (block4 >>> 45);
- values[vi++] = (block4 >>> 20) & 33554431L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1048575L) << 5) | (block5 >>> 59);
- values[vi++] = (block5 >>> 34) & 33554431L;
- values[vi++] = (block5 >>> 9) & 33554431L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 511L) << 16) | (block6 >>> 48);
- values[vi++] = (block6 >>> 23) & 33554431L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 8388607L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 37) & 33554431L;
- values[vi++] = (block7 >>> 12) & 33554431L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4095L) << 13) | (block8 >>> 51);
- values[vi++] = (block8 >>> 26) & 33554431L;
- values[vi++] = (block8 >>> 1) & 33554431L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 1L) << 24) | (block9 >>> 40);
- values[vi++] = (block9 >>> 15) & 33554431L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 32767L) << 10) | (block10 >>> 54);
- values[vi++] = (block10 >>> 29) & 33554431L;
- values[vi++] = (block10 >>> 4) & 33554431L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 15L) << 21) | (block11 >>> 43);
- values[vi++] = (block11 >>> 18) & 33554431L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 262143L) << 7) | (block12 >>> 57);
- values[vi++] = (block12 >>> 32) & 33554431L;
- values[vi++] = (block12 >>> 7) & 33554431L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 127L) << 18) | (block13 >>> 46);
- values[vi++] = (block13 >>> 21) & 33554431L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2097151L) << 4) | (block14 >>> 60);
- values[vi++] = (block14 >>> 35) & 33554431L;
- values[vi++] = (block14 >>> 10) & 33554431L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1023L) << 15) | (block15 >>> 49);
- values[vi++] = (block15 >>> 24) & 33554431L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 16777215L) << 1) | (block16 >>> 63);
- values[vi++] = (block16 >>> 38) & 33554431L;
- values[vi++] = (block16 >>> 13) & 33554431L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 8191L) << 12) | (block17 >>> 52);
- values[vi++] = (block17 >>> 27) & 33554431L;
- values[vi++] = (block17 >>> 2) & 33554431L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 3L) << 23) | (block18 >>> 41);
- values[vi++] = (block18 >>> 16) & 33554431L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 65535L) << 9) | (block19 >>> 55);
- values[vi++] = (block19 >>> 30) & 33554431L;
- values[vi++] = (block19 >>> 5) & 33554431L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 31L) << 20) | (block20 >>> 44);
- values[vi++] = (block20 >>> 19) & 33554431L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 524287L) << 6) | (block21 >>> 58);
- values[vi++] = (block21 >>> 33) & 33554431L;
- values[vi++] = (block21 >>> 8) & 33554431L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 255L) << 17) | (block22 >>> 47);
- values[vi++] = (block22 >>> 22) & 33554431L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4194303L) << 3) | (block23 >>> 61);
- values[vi++] = (block23 >>> 36) & 33554431L;
- values[vi++] = (block23 >>> 11) & 33554431L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 2047L) << 14) | (block24 >>> 50);
- values[vi++] = (block24 >>> 25) & 33554431L;
- values[vi++] = block24 & 33554431L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 14) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 28) | (values[vi++] << 3) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 17) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 31) | (values[vi++] << 6) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 20) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 34) | (values[vi++] << 9) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 23) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 37) | (values[vi++] << 12) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 26) | (values[vi++] << 1) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 15) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 29) | (values[vi++] << 4) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 18) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 32) | (values[vi++] << 7) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 21) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 35) | (values[vi++] << 10) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 24) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 38) | (values[vi++] << 13) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 27) | (values[vi++] << 2) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 16) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 30) | (values[vi++] << 5) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 19) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 33) | (values[vi++] << 8) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 22) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 36) | (values[vi++] << 11) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 25) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 39);
+ values[valuesOffset++] = (int) ((block0 >>> 14) & 33554431L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 16383L) << 11) | (block1 >>> 53));
+ values[valuesOffset++] = (int) ((block1 >>> 28) & 33554431L);
+ values[valuesOffset++] = (int) ((block1 >>> 3) & 33554431L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 7L) << 22) | (block2 >>> 42));
+ values[valuesOffset++] = (int) ((block2 >>> 17) & 33554431L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 131071L) << 8) | (block3 >>> 56));
+ values[valuesOffset++] = (int) ((block3 >>> 31) & 33554431L);
+ values[valuesOffset++] = (int) ((block3 >>> 6) & 33554431L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 63L) << 19) | (block4 >>> 45));
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 33554431L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 1048575L) << 5) | (block5 >>> 59));
+ values[valuesOffset++] = (int) ((block5 >>> 34) & 33554431L);
+ values[valuesOffset++] = (int) ((block5 >>> 9) & 33554431L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 511L) << 16) | (block6 >>> 48));
+ values[valuesOffset++] = (int) ((block6 >>> 23) & 33554431L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 8388607L) << 2) | (block7 >>> 62));
+ values[valuesOffset++] = (int) ((block7 >>> 37) & 33554431L);
+ values[valuesOffset++] = (int) ((block7 >>> 12) & 33554431L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 4095L) << 13) | (block8 >>> 51));
+ values[valuesOffset++] = (int) ((block8 >>> 26) & 33554431L);
+ values[valuesOffset++] = (int) ((block8 >>> 1) & 33554431L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 1L) << 24) | (block9 >>> 40));
+ values[valuesOffset++] = (int) ((block9 >>> 15) & 33554431L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 32767L) << 10) | (block10 >>> 54));
+ values[valuesOffset++] = (int) ((block10 >>> 29) & 33554431L);
+ values[valuesOffset++] = (int) ((block10 >>> 4) & 33554431L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 15L) << 21) | (block11 >>> 43));
+ values[valuesOffset++] = (int) ((block11 >>> 18) & 33554431L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 262143L) << 7) | (block12 >>> 57));
+ values[valuesOffset++] = (int) ((block12 >>> 32) & 33554431L);
+ values[valuesOffset++] = (int) ((block12 >>> 7) & 33554431L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 127L) << 18) | (block13 >>> 46));
+ values[valuesOffset++] = (int) ((block13 >>> 21) & 33554431L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 2097151L) << 4) | (block14 >>> 60));
+ values[valuesOffset++] = (int) ((block14 >>> 35) & 33554431L);
+ values[valuesOffset++] = (int) ((block14 >>> 10) & 33554431L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 1023L) << 15) | (block15 >>> 49));
+ values[valuesOffset++] = (int) ((block15 >>> 24) & 33554431L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 16777215L) << 1) | (block16 >>> 63));
+ values[valuesOffset++] = (int) ((block16 >>> 38) & 33554431L);
+ values[valuesOffset++] = (int) ((block16 >>> 13) & 33554431L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 8191L) << 12) | (block17 >>> 52));
+ values[valuesOffset++] = (int) ((block17 >>> 27) & 33554431L);
+ values[valuesOffset++] = (int) ((block17 >>> 2) & 33554431L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 3L) << 23) | (block18 >>> 41));
+ values[valuesOffset++] = (int) ((block18 >>> 16) & 33554431L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 65535L) << 9) | (block19 >>> 55));
+ values[valuesOffset++] = (int) ((block19 >>> 30) & 33554431L);
+ values[valuesOffset++] = (int) ((block19 >>> 5) & 33554431L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 31L) << 20) | (block20 >>> 44));
+ values[valuesOffset++] = (int) ((block20 >>> 19) & 33554431L);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block20 & 524287L) << 6) | (block21 >>> 58));
+ values[valuesOffset++] = (int) ((block21 >>> 33) & 33554431L);
+ values[valuesOffset++] = (int) ((block21 >>> 8) & 33554431L);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block21 & 255L) << 17) | (block22 >>> 47));
+ values[valuesOffset++] = (int) ((block22 >>> 22) & 33554431L);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block22 & 4194303L) << 3) | (block23 >>> 61));
+ values[valuesOffset++] = (int) ((block23 >>> 36) & 33554431L);
+ values[valuesOffset++] = (int) ((block23 >>> 11) & 33554431L);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block23 & 2047L) << 14) | (block24 >>> 50));
+ values[valuesOffset++] = (int) ((block24 >>> 25) & 33554431L);
+ values[valuesOffset++] = (int) (block24 & 33554431L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 17) | (byte1 << 9) | (byte2 << 1) | (byte3 >>> 7);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 127) << 18) | (byte4 << 10) | (byte5 << 2) | (byte6 >>> 6);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 63) << 19) | (byte7 << 11) | (byte8 << 3) | (byte9 >>> 5);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 31) << 20) | (byte10 << 12) | (byte11 << 4) | (byte12 >>> 4);
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 21) | (byte13 << 13) | (byte14 << 5) | (byte15 >>> 3);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 7) << 22) | (byte16 << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 23) | (byte19 << 15) | (byte20 << 7) | (byte21 >>> 1);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 24) | (byte22 << 16) | (byte23 << 8) | byte24;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 17) | (byte26 << 9) | (byte27 << 1) | (byte28 >>> 7);
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 18) | (byte29 << 10) | (byte30 << 2) | (byte31 >>> 6);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 63) << 19) | (byte32 << 11) | (byte33 << 3) | (byte34 >>> 5);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 31) << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 21) | (byte38 << 13) | (byte39 << 5) | (byte40 >>> 3);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 7) << 22) | (byte41 << 14) | (byte42 << 6) | (byte43 >>> 2);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 23) | (byte44 << 15) | (byte45 << 7) | (byte46 >>> 1);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 1) << 24) | (byte47 << 16) | (byte48 << 8) | byte49;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte50 << 17) | (byte51 << 9) | (byte52 << 1) | (byte53 >>> 7);
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 127) << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 19) | (byte57 << 11) | (byte58 << 3) | (byte59 >>> 5);
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 31) << 20) | (byte60 << 12) | (byte61 << 4) | (byte62 >>> 4);
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte62 & 15) << 21) | (byte63 << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 22) | (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 23) | (byte69 << 15) | (byte70 << 7) | (byte71 >>> 1);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 1) << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 17) | (byte76 << 9) | (byte77 << 1) | (byte78 >>> 7);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 127) << 18) | (byte79 << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 19) | (byte82 << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 20) | (byte85 << 12) | (byte86 << 4) | (byte87 >>> 4);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 15) << 21) | (byte88 << 13) | (byte89 << 5) | (byte90 >>> 3);
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 7) << 22) | (byte91 << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 23) | (byte94 << 15) | (byte95 << 7) | (byte96 >>> 1);
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 1) << 24) | (byte97 << 16) | (byte98 << 8) | byte99;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte100 << 17) | (byte101 << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 18) | (byte104 << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 19) | (byte107 << 11) | (byte108 << 3) | (byte109 >>> 5);
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 31) << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 21) | (byte113 << 13) | (byte114 << 5) | (byte115 >>> 3);
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 7) << 22) | (byte116 << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 23) | (byte119 << 15) | (byte120 << 7) | (byte121 >>> 1);
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 1) << 24) | (byte122 << 16) | (byte123 << 8) | byte124;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte125 << 17) | (byte126 << 9) | (byte127 << 1) | (byte128 >>> 7);
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 127) << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 19) | (byte132 << 11) | (byte133 << 3) | (byte134 >>> 5);
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 31) << 20) | (byte135 << 12) | (byte136 << 4) | (byte137 >>> 4);
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 15) << 21) | (byte138 << 13) | (byte139 << 5) | (byte140 >>> 3);
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 7) << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 23) | (byte144 << 15) | (byte145 << 7) | (byte146 >>> 1);
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 1) << 24) | (byte147 << 16) | (byte148 << 8) | byte149;
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte150 << 17) | (byte151 << 9) | (byte152 << 1) | (byte153 >>> 7);
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte153 & 127) << 18) | (byte154 << 10) | (byte155 << 2) | (byte156 >>> 6);
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte156 & 63) << 19) | (byte157 << 11) | (byte158 << 3) | (byte159 >>> 5);
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 31) << 20) | (byte160 << 12) | (byte161 << 4) | (byte162 >>> 4);
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 15) << 21) | (byte163 << 13) | (byte164 << 5) | (byte165 >>> 3);
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ final int byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 7) << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final int byte169 = blocks[blocksOffset++] & 0xFF;
+ final int byte170 = blocks[blocksOffset++] & 0xFF;
+ final int byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 23) | (byte169 << 15) | (byte170 << 7) | (byte171 >>> 1);
+ final int byte172 = blocks[blocksOffset++] & 0xFF;
+ final int byte173 = blocks[blocksOffset++] & 0xFF;
+ final int byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte171 & 1) << 24) | (byte172 << 16) | (byte173 << 8) | byte174;
+ final int byte175 = blocks[blocksOffset++] & 0xFF;
+ final int byte176 = blocks[blocksOffset++] & 0xFF;
+ final int byte177 = blocks[blocksOffset++] & 0xFF;
+ final int byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte175 << 17) | (byte176 << 9) | (byte177 << 1) | (byte178 >>> 7);
+ final int byte179 = blocks[blocksOffset++] & 0xFF;
+ final int byte180 = blocks[blocksOffset++] & 0xFF;
+ final int byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 127) << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final int byte182 = blocks[blocksOffset++] & 0xFF;
+ final int byte183 = blocks[blocksOffset++] & 0xFF;
+ final int byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 19) | (byte182 << 11) | (byte183 << 3) | (byte184 >>> 5);
+ final int byte185 = blocks[blocksOffset++] & 0xFF;
+ final int byte186 = blocks[blocksOffset++] & 0xFF;
+ final int byte187 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 31) << 20) | (byte185 << 12) | (byte186 << 4) | (byte187 >>> 4);
+ final int byte188 = blocks[blocksOffset++] & 0xFF;
+ final int byte189 = blocks[blocksOffset++] & 0xFF;
+ final int byte190 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte187 & 15) << 21) | (byte188 << 13) | (byte189 << 5) | (byte190 >>> 3);
+ final int byte191 = blocks[blocksOffset++] & 0xFF;
+ final int byte192 = blocks[blocksOffset++] & 0xFF;
+ final int byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte190 & 7) << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final int byte194 = blocks[blocksOffset++] & 0xFF;
+ final int byte195 = blocks[blocksOffset++] & 0xFF;
+ final int byte196 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 23) | (byte194 << 15) | (byte195 << 7) | (byte196 >>> 1);
+ final int byte197 = blocks[blocksOffset++] & 0xFF;
+ final int byte198 = blocks[blocksOffset++] & 0xFF;
+ final int byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte196 & 1) << 24) | (byte197 << 16) | (byte198 << 8) | byte199;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 39;
+ values[valuesOffset++] = (block0 >>> 14) & 33554431L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 16383L) << 11) | (block1 >>> 53);
+ values[valuesOffset++] = (block1 >>> 28) & 33554431L;
+ values[valuesOffset++] = (block1 >>> 3) & 33554431L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 7L) << 22) | (block2 >>> 42);
+ values[valuesOffset++] = (block2 >>> 17) & 33554431L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 131071L) << 8) | (block3 >>> 56);
+ values[valuesOffset++] = (block3 >>> 31) & 33554431L;
+ values[valuesOffset++] = (block3 >>> 6) & 33554431L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 63L) << 19) | (block4 >>> 45);
+ values[valuesOffset++] = (block4 >>> 20) & 33554431L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1048575L) << 5) | (block5 >>> 59);
+ values[valuesOffset++] = (block5 >>> 34) & 33554431L;
+ values[valuesOffset++] = (block5 >>> 9) & 33554431L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 511L) << 16) | (block6 >>> 48);
+ values[valuesOffset++] = (block6 >>> 23) & 33554431L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 8388607L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 37) & 33554431L;
+ values[valuesOffset++] = (block7 >>> 12) & 33554431L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4095L) << 13) | (block8 >>> 51);
+ values[valuesOffset++] = (block8 >>> 26) & 33554431L;
+ values[valuesOffset++] = (block8 >>> 1) & 33554431L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 1L) << 24) | (block9 >>> 40);
+ values[valuesOffset++] = (block9 >>> 15) & 33554431L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 32767L) << 10) | (block10 >>> 54);
+ values[valuesOffset++] = (block10 >>> 29) & 33554431L;
+ values[valuesOffset++] = (block10 >>> 4) & 33554431L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 15L) << 21) | (block11 >>> 43);
+ values[valuesOffset++] = (block11 >>> 18) & 33554431L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 262143L) << 7) | (block12 >>> 57);
+ values[valuesOffset++] = (block12 >>> 32) & 33554431L;
+ values[valuesOffset++] = (block12 >>> 7) & 33554431L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 127L) << 18) | (block13 >>> 46);
+ values[valuesOffset++] = (block13 >>> 21) & 33554431L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2097151L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = (block14 >>> 35) & 33554431L;
+ values[valuesOffset++] = (block14 >>> 10) & 33554431L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1023L) << 15) | (block15 >>> 49);
+ values[valuesOffset++] = (block15 >>> 24) & 33554431L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 16777215L) << 1) | (block16 >>> 63);
+ values[valuesOffset++] = (block16 >>> 38) & 33554431L;
+ values[valuesOffset++] = (block16 >>> 13) & 33554431L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 8191L) << 12) | (block17 >>> 52);
+ values[valuesOffset++] = (block17 >>> 27) & 33554431L;
+ values[valuesOffset++] = (block17 >>> 2) & 33554431L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 3L) << 23) | (block18 >>> 41);
+ values[valuesOffset++] = (block18 >>> 16) & 33554431L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 65535L) << 9) | (block19 >>> 55);
+ values[valuesOffset++] = (block19 >>> 30) & 33554431L;
+ values[valuesOffset++] = (block19 >>> 5) & 33554431L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 31L) << 20) | (block20 >>> 44);
+ values[valuesOffset++] = (block20 >>> 19) & 33554431L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 524287L) << 6) | (block21 >>> 58);
+ values[valuesOffset++] = (block21 >>> 33) & 33554431L;
+ values[valuesOffset++] = (block21 >>> 8) & 33554431L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 255L) << 17) | (block22 >>> 47);
+ values[valuesOffset++] = (block22 >>> 22) & 33554431L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4194303L) << 3) | (block23 >>> 61);
+ values[valuesOffset++] = (block23 >>> 36) & 33554431L;
+ values[valuesOffset++] = (block23 >>> 11) & 33554431L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 2047L) << 14) | (block24 >>> 50);
+ values[valuesOffset++] = (block24 >>> 25) & 33554431L;
+ values[valuesOffset++] = block24 & 33554431L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 17) | (byte1 << 9) | (byte2 << 1) | (byte3 >>> 7);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 127) << 18) | (byte4 << 10) | (byte5 << 2) | (byte6 >>> 6);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 63) << 19) | (byte7 << 11) | (byte8 << 3) | (byte9 >>> 5);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 31) << 20) | (byte10 << 12) | (byte11 << 4) | (byte12 >>> 4);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 21) | (byte13 << 13) | (byte14 << 5) | (byte15 >>> 3);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 7) << 22) | (byte16 << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 23) | (byte19 << 15) | (byte20 << 7) | (byte21 >>> 1);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 24) | (byte22 << 16) | (byte23 << 8) | byte24;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 17) | (byte26 << 9) | (byte27 << 1) | (byte28 >>> 7);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 18) | (byte29 << 10) | (byte30 << 2) | (byte31 >>> 6);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 63) << 19) | (byte32 << 11) | (byte33 << 3) | (byte34 >>> 5);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 31) << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 21) | (byte38 << 13) | (byte39 << 5) | (byte40 >>> 3);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 7) << 22) | (byte41 << 14) | (byte42 << 6) | (byte43 >>> 2);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 23) | (byte44 << 15) | (byte45 << 7) | (byte46 >>> 1);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 1) << 24) | (byte47 << 16) | (byte48 << 8) | byte49;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte50 << 17) | (byte51 << 9) | (byte52 << 1) | (byte53 >>> 7);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 127) << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 19) | (byte57 << 11) | (byte58 << 3) | (byte59 >>> 5);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 31) << 20) | (byte60 << 12) | (byte61 << 4) | (byte62 >>> 4);
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte62 & 15) << 21) | (byte63 << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 22) | (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 23) | (byte69 << 15) | (byte70 << 7) | (byte71 >>> 1);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 1) << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 17) | (byte76 << 9) | (byte77 << 1) | (byte78 >>> 7);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 127) << 18) | (byte79 << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 19) | (byte82 << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 20) | (byte85 << 12) | (byte86 << 4) | (byte87 >>> 4);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 15) << 21) | (byte88 << 13) | (byte89 << 5) | (byte90 >>> 3);
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 7) << 22) | (byte91 << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 23) | (byte94 << 15) | (byte95 << 7) | (byte96 >>> 1);
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 1) << 24) | (byte97 << 16) | (byte98 << 8) | byte99;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte100 << 17) | (byte101 << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 18) | (byte104 << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 19) | (byte107 << 11) | (byte108 << 3) | (byte109 >>> 5);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 31) << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 21) | (byte113 << 13) | (byte114 << 5) | (byte115 >>> 3);
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 7) << 22) | (byte116 << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 23) | (byte119 << 15) | (byte120 << 7) | (byte121 >>> 1);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 1) << 24) | (byte122 << 16) | (byte123 << 8) | byte124;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte125 << 17) | (byte126 << 9) | (byte127 << 1) | (byte128 >>> 7);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 127) << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 19) | (byte132 << 11) | (byte133 << 3) | (byte134 >>> 5);
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 31) << 20) | (byte135 << 12) | (byte136 << 4) | (byte137 >>> 4);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 15) << 21) | (byte138 << 13) | (byte139 << 5) | (byte140 >>> 3);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 7) << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 23) | (byte144 << 15) | (byte145 << 7) | (byte146 >>> 1);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 1) << 24) | (byte147 << 16) | (byte148 << 8) | byte149;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte150 << 17) | (byte151 << 9) | (byte152 << 1) | (byte153 >>> 7);
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte153 & 127) << 18) | (byte154 << 10) | (byte155 << 2) | (byte156 >>> 6);
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte156 & 63) << 19) | (byte157 << 11) | (byte158 << 3) | (byte159 >>> 5);
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 31) << 20) | (byte160 << 12) | (byte161 << 4) | (byte162 >>> 4);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 15) << 21) | (byte163 << 13) | (byte164 << 5) | (byte165 >>> 3);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 7) << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 23) | (byte169 << 15) | (byte170 << 7) | (byte171 >>> 1);
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte171 & 1) << 24) | (byte172 << 16) | (byte173 << 8) | byte174;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte175 << 17) | (byte176 << 9) | (byte177 << 1) | (byte178 >>> 7);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 127) << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 19) | (byte182 << 11) | (byte183 << 3) | (byte184 >>> 5);
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 31) << 20) | (byte185 << 12) | (byte186 << 4) | (byte187 >>> 4);
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte187 & 15) << 21) | (byte188 << 13) | (byte189 << 5) | (byte190 >>> 3);
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte190 & 7) << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 23) | (byte194 << 15) | (byte195 << 7) | (byte196 >>> 1);
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte196 & 1) << 24) | (byte197 << 16) | (byte198 << 8) | byte199;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 25) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 25) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation26 extends BulkOperation {
+ }
+ ,
+ PACKED_26 {
- public int blocks() {
+ public int blockCount() {
return 13;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 38;
- values[vi++] = (block0 >>> 12) & 67108863L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 4095L) << 14) | (block1 >>> 50);
- values[vi++] = (block1 >>> 24) & 67108863L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 16777215L) << 2) | (block2 >>> 62);
- values[vi++] = (block2 >>> 36) & 67108863L;
- values[vi++] = (block2 >>> 10) & 67108863L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 1023L) << 16) | (block3 >>> 48);
- values[vi++] = (block3 >>> 22) & 67108863L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 4194303L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 34) & 67108863L;
- values[vi++] = (block4 >>> 8) & 67108863L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 255L) << 18) | (block5 >>> 46);
- values[vi++] = (block5 >>> 20) & 67108863L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1048575L) << 6) | (block6 >>> 58);
- values[vi++] = (block6 >>> 32) & 67108863L;
- values[vi++] = (block6 >>> 6) & 67108863L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 63L) << 20) | (block7 >>> 44);
- values[vi++] = (block7 >>> 18) & 67108863L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 262143L) << 8) | (block8 >>> 56);
- values[vi++] = (block8 >>> 30) & 67108863L;
- values[vi++] = (block8 >>> 4) & 67108863L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 22) | (block9 >>> 42);
- values[vi++] = (block9 >>> 16) & 67108863L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 65535L) << 10) | (block10 >>> 54);
- values[vi++] = (block10 >>> 28) & 67108863L;
- values[vi++] = (block10 >>> 2) & 67108863L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 3L) << 24) | (block11 >>> 40);
- values[vi++] = (block11 >>> 14) & 67108863L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 16383L) << 12) | (block12 >>> 52);
- values[vi++] = (block12 >>> 26) & 67108863L;
- values[vi++] = block12 & 67108863L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 12) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 24) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 36) | (values[vi++] << 10) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 22) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 34) | (values[vi++] << 8) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 20) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 32) | (values[vi++] << 6) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 18) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 30) | (values[vi++] << 4) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 16) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 28) | (values[vi++] << 2) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 14) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 26) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 38);
+ values[valuesOffset++] = (int) ((block0 >>> 12) & 67108863L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 4095L) << 14) | (block1 >>> 50));
+ values[valuesOffset++] = (int) ((block1 >>> 24) & 67108863L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 16777215L) << 2) | (block2 >>> 62));
+ values[valuesOffset++] = (int) ((block2 >>> 36) & 67108863L);
+ values[valuesOffset++] = (int) ((block2 >>> 10) & 67108863L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 1023L) << 16) | (block3 >>> 48));
+ values[valuesOffset++] = (int) ((block3 >>> 22) & 67108863L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 4194303L) << 4) | (block4 >>> 60));
+ values[valuesOffset++] = (int) ((block4 >>> 34) & 67108863L);
+ values[valuesOffset++] = (int) ((block4 >>> 8) & 67108863L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 255L) << 18) | (block5 >>> 46));
+ values[valuesOffset++] = (int) ((block5 >>> 20) & 67108863L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 1048575L) << 6) | (block6 >>> 58));
+ values[valuesOffset++] = (int) ((block6 >>> 32) & 67108863L);
+ values[valuesOffset++] = (int) ((block6 >>> 6) & 67108863L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 63L) << 20) | (block7 >>> 44));
+ values[valuesOffset++] = (int) ((block7 >>> 18) & 67108863L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 262143L) << 8) | (block8 >>> 56));
+ values[valuesOffset++] = (int) ((block8 >>> 30) & 67108863L);
+ values[valuesOffset++] = (int) ((block8 >>> 4) & 67108863L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 15L) << 22) | (block9 >>> 42));
+ values[valuesOffset++] = (int) ((block9 >>> 16) & 67108863L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 65535L) << 10) | (block10 >>> 54));
+ values[valuesOffset++] = (int) ((block10 >>> 28) & 67108863L);
+ values[valuesOffset++] = (int) ((block10 >>> 2) & 67108863L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 3L) << 24) | (block11 >>> 40));
+ values[valuesOffset++] = (int) ((block11 >>> 14) & 67108863L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 16383L) << 12) | (block12 >>> 52));
+ values[valuesOffset++] = (int) ((block12 >>> 26) & 67108863L);
+ values[valuesOffset++] = (int) (block12 & 67108863L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 18) | (byte1 << 10) | (byte2 << 2) | (byte3 >>> 6);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 63) << 20) | (byte4 << 12) | (byte5 << 4) | (byte6 >>> 4);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 15) << 22) | (byte7 << 14) | (byte8 << 6) | (byte9 >>> 2);
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 24) | (byte10 << 16) | (byte11 << 8) | byte12;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte13 << 18) | (byte14 << 10) | (byte15 << 2) | (byte16 >>> 6);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 20) | (byte17 << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 22) | (byte20 << 14) | (byte21 << 6) | (byte22 >>> 2);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 24) | (byte23 << 16) | (byte24 << 8) | byte25;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte26 << 18) | (byte27 << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 20) | (byte30 << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 22) | (byte33 << 14) | (byte34 << 6) | (byte35 >>> 2);
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 24) | (byte36 << 16) | (byte37 << 8) | byte38;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 18) | (byte40 << 10) | (byte41 << 2) | (byte42 >>> 6);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 63) << 20) | (byte43 << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 22) | (byte46 << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 24) | (byte49 << 16) | (byte50 << 8) | byte51;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte52 << 18) | (byte53 << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 20) | (byte56 << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 22) | (byte59 << 14) | (byte60 << 6) | (byte61 >>> 2);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 24) | (byte62 << 16) | (byte63 << 8) | byte64;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte65 << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 22) | (byte72 << 14) | (byte73 << 6) | (byte74 >>> 2);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 24) | (byte75 << 16) | (byte76 << 8) | byte77;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 18) | (byte79 << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 20) | (byte82 << 12) | (byte83 << 4) | (byte84 >>> 4);
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 15) << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 24) | (byte88 << 16) | (byte89 << 8) | byte90;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte91 << 18) | (byte92 << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 22) | (byte98 << 14) | (byte99 << 6) | (byte100 >>> 2);
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 24) | (byte101 << 16) | (byte102 << 8) | byte103;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 38;
+ values[valuesOffset++] = (block0 >>> 12) & 67108863L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 4095L) << 14) | (block1 >>> 50);
+ values[valuesOffset++] = (block1 >>> 24) & 67108863L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 16777215L) << 2) | (block2 >>> 62);
+ values[valuesOffset++] = (block2 >>> 36) & 67108863L;
+ values[valuesOffset++] = (block2 >>> 10) & 67108863L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 1023L) << 16) | (block3 >>> 48);
+ values[valuesOffset++] = (block3 >>> 22) & 67108863L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 4194303L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 34) & 67108863L;
+ values[valuesOffset++] = (block4 >>> 8) & 67108863L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 255L) << 18) | (block5 >>> 46);
+ values[valuesOffset++] = (block5 >>> 20) & 67108863L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1048575L) << 6) | (block6 >>> 58);
+ values[valuesOffset++] = (block6 >>> 32) & 67108863L;
+ values[valuesOffset++] = (block6 >>> 6) & 67108863L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 63L) << 20) | (block7 >>> 44);
+ values[valuesOffset++] = (block7 >>> 18) & 67108863L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 262143L) << 8) | (block8 >>> 56);
+ values[valuesOffset++] = (block8 >>> 30) & 67108863L;
+ values[valuesOffset++] = (block8 >>> 4) & 67108863L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 22) | (block9 >>> 42);
+ values[valuesOffset++] = (block9 >>> 16) & 67108863L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 65535L) << 10) | (block10 >>> 54);
+ values[valuesOffset++] = (block10 >>> 28) & 67108863L;
+ values[valuesOffset++] = (block10 >>> 2) & 67108863L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 3L) << 24) | (block11 >>> 40);
+ values[valuesOffset++] = (block11 >>> 14) & 67108863L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 16383L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = (block12 >>> 26) & 67108863L;
+ values[valuesOffset++] = block12 & 67108863L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 18) | (byte1 << 10) | (byte2 << 2) | (byte3 >>> 6);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 63) << 20) | (byte4 << 12) | (byte5 << 4) | (byte6 >>> 4);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 15) << 22) | (byte7 << 14) | (byte8 << 6) | (byte9 >>> 2);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 24) | (byte10 << 16) | (byte11 << 8) | byte12;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte13 << 18) | (byte14 << 10) | (byte15 << 2) | (byte16 >>> 6);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 63) << 20) | (byte17 << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 22) | (byte20 << 14) | (byte21 << 6) | (byte22 >>> 2);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 3) << 24) | (byte23 << 16) | (byte24 << 8) | byte25;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte26 << 18) | (byte27 << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 20) | (byte30 << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 22) | (byte33 << 14) | (byte34 << 6) | (byte35 >>> 2);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 3) << 24) | (byte36 << 16) | (byte37 << 8) | byte38;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 18) | (byte40 << 10) | (byte41 << 2) | (byte42 >>> 6);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 63) << 20) | (byte43 << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 22) | (byte46 << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 24) | (byte49 << 16) | (byte50 << 8) | byte51;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte52 << 18) | (byte53 << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 20) | (byte56 << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 22) | (byte59 << 14) | (byte60 << 6) | (byte61 >>> 2);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 24) | (byte62 << 16) | (byte63 << 8) | byte64;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte65 << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 22) | (byte72 << 14) | (byte73 << 6) | (byte74 >>> 2);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 24) | (byte75 << 16) | (byte76 << 8) | byte77;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 18) | (byte79 << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 20) | (byte82 << 12) | (byte83 << 4) | (byte84 >>> 4);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 15) << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 24) | (byte88 << 16) | (byte89 << 8) | byte90;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte91 << 18) | (byte92 << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 22) | (byte98 << 14) | (byte99 << 6) | (byte100 >>> 2);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 24) | (byte101 << 16) | (byte102 << 8) | byte103;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 26) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 26) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation27 extends BulkOperation {
+ }
+ ,
+ PACKED_27 {
- public int blocks() {
+ public int blockCount() {
return 27;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 37;
- values[vi++] = (block0 >>> 10) & 134217727L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1023L) << 17) | (block1 >>> 47);
- values[vi++] = (block1 >>> 20) & 134217727L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1048575L) << 7) | (block2 >>> 57);
- values[vi++] = (block2 >>> 30) & 134217727L;
- values[vi++] = (block2 >>> 3) & 134217727L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 7L) << 24) | (block3 >>> 40);
- values[vi++] = (block3 >>> 13) & 134217727L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 8191L) << 14) | (block4 >>> 50);
- values[vi++] = (block4 >>> 23) & 134217727L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 8388607L) << 4) | (block5 >>> 60);
- values[vi++] = (block5 >>> 33) & 134217727L;
- values[vi++] = (block5 >>> 6) & 134217727L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 21) | (block6 >>> 43);
- values[vi++] = (block6 >>> 16) & 134217727L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 65535L) << 11) | (block7 >>> 53);
- values[vi++] = (block7 >>> 26) & 134217727L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 67108863L) << 1) | (block8 >>> 63);
- values[vi++] = (block8 >>> 36) & 134217727L;
- values[vi++] = (block8 >>> 9) & 134217727L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 511L) << 18) | (block9 >>> 46);
- values[vi++] = (block9 >>> 19) & 134217727L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 524287L) << 8) | (block10 >>> 56);
- values[vi++] = (block10 >>> 29) & 134217727L;
- values[vi++] = (block10 >>> 2) & 134217727L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 3L) << 25) | (block11 >>> 39);
- values[vi++] = (block11 >>> 12) & 134217727L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4095L) << 15) | (block12 >>> 49);
- values[vi++] = (block12 >>> 22) & 134217727L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4194303L) << 5) | (block13 >>> 59);
- values[vi++] = (block13 >>> 32) & 134217727L;
- values[vi++] = (block13 >>> 5) & 134217727L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 31L) << 22) | (block14 >>> 42);
- values[vi++] = (block14 >>> 15) & 134217727L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 32767L) << 12) | (block15 >>> 52);
- values[vi++] = (block15 >>> 25) & 134217727L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 33554431L) << 2) | (block16 >>> 62);
- values[vi++] = (block16 >>> 35) & 134217727L;
- values[vi++] = (block16 >>> 8) & 134217727L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 255L) << 19) | (block17 >>> 45);
- values[vi++] = (block17 >>> 18) & 134217727L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 262143L) << 9) | (block18 >>> 55);
- values[vi++] = (block18 >>> 28) & 134217727L;
- values[vi++] = (block18 >>> 1) & 134217727L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1L) << 26) | (block19 >>> 38);
- values[vi++] = (block19 >>> 11) & 134217727L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 2047L) << 16) | (block20 >>> 48);
- values[vi++] = (block20 >>> 21) & 134217727L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 2097151L) << 6) | (block21 >>> 58);
- values[vi++] = (block21 >>> 31) & 134217727L;
- values[vi++] = (block21 >>> 4) & 134217727L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 15L) << 23) | (block22 >>> 41);
- values[vi++] = (block22 >>> 14) & 134217727L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 16383L) << 13) | (block23 >>> 51);
- values[vi++] = (block23 >>> 24) & 134217727L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 16777215L) << 3) | (block24 >>> 61);
- values[vi++] = (block24 >>> 34) & 134217727L;
- values[vi++] = (block24 >>> 7) & 134217727L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 127L) << 20) | (block25 >>> 44);
- values[vi++] = (block25 >>> 17) & 134217727L;
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 131071L) << 10) | (block26 >>> 54);
- values[vi++] = (block26 >>> 27) & 134217727L;
- values[vi++] = block26 & 134217727L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 37) | (values[vi++] << 10) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 20) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 30) | (values[vi++] << 3) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 13) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 23) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 33) | (values[vi++] << 6) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 16) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 26) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 36) | (values[vi++] << 9) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 19) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 29) | (values[vi++] << 2) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 12) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 22) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 32) | (values[vi++] << 5) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 15) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 25) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 35) | (values[vi++] << 8) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 18) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 28) | (values[vi++] << 1) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 11) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 21) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 31) | (values[vi++] << 4) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 14) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 24) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 34) | (values[vi++] << 7) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 17) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 27) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 37);
+ values[valuesOffset++] = (int) ((block0 >>> 10) & 134217727L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 1023L) << 17) | (block1 >>> 47));
+ values[valuesOffset++] = (int) ((block1 >>> 20) & 134217727L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 1048575L) << 7) | (block2 >>> 57));
+ values[valuesOffset++] = (int) ((block2 >>> 30) & 134217727L);
+ values[valuesOffset++] = (int) ((block2 >>> 3) & 134217727L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 7L) << 24) | (block3 >>> 40));
+ values[valuesOffset++] = (int) ((block3 >>> 13) & 134217727L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 8191L) << 14) | (block4 >>> 50));
+ values[valuesOffset++] = (int) ((block4 >>> 23) & 134217727L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 8388607L) << 4) | (block5 >>> 60));
+ values[valuesOffset++] = (int) ((block5 >>> 33) & 134217727L);
+ values[valuesOffset++] = (int) ((block5 >>> 6) & 134217727L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 63L) << 21) | (block6 >>> 43));
+ values[valuesOffset++] = (int) ((block6 >>> 16) & 134217727L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 65535L) << 11) | (block7 >>> 53));
+ values[valuesOffset++] = (int) ((block7 >>> 26) & 134217727L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 67108863L) << 1) | (block8 >>> 63));
+ values[valuesOffset++] = (int) ((block8 >>> 36) & 134217727L);
+ values[valuesOffset++] = (int) ((block8 >>> 9) & 134217727L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 511L) << 18) | (block9 >>> 46));
+ values[valuesOffset++] = (int) ((block9 >>> 19) & 134217727L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 524287L) << 8) | (block10 >>> 56));
+ values[valuesOffset++] = (int) ((block10 >>> 29) & 134217727L);
+ values[valuesOffset++] = (int) ((block10 >>> 2) & 134217727L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 3L) << 25) | (block11 >>> 39));
+ values[valuesOffset++] = (int) ((block11 >>> 12) & 134217727L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 4095L) << 15) | (block12 >>> 49));
+ values[valuesOffset++] = (int) ((block12 >>> 22) & 134217727L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 4194303L) << 5) | (block13 >>> 59));
+ values[valuesOffset++] = (int) ((block13 >>> 32) & 134217727L);
+ values[valuesOffset++] = (int) ((block13 >>> 5) & 134217727L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 31L) << 22) | (block14 >>> 42));
+ values[valuesOffset++] = (int) ((block14 >>> 15) & 134217727L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 32767L) << 12) | (block15 >>> 52));
+ values[valuesOffset++] = (int) ((block15 >>> 25) & 134217727L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 33554431L) << 2) | (block16 >>> 62));
+ values[valuesOffset++] = (int) ((block16 >>> 35) & 134217727L);
+ values[valuesOffset++] = (int) ((block16 >>> 8) & 134217727L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 255L) << 19) | (block17 >>> 45));
+ values[valuesOffset++] = (int) ((block17 >>> 18) & 134217727L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 262143L) << 9) | (block18 >>> 55));
+ values[valuesOffset++] = (int) ((block18 >>> 28) & 134217727L);
+ values[valuesOffset++] = (int) ((block18 >>> 1) & 134217727L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 1L) << 26) | (block19 >>> 38));
+ values[valuesOffset++] = (int) ((block19 >>> 11) & 134217727L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 2047L) << 16) | (block20 >>> 48));
+ values[valuesOffset++] = (int) ((block20 >>> 21) & 134217727L);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block20 & 2097151L) << 6) | (block21 >>> 58));
+ values[valuesOffset++] = (int) ((block21 >>> 31) & 134217727L);
+ values[valuesOffset++] = (int) ((block21 >>> 4) & 134217727L);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block21 & 15L) << 23) | (block22 >>> 41));
+ values[valuesOffset++] = (int) ((block22 >>> 14) & 134217727L);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block22 & 16383L) << 13) | (block23 >>> 51));
+ values[valuesOffset++] = (int) ((block23 >>> 24) & 134217727L);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block23 & 16777215L) << 3) | (block24 >>> 61));
+ values[valuesOffset++] = (int) ((block24 >>> 34) & 134217727L);
+ values[valuesOffset++] = (int) ((block24 >>> 7) & 134217727L);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block24 & 127L) << 20) | (block25 >>> 44));
+ values[valuesOffset++] = (int) ((block25 >>> 17) & 134217727L);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block25 & 131071L) << 10) | (block26 >>> 54));
+ values[valuesOffset++] = (int) ((block26 >>> 27) & 134217727L);
+ values[valuesOffset++] = (int) (block26 & 134217727L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 19) | (byte1 << 11) | (byte2 << 3) | (byte3 >>> 5);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 31) << 22) | (byte4 << 14) | (byte5 << 6) | (byte6 >>> 2);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 25) | (byte7 << 17) | (byte8 << 9) | (byte9 << 1) | (byte10 >>> 7);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 127) << 20) | (byte11 << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 23) | (byte14 << 15) | (byte15 << 7) | (byte16 >>> 1);
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 26) | (byte17 << 18) | (byte18 << 10) | (byte19 << 2) | (byte20 >>> 6);
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 21) | (byte21 << 13) | (byte22 << 5) | (byte23 >>> 3);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 24) | (byte24 << 16) | (byte25 << 8) | byte26;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 19) | (byte28 << 11) | (byte29 << 3) | (byte30 >>> 5);
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 31) << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 25) | (byte34 << 17) | (byte35 << 9) | (byte36 << 1) | (byte37 >>> 7);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 20) | (byte38 << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 23) | (byte41 << 15) | (byte42 << 7) | (byte43 >>> 1);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 26) | (byte44 << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 21) | (byte48 << 13) | (byte49 << 5) | (byte50 >>> 3);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 24) | (byte51 << 16) | (byte52 << 8) | byte53;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 19) | (byte55 << 11) | (byte56 << 3) | (byte57 >>> 5);
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 22) | (byte58 << 14) | (byte59 << 6) | (byte60 >>> 2);
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 25) | (byte61 << 17) | (byte62 << 9) | (byte63 << 1) | (byte64 >>> 7);
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 23) | (byte68 << 15) | (byte69 << 7) | (byte70 >>> 1);
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 26) | (byte71 << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 21) | (byte75 << 13) | (byte76 << 5) | (byte77 >>> 3);
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 7) << 24) | (byte78 << 16) | (byte79 << 8) | byte80;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte81 << 19) | (byte82 << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 25) | (byte88 << 17) | (byte89 << 9) | (byte90 << 1) | (byte91 >>> 7);
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 127) << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 23) | (byte95 << 15) | (byte96 << 7) | (byte97 >>> 1);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 1) << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 21) | (byte102 << 13) | (byte103 << 5) | (byte104 >>> 3);
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 7) << 24) | (byte105 << 16) | (byte106 << 8) | byte107;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte108 << 19) | (byte109 << 11) | (byte110 << 3) | (byte111 >>> 5);
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 31) << 22) | (byte112 << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 25) | (byte115 << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 20) | (byte119 << 12) | (byte120 << 4) | (byte121 >>> 4);
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 15) << 23) | (byte122 << 15) | (byte123 << 7) | (byte124 >>> 1);
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte124 & 1) << 26) | (byte125 << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 21) | (byte129 << 13) | (byte130 << 5) | (byte131 >>> 3);
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 7) << 24) | (byte132 << 16) | (byte133 << 8) | byte134;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte135 << 19) | (byte136 << 11) | (byte137 << 3) | (byte138 >>> 5);
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte138 & 31) << 22) | (byte139 << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 25) | (byte142 << 17) | (byte143 << 9) | (byte144 << 1) | (byte145 >>> 7);
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte145 & 127) << 20) | (byte146 << 12) | (byte147 << 4) | (byte148 >>> 4);
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 15) << 23) | (byte149 << 15) | (byte150 << 7) | (byte151 >>> 1);
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 1) << 26) | (byte152 << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 21) | (byte156 << 13) | (byte157 << 5) | (byte158 >>> 3);
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 7) << 24) | (byte159 << 16) | (byte160 << 8) | byte161;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte162 << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ final int byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final int byte169 = blocks[blocksOffset++] & 0xFF;
+ final int byte170 = blocks[blocksOffset++] & 0xFF;
+ final int byte171 = blocks[blocksOffset++] & 0xFF;
+ final int byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 25) | (byte169 << 17) | (byte170 << 9) | (byte171 << 1) | (byte172 >>> 7);
+ final int byte173 = blocks[blocksOffset++] & 0xFF;
+ final int byte174 = blocks[blocksOffset++] & 0xFF;
+ final int byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 127) << 20) | (byte173 << 12) | (byte174 << 4) | (byte175 >>> 4);
+ final int byte176 = blocks[blocksOffset++] & 0xFF;
+ final int byte177 = blocks[blocksOffset++] & 0xFF;
+ final int byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 15) << 23) | (byte176 << 15) | (byte177 << 7) | (byte178 >>> 1);
+ final int byte179 = blocks[blocksOffset++] & 0xFF;
+ final int byte180 = blocks[blocksOffset++] & 0xFF;
+ final int byte181 = blocks[blocksOffset++] & 0xFF;
+ final int byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 1) << 26) | (byte179 << 18) | (byte180 << 10) | (byte181 << 2) | (byte182 >>> 6);
+ final int byte183 = blocks[blocksOffset++] & 0xFF;
+ final int byte184 = blocks[blocksOffset++] & 0xFF;
+ final int byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 63) << 21) | (byte183 << 13) | (byte184 << 5) | (byte185 >>> 3);
+ final int byte186 = blocks[blocksOffset++] & 0xFF;
+ final int byte187 = blocks[blocksOffset++] & 0xFF;
+ final int byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 7) << 24) | (byte186 << 16) | (byte187 << 8) | byte188;
+ final int byte189 = blocks[blocksOffset++] & 0xFF;
+ final int byte190 = blocks[blocksOffset++] & 0xFF;
+ final int byte191 = blocks[blocksOffset++] & 0xFF;
+ final int byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte189 << 19) | (byte190 << 11) | (byte191 << 3) | (byte192 >>> 5);
+ final int byte193 = blocks[blocksOffset++] & 0xFF;
+ final int byte194 = blocks[blocksOffset++] & 0xFF;
+ final int byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 31) << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final int byte196 = blocks[blocksOffset++] & 0xFF;
+ final int byte197 = blocks[blocksOffset++] & 0xFF;
+ final int byte198 = blocks[blocksOffset++] & 0xFF;
+ final int byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 25) | (byte196 << 17) | (byte197 << 9) | (byte198 << 1) | (byte199 >>> 7);
+ final int byte200 = blocks[blocksOffset++] & 0xFF;
+ final int byte201 = blocks[blocksOffset++] & 0xFF;
+ final int byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 127) << 20) | (byte200 << 12) | (byte201 << 4) | (byte202 >>> 4);
+ final int byte203 = blocks[blocksOffset++] & 0xFF;
+ final int byte204 = blocks[blocksOffset++] & 0xFF;
+ final int byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 15) << 23) | (byte203 << 15) | (byte204 << 7) | (byte205 >>> 1);
+ final int byte206 = blocks[blocksOffset++] & 0xFF;
+ final int byte207 = blocks[blocksOffset++] & 0xFF;
+ final int byte208 = blocks[blocksOffset++] & 0xFF;
+ final int byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 1) << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final int byte210 = blocks[blocksOffset++] & 0xFF;
+ final int byte211 = blocks[blocksOffset++] & 0xFF;
+ final int byte212 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 21) | (byte210 << 13) | (byte211 << 5) | (byte212 >>> 3);
+ final int byte213 = blocks[blocksOffset++] & 0xFF;
+ final int byte214 = blocks[blocksOffset++] & 0xFF;
+ final int byte215 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte212 & 7) << 24) | (byte213 << 16) | (byte214 << 8) | byte215;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 37;
+ values[valuesOffset++] = (block0 >>> 10) & 134217727L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1023L) << 17) | (block1 >>> 47);
+ values[valuesOffset++] = (block1 >>> 20) & 134217727L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1048575L) << 7) | (block2 >>> 57);
+ values[valuesOffset++] = (block2 >>> 30) & 134217727L;
+ values[valuesOffset++] = (block2 >>> 3) & 134217727L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 7L) << 24) | (block3 >>> 40);
+ values[valuesOffset++] = (block3 >>> 13) & 134217727L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 8191L) << 14) | (block4 >>> 50);
+ values[valuesOffset++] = (block4 >>> 23) & 134217727L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 8388607L) << 4) | (block5 >>> 60);
+ values[valuesOffset++] = (block5 >>> 33) & 134217727L;
+ values[valuesOffset++] = (block5 >>> 6) & 134217727L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 21) | (block6 >>> 43);
+ values[valuesOffset++] = (block6 >>> 16) & 134217727L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 65535L) << 11) | (block7 >>> 53);
+ values[valuesOffset++] = (block7 >>> 26) & 134217727L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 67108863L) << 1) | (block8 >>> 63);
+ values[valuesOffset++] = (block8 >>> 36) & 134217727L;
+ values[valuesOffset++] = (block8 >>> 9) & 134217727L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 511L) << 18) | (block9 >>> 46);
+ values[valuesOffset++] = (block9 >>> 19) & 134217727L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 524287L) << 8) | (block10 >>> 56);
+ values[valuesOffset++] = (block10 >>> 29) & 134217727L;
+ values[valuesOffset++] = (block10 >>> 2) & 134217727L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 3L) << 25) | (block11 >>> 39);
+ values[valuesOffset++] = (block11 >>> 12) & 134217727L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4095L) << 15) | (block12 >>> 49);
+ values[valuesOffset++] = (block12 >>> 22) & 134217727L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4194303L) << 5) | (block13 >>> 59);
+ values[valuesOffset++] = (block13 >>> 32) & 134217727L;
+ values[valuesOffset++] = (block13 >>> 5) & 134217727L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 31L) << 22) | (block14 >>> 42);
+ values[valuesOffset++] = (block14 >>> 15) & 134217727L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 32767L) << 12) | (block15 >>> 52);
+ values[valuesOffset++] = (block15 >>> 25) & 134217727L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 33554431L) << 2) | (block16 >>> 62);
+ values[valuesOffset++] = (block16 >>> 35) & 134217727L;
+ values[valuesOffset++] = (block16 >>> 8) & 134217727L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 255L) << 19) | (block17 >>> 45);
+ values[valuesOffset++] = (block17 >>> 18) & 134217727L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 262143L) << 9) | (block18 >>> 55);
+ values[valuesOffset++] = (block18 >>> 28) & 134217727L;
+ values[valuesOffset++] = (block18 >>> 1) & 134217727L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1L) << 26) | (block19 >>> 38);
+ values[valuesOffset++] = (block19 >>> 11) & 134217727L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 2047L) << 16) | (block20 >>> 48);
+ values[valuesOffset++] = (block20 >>> 21) & 134217727L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 2097151L) << 6) | (block21 >>> 58);
+ values[valuesOffset++] = (block21 >>> 31) & 134217727L;
+ values[valuesOffset++] = (block21 >>> 4) & 134217727L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 15L) << 23) | (block22 >>> 41);
+ values[valuesOffset++] = (block22 >>> 14) & 134217727L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 16383L) << 13) | (block23 >>> 51);
+ values[valuesOffset++] = (block23 >>> 24) & 134217727L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 16777215L) << 3) | (block24 >>> 61);
+ values[valuesOffset++] = (block24 >>> 34) & 134217727L;
+ values[valuesOffset++] = (block24 >>> 7) & 134217727L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 127L) << 20) | (block25 >>> 44);
+ values[valuesOffset++] = (block25 >>> 17) & 134217727L;
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 131071L) << 10) | (block26 >>> 54);
+ values[valuesOffset++] = (block26 >>> 27) & 134217727L;
+ values[valuesOffset++] = block26 & 134217727L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 19) | (byte1 << 11) | (byte2 << 3) | (byte3 >>> 5);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 31) << 22) | (byte4 << 14) | (byte5 << 6) | (byte6 >>> 2);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 25) | (byte7 << 17) | (byte8 << 9) | (byte9 << 1) | (byte10 >>> 7);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 127) << 20) | (byte11 << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 23) | (byte14 << 15) | (byte15 << 7) | (byte16 >>> 1);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 26) | (byte17 << 18) | (byte18 << 10) | (byte19 << 2) | (byte20 >>> 6);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 21) | (byte21 << 13) | (byte22 << 5) | (byte23 >>> 3);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 24) | (byte24 << 16) | (byte25 << 8) | byte26;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 19) | (byte28 << 11) | (byte29 << 3) | (byte30 >>> 5);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 31) << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 25) | (byte34 << 17) | (byte35 << 9) | (byte36 << 1) | (byte37 >>> 7);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 20) | (byte38 << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 23) | (byte41 << 15) | (byte42 << 7) | (byte43 >>> 1);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 26) | (byte44 << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 21) | (byte48 << 13) | (byte49 << 5) | (byte50 >>> 3);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 24) | (byte51 << 16) | (byte52 << 8) | byte53;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 19) | (byte55 << 11) | (byte56 << 3) | (byte57 >>> 5);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 22) | (byte58 << 14) | (byte59 << 6) | (byte60 >>> 2);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 25) | (byte61 << 17) | (byte62 << 9) | (byte63 << 1) | (byte64 >>> 7);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 23) | (byte68 << 15) | (byte69 << 7) | (byte70 >>> 1);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 26) | (byte71 << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 21) | (byte75 << 13) | (byte76 << 5) | (byte77 >>> 3);
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 7) << 24) | (byte78 << 16) | (byte79 << 8) | byte80;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte81 << 19) | (byte82 << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 25) | (byte88 << 17) | (byte89 << 9) | (byte90 << 1) | (byte91 >>> 7);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 127) << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 23) | (byte95 << 15) | (byte96 << 7) | (byte97 >>> 1);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 1) << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 21) | (byte102 << 13) | (byte103 << 5) | (byte104 >>> 3);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 7) << 24) | (byte105 << 16) | (byte106 << 8) | byte107;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte108 << 19) | (byte109 << 11) | (byte110 << 3) | (byte111 >>> 5);
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 31) << 22) | (byte112 << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 25) | (byte115 << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 20) | (byte119 << 12) | (byte120 << 4) | (byte121 >>> 4);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 15) << 23) | (byte122 << 15) | (byte123 << 7) | (byte124 >>> 1);
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte124 & 1) << 26) | (byte125 << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 21) | (byte129 << 13) | (byte130 << 5) | (byte131 >>> 3);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 7) << 24) | (byte132 << 16) | (byte133 << 8) | byte134;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte135 << 19) | (byte136 << 11) | (byte137 << 3) | (byte138 >>> 5);
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte138 & 31) << 22) | (byte139 << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 25) | (byte142 << 17) | (byte143 << 9) | (byte144 << 1) | (byte145 >>> 7);
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte145 & 127) << 20) | (byte146 << 12) | (byte147 << 4) | (byte148 >>> 4);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 15) << 23) | (byte149 << 15) | (byte150 << 7) | (byte151 >>> 1);
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 1) << 26) | (byte152 << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 21) | (byte156 << 13) | (byte157 << 5) | (byte158 >>> 3);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 7) << 24) | (byte159 << 16) | (byte160 << 8) | byte161;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte162 << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 25) | (byte169 << 17) | (byte170 << 9) | (byte171 << 1) | (byte172 >>> 7);
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 127) << 20) | (byte173 << 12) | (byte174 << 4) | (byte175 >>> 4);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 15) << 23) | (byte176 << 15) | (byte177 << 7) | (byte178 >>> 1);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 1) << 26) | (byte179 << 18) | (byte180 << 10) | (byte181 << 2) | (byte182 >>> 6);
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 63) << 21) | (byte183 << 13) | (byte184 << 5) | (byte185 >>> 3);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 7) << 24) | (byte186 << 16) | (byte187 << 8) | byte188;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte189 << 19) | (byte190 << 11) | (byte191 << 3) | (byte192 >>> 5);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 31) << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 25) | (byte196 << 17) | (byte197 << 9) | (byte198 << 1) | (byte199 >>> 7);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 127) << 20) | (byte200 << 12) | (byte201 << 4) | (byte202 >>> 4);
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 15) << 23) | (byte203 << 15) | (byte204 << 7) | (byte205 >>> 1);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 1) << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 21) | (byte210 << 13) | (byte211 << 5) | (byte212 >>> 3);
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte212 & 7) << 24) | (byte213 << 16) | (byte214 << 8) | byte215;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 27) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 27) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation28 extends BulkOperation {
+ }
+ ,
+ PACKED_28 {
- public int blocks() {
+ public int blockCount() {
return 7;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 36;
- values[vi++] = (block0 >>> 8) & 268435455L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 255L) << 20) | (block1 >>> 44);
- values[vi++] = (block1 >>> 16) & 268435455L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 65535L) << 12) | (block2 >>> 52);
- values[vi++] = (block2 >>> 24) & 268435455L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 16777215L) << 4) | (block3 >>> 60);
- values[vi++] = (block3 >>> 32) & 268435455L;
- values[vi++] = (block3 >>> 4) & 268435455L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 24) | (block4 >>> 40);
- values[vi++] = (block4 >>> 12) & 268435455L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 4095L) << 16) | (block5 >>> 48);
- values[vi++] = (block5 >>> 20) & 268435455L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1048575L) << 8) | (block6 >>> 56);
- values[vi++] = (block6 >>> 28) & 268435455L;
- values[vi++] = block6 & 268435455L;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 36);
+ values[valuesOffset++] = (int) ((block0 >>> 8) & 268435455L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 255L) << 20) | (block1 >>> 44));
+ values[valuesOffset++] = (int) ((block1 >>> 16) & 268435455L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 65535L) << 12) | (block2 >>> 52));
+ values[valuesOffset++] = (int) ((block2 >>> 24) & 268435455L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 16777215L) << 4) | (block3 >>> 60));
+ values[valuesOffset++] = (int) ((block3 >>> 32) & 268435455L);
+ values[valuesOffset++] = (int) ((block3 >>> 4) & 268435455L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 15L) << 24) | (block4 >>> 40));
+ values[valuesOffset++] = (int) ((block4 >>> 12) & 268435455L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 4095L) << 16) | (block5 >>> 48));
+ values[valuesOffset++] = (int) ((block5 >>> 20) & 268435455L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 1048575L) << 8) | (block6 >>> 56));
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 268435455L);
+ values[valuesOffset++] = (int) (block6 & 268435455L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 20) | (byte1 << 12) | (byte2 << 4) | (byte3 >>> 4);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 24) | (byte4 << 16) | (byte5 << 8) | byte6;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte7 << 20) | (byte8 << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 24) | (byte11 << 16) | (byte12 << 8) | byte13;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte14 << 20) | (byte15 << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 24) | (byte18 << 16) | (byte19 << 8) | byte20;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 20) | (byte22 << 12) | (byte23 << 4) | (byte24 >>> 4);
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 24) | (byte25 << 16) | (byte26 << 8) | byte27;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte28 << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 24) | (byte32 << 16) | (byte33 << 8) | byte34;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 20) | (byte36 << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 24) | (byte39 << 16) | (byte40 << 8) | byte41;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 20) | (byte43 << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 24) | (byte46 << 16) | (byte47 << 8) | byte48;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 24) | (byte53 << 16) | (byte54 << 8) | byte55;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 36;
+ values[valuesOffset++] = (block0 >>> 8) & 268435455L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 255L) << 20) | (block1 >>> 44);
+ values[valuesOffset++] = (block1 >>> 16) & 268435455L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 65535L) << 12) | (block2 >>> 52);
+ values[valuesOffset++] = (block2 >>> 24) & 268435455L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 16777215L) << 4) | (block3 >>> 60);
+ values[valuesOffset++] = (block3 >>> 32) & 268435455L;
+ values[valuesOffset++] = (block3 >>> 4) & 268435455L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 24) | (block4 >>> 40);
+ values[valuesOffset++] = (block4 >>> 12) & 268435455L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 4095L) << 16) | (block5 >>> 48);
+ values[valuesOffset++] = (block5 >>> 20) & 268435455L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1048575L) << 8) | (block6 >>> 56);
+ values[valuesOffset++] = (block6 >>> 28) & 268435455L;
+ values[valuesOffset++] = block6 & 268435455L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 20) | (byte1 << 12) | (byte2 << 4) | (byte3 >>> 4);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 15) << 24) | (byte4 << 16) | (byte5 << 8) | byte6;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte7 << 20) | (byte8 << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 24) | (byte11 << 16) | (byte12 << 8) | byte13;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte14 << 20) | (byte15 << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 24) | (byte18 << 16) | (byte19 << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 20) | (byte22 << 12) | (byte23 << 4) | (byte24 >>> 4);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 24) | (byte25 << 16) | (byte26 << 8) | byte27;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte28 << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 24) | (byte32 << 16) | (byte33 << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 20) | (byte36 << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 24) | (byte39 << 16) | (byte40 << 8) | byte41;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 20) | (byte43 << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 24) | (byte46 << 16) | (byte47 << 8) | byte48;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 24) | (byte53 << 16) | (byte54 << 8) | byte55;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 28) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 28) | values[valuesOffset++];
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 8) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 16) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 24) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 32) | (values[vi++] << 4) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 12) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 20) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 28) | values[vi++];
- }
- }
}
+ ,
+ PACKED_29 {
- static final class Packed64BulkOperation29 extends BulkOperation {
-
- public int blocks() {
+ public int blockCount() {
return 29;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 35;
- values[vi++] = (block0 >>> 6) & 536870911L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 63L) << 23) | (block1 >>> 41);
- values[vi++] = (block1 >>> 12) & 536870911L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 4095L) << 17) | (block2 >>> 47);
- values[vi++] = (block2 >>> 18) & 536870911L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 262143L) << 11) | (block3 >>> 53);
- values[vi++] = (block3 >>> 24) & 536870911L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 16777215L) << 5) | (block4 >>> 59);
- values[vi++] = (block4 >>> 30) & 536870911L;
- values[vi++] = (block4 >>> 1) & 536870911L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1L) << 28) | (block5 >>> 36);
- values[vi++] = (block5 >>> 7) & 536870911L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 127L) << 22) | (block6 >>> 42);
- values[vi++] = (block6 >>> 13) & 536870911L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 8191L) << 16) | (block7 >>> 48);
- values[vi++] = (block7 >>> 19) & 536870911L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 524287L) << 10) | (block8 >>> 54);
- values[vi++] = (block8 >>> 25) & 536870911L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 33554431L) << 4) | (block9 >>> 60);
- values[vi++] = (block9 >>> 31) & 536870911L;
- values[vi++] = (block9 >>> 2) & 536870911L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 3L) << 27) | (block10 >>> 37);
- values[vi++] = (block10 >>> 8) & 536870911L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 255L) << 21) | (block11 >>> 43);
- values[vi++] = (block11 >>> 14) & 536870911L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 16383L) << 15) | (block12 >>> 49);
- values[vi++] = (block12 >>> 20) & 536870911L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 1048575L) << 9) | (block13 >>> 55);
- values[vi++] = (block13 >>> 26) & 536870911L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 67108863L) << 3) | (block14 >>> 61);
- values[vi++] = (block14 >>> 32) & 536870911L;
- values[vi++] = (block14 >>> 3) & 536870911L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 7L) << 26) | (block15 >>> 38);
- values[vi++] = (block15 >>> 9) & 536870911L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 511L) << 20) | (block16 >>> 44);
- values[vi++] = (block16 >>> 15) & 536870911L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 32767L) << 14) | (block17 >>> 50);
- values[vi++] = (block17 >>> 21) & 536870911L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 2097151L) << 8) | (block18 >>> 56);
- values[vi++] = (block18 >>> 27) & 536870911L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 134217727L) << 2) | (block19 >>> 62);
- values[vi++] = (block19 >>> 33) & 536870911L;
- values[vi++] = (block19 >>> 4) & 536870911L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 15L) << 25) | (block20 >>> 39);
- values[vi++] = (block20 >>> 10) & 536870911L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 1023L) << 19) | (block21 >>> 45);
- values[vi++] = (block21 >>> 16) & 536870911L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 65535L) << 13) | (block22 >>> 51);
- values[vi++] = (block22 >>> 22) & 536870911L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4194303L) << 7) | (block23 >>> 57);
- values[vi++] = (block23 >>> 28) & 536870911L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 268435455L) << 1) | (block24 >>> 63);
- values[vi++] = (block24 >>> 34) & 536870911L;
- values[vi++] = (block24 >>> 5) & 536870911L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 31L) << 24) | (block25 >>> 40);
- values[vi++] = (block25 >>> 11) & 536870911L;
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 2047L) << 18) | (block26 >>> 46);
- values[vi++] = (block26 >>> 17) & 536870911L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 131071L) << 12) | (block27 >>> 52);
- values[vi++] = (block27 >>> 23) & 536870911L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 8388607L) << 6) | (block28 >>> 58);
- values[vi++] = (block28 >>> 29) & 536870911L;
- values[vi++] = block28 & 536870911L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 35) | (values[vi++] << 6) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 12) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 18) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 24) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 30) | (values[vi++] << 1) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 7) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 13) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 19) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 25) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 31) | (values[vi++] << 2) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi++] << 8) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 14) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 20) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 26) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 32) | (values[vi++] << 3) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 9) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 15) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 21) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 27) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 33) | (values[vi++] << 4) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 10) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 16) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 22) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 28) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 34) | (values[vi++] << 5) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 11) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 17) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 23) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 29) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 35);
+ values[valuesOffset++] = (int) ((block0 >>> 6) & 536870911L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 63L) << 23) | (block1 >>> 41));
+ values[valuesOffset++] = (int) ((block1 >>> 12) & 536870911L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 4095L) << 17) | (block2 >>> 47));
+ values[valuesOffset++] = (int) ((block2 >>> 18) & 536870911L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 262143L) << 11) | (block3 >>> 53));
+ values[valuesOffset++] = (int) ((block3 >>> 24) & 536870911L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 16777215L) << 5) | (block4 >>> 59));
+ values[valuesOffset++] = (int) ((block4 >>> 30) & 536870911L);
+ values[valuesOffset++] = (int) ((block4 >>> 1) & 536870911L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 1L) << 28) | (block5 >>> 36));
+ values[valuesOffset++] = (int) ((block5 >>> 7) & 536870911L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 127L) << 22) | (block6 >>> 42));
+ values[valuesOffset++] = (int) ((block6 >>> 13) & 536870911L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 8191L) << 16) | (block7 >>> 48));
+ values[valuesOffset++] = (int) ((block7 >>> 19) & 536870911L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 524287L) << 10) | (block8 >>> 54));
+ values[valuesOffset++] = (int) ((block8 >>> 25) & 536870911L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 33554431L) << 4) | (block9 >>> 60));
+ values[valuesOffset++] = (int) ((block9 >>> 31) & 536870911L);
+ values[valuesOffset++] = (int) ((block9 >>> 2) & 536870911L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 3L) << 27) | (block10 >>> 37));
+ values[valuesOffset++] = (int) ((block10 >>> 8) & 536870911L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 255L) << 21) | (block11 >>> 43));
+ values[valuesOffset++] = (int) ((block11 >>> 14) & 536870911L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 16383L) << 15) | (block12 >>> 49));
+ values[valuesOffset++] = (int) ((block12 >>> 20) & 536870911L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 1048575L) << 9) | (block13 >>> 55));
+ values[valuesOffset++] = (int) ((block13 >>> 26) & 536870911L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 67108863L) << 3) | (block14 >>> 61));
+ values[valuesOffset++] = (int) ((block14 >>> 32) & 536870911L);
+ values[valuesOffset++] = (int) ((block14 >>> 3) & 536870911L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 7L) << 26) | (block15 >>> 38));
+ values[valuesOffset++] = (int) ((block15 >>> 9) & 536870911L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 511L) << 20) | (block16 >>> 44));
+ values[valuesOffset++] = (int) ((block16 >>> 15) & 536870911L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 32767L) << 14) | (block17 >>> 50));
+ values[valuesOffset++] = (int) ((block17 >>> 21) & 536870911L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 2097151L) << 8) | (block18 >>> 56));
+ values[valuesOffset++] = (int) ((block18 >>> 27) & 536870911L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 134217727L) << 2) | (block19 >>> 62));
+ values[valuesOffset++] = (int) ((block19 >>> 33) & 536870911L);
+ values[valuesOffset++] = (int) ((block19 >>> 4) & 536870911L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 15L) << 25) | (block20 >>> 39));
+ values[valuesOffset++] = (int) ((block20 >>> 10) & 536870911L);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block20 & 1023L) << 19) | (block21 >>> 45));
+ values[valuesOffset++] = (int) ((block21 >>> 16) & 536870911L);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block21 & 65535L) << 13) | (block22 >>> 51));
+ values[valuesOffset++] = (int) ((block22 >>> 22) & 536870911L);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block22 & 4194303L) << 7) | (block23 >>> 57));
+ values[valuesOffset++] = (int) ((block23 >>> 28) & 536870911L);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block23 & 268435455L) << 1) | (block24 >>> 63));
+ values[valuesOffset++] = (int) ((block24 >>> 34) & 536870911L);
+ values[valuesOffset++] = (int) ((block24 >>> 5) & 536870911L);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block24 & 31L) << 24) | (block25 >>> 40));
+ values[valuesOffset++] = (int) ((block25 >>> 11) & 536870911L);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block25 & 2047L) << 18) | (block26 >>> 46));
+ values[valuesOffset++] = (int) ((block26 >>> 17) & 536870911L);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block26 & 131071L) << 12) | (block27 >>> 52));
+ values[valuesOffset++] = (int) ((block27 >>> 23) & 536870911L);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block27 & 8388607L) << 6) | (block28 >>> 58));
+ values[valuesOffset++] = (int) ((block28 >>> 29) & 536870911L);
+ values[valuesOffset++] = (int) (block28 & 536870911L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 21) | (byte1 << 13) | (byte2 << 5) | (byte3 >>> 3);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 7) << 26) | (byte4 << 18) | (byte5 << 10) | (byte6 << 2) | (byte7 >>> 6);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 63) << 23) | (byte8 << 15) | (byte9 << 7) | (byte10 >>> 1);
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 1) << 28) | (byte11 << 20) | (byte12 << 12) | (byte13 << 4) | (byte14 >>> 4);
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 15) << 25) | (byte15 << 17) | (byte16 << 9) | (byte17 << 1) | (byte18 >>> 7);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 127) << 22) | (byte19 << 14) | (byte20 << 6) | (byte21 >>> 2);
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 27) | (byte22 << 19) | (byte23 << 11) | (byte24 << 3) | (byte25 >>> 5);
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 31) << 24) | (byte26 << 16) | (byte27 << 8) | byte28;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte29 << 21) | (byte30 << 13) | (byte31 << 5) | (byte32 >>> 3);
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 7) << 26) | (byte33 << 18) | (byte34 << 10) | (byte35 << 2) | (byte36 >>> 6);
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 63) << 23) | (byte37 << 15) | (byte38 << 7) | (byte39 >>> 1);
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 1) << 28) | (byte40 << 20) | (byte41 << 12) | (byte42 << 4) | (byte43 >>> 4);
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 15) << 25) | (byte44 << 17) | (byte45 << 9) | (byte46 << 1) | (byte47 >>> 7);
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 127) << 22) | (byte48 << 14) | (byte49 << 6) | (byte50 >>> 2);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 27) | (byte51 << 19) | (byte52 << 11) | (byte53 << 3) | (byte54 >>> 5);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 31) << 24) | (byte55 << 16) | (byte56 << 8) | byte57;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte58 << 21) | (byte59 << 13) | (byte60 << 5) | (byte61 >>> 3);
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 7) << 26) | (byte62 << 18) | (byte63 << 10) | (byte64 << 2) | (byte65 >>> 6);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 23) | (byte66 << 15) | (byte67 << 7) | (byte68 >>> 1);
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 1) << 28) | (byte69 << 20) | (byte70 << 12) | (byte71 << 4) | (byte72 >>> 4);
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 15) << 25) | (byte73 << 17) | (byte74 << 9) | (byte75 << 1) | (byte76 >>> 7);
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 127) << 22) | (byte77 << 14) | (byte78 << 6) | (byte79 >>> 2);
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 27) | (byte80 << 19) | (byte81 << 11) | (byte82 << 3) | (byte83 >>> 5);
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 31) << 24) | (byte84 << 16) | (byte85 << 8) | byte86;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte87 << 21) | (byte88 << 13) | (byte89 << 5) | (byte90 >>> 3);
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 7) << 26) | (byte91 << 18) | (byte92 << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 23) | (byte95 << 15) | (byte96 << 7) | (byte97 >>> 1);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 1) << 28) | (byte98 << 20) | (byte99 << 12) | (byte100 << 4) | (byte101 >>> 4);
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 15) << 25) | (byte102 << 17) | (byte103 << 9) | (byte104 << 1) | (byte105 >>> 7);
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte105 & 127) << 22) | (byte106 << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 27) | (byte109 << 19) | (byte110 << 11) | (byte111 << 3) | (byte112 >>> 5);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 31) << 24) | (byte113 << 16) | (byte114 << 8) | byte115;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte116 << 21) | (byte117 << 13) | (byte118 << 5) | (byte119 >>> 3);
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte119 & 7) << 26) | (byte120 << 18) | (byte121 << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 23) | (byte124 << 15) | (byte125 << 7) | (byte126 >>> 1);
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 1) << 28) | (byte127 << 20) | (byte128 << 12) | (byte129 << 4) | (byte130 >>> 4);
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 15) << 25) | (byte131 << 17) | (byte132 << 9) | (byte133 << 1) | (byte134 >>> 7);
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 127) << 22) | (byte135 << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 27) | (byte138 << 19) | (byte139 << 11) | (byte140 << 3) | (byte141 >>> 5);
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 31) << 24) | (byte142 << 16) | (byte143 << 8) | byte144;
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte145 << 21) | (byte146 << 13) | (byte147 << 5) | (byte148 >>> 3);
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 7) << 26) | (byte149 << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 23) | (byte153 << 15) | (byte154 << 7) | (byte155 >>> 1);
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 1) << 28) | (byte156 << 20) | (byte157 << 12) | (byte158 << 4) | (byte159 >>> 4);
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 15) << 25) | (byte160 << 17) | (byte161 << 9) | (byte162 << 1) | (byte163 >>> 7);
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 127) << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ final int byte168 = blocks[blocksOffset++] & 0xFF;
+ final int byte169 = blocks[blocksOffset++] & 0xFF;
+ final int byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 27) | (byte167 << 19) | (byte168 << 11) | (byte169 << 3) | (byte170 >>> 5);
+ final int byte171 = blocks[blocksOffset++] & 0xFF;
+ final int byte172 = blocks[blocksOffset++] & 0xFF;
+ final int byte173 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 31) << 24) | (byte171 << 16) | (byte172 << 8) | byte173;
+ final int byte174 = blocks[blocksOffset++] & 0xFF;
+ final int byte175 = blocks[blocksOffset++] & 0xFF;
+ final int byte176 = blocks[blocksOffset++] & 0xFF;
+ final int byte177 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte174 << 21) | (byte175 << 13) | (byte176 << 5) | (byte177 >>> 3);
+ final int byte178 = blocks[blocksOffset++] & 0xFF;
+ final int byte179 = blocks[blocksOffset++] & 0xFF;
+ final int byte180 = blocks[blocksOffset++] & 0xFF;
+ final int byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte177 & 7) << 26) | (byte178 << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final int byte182 = blocks[blocksOffset++] & 0xFF;
+ final int byte183 = blocks[blocksOffset++] & 0xFF;
+ final int byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 23) | (byte182 << 15) | (byte183 << 7) | (byte184 >>> 1);
+ final int byte185 = blocks[blocksOffset++] & 0xFF;
+ final int byte186 = blocks[blocksOffset++] & 0xFF;
+ final int byte187 = blocks[blocksOffset++] & 0xFF;
+ final int byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 1) << 28) | (byte185 << 20) | (byte186 << 12) | (byte187 << 4) | (byte188 >>> 4);
+ final int byte189 = blocks[blocksOffset++] & 0xFF;
+ final int byte190 = blocks[blocksOffset++] & 0xFF;
+ final int byte191 = blocks[blocksOffset++] & 0xFF;
+ final int byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte188 & 15) << 25) | (byte189 << 17) | (byte190 << 9) | (byte191 << 1) | (byte192 >>> 7);
+ final int byte193 = blocks[blocksOffset++] & 0xFF;
+ final int byte194 = blocks[blocksOffset++] & 0xFF;
+ final int byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 127) << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final int byte196 = blocks[blocksOffset++] & 0xFF;
+ final int byte197 = blocks[blocksOffset++] & 0xFF;
+ final int byte198 = blocks[blocksOffset++] & 0xFF;
+ final int byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 27) | (byte196 << 19) | (byte197 << 11) | (byte198 << 3) | (byte199 >>> 5);
+ final int byte200 = blocks[blocksOffset++] & 0xFF;
+ final int byte201 = blocks[blocksOffset++] & 0xFF;
+ final int byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 31) << 24) | (byte200 << 16) | (byte201 << 8) | byte202;
+ final int byte203 = blocks[blocksOffset++] & 0xFF;
+ final int byte204 = blocks[blocksOffset++] & 0xFF;
+ final int byte205 = blocks[blocksOffset++] & 0xFF;
+ final int byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte203 << 21) | (byte204 << 13) | (byte205 << 5) | (byte206 >>> 3);
+ final int byte207 = blocks[blocksOffset++] & 0xFF;
+ final int byte208 = blocks[blocksOffset++] & 0xFF;
+ final int byte209 = blocks[blocksOffset++] & 0xFF;
+ final int byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 7) << 26) | (byte207 << 18) | (byte208 << 10) | (byte209 << 2) | (byte210 >>> 6);
+ final int byte211 = blocks[blocksOffset++] & 0xFF;
+ final int byte212 = blocks[blocksOffset++] & 0xFF;
+ final int byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 63) << 23) | (byte211 << 15) | (byte212 << 7) | (byte213 >>> 1);
+ final int byte214 = blocks[blocksOffset++] & 0xFF;
+ final int byte215 = blocks[blocksOffset++] & 0xFF;
+ final int byte216 = blocks[blocksOffset++] & 0xFF;
+ final int byte217 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 1) << 28) | (byte214 << 20) | (byte215 << 12) | (byte216 << 4) | (byte217 >>> 4);
+ final int byte218 = blocks[blocksOffset++] & 0xFF;
+ final int byte219 = blocks[blocksOffset++] & 0xFF;
+ final int byte220 = blocks[blocksOffset++] & 0xFF;
+ final int byte221 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte217 & 15) << 25) | (byte218 << 17) | (byte219 << 9) | (byte220 << 1) | (byte221 >>> 7);
+ final int byte222 = blocks[blocksOffset++] & 0xFF;
+ final int byte223 = blocks[blocksOffset++] & 0xFF;
+ final int byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte221 & 127) << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final int byte225 = blocks[blocksOffset++] & 0xFF;
+ final int byte226 = blocks[blocksOffset++] & 0xFF;
+ final int byte227 = blocks[blocksOffset++] & 0xFF;
+ final int byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 27) | (byte225 << 19) | (byte226 << 11) | (byte227 << 3) | (byte228 >>> 5);
+ final int byte229 = blocks[blocksOffset++] & 0xFF;
+ final int byte230 = blocks[blocksOffset++] & 0xFF;
+ final int byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 31) << 24) | (byte229 << 16) | (byte230 << 8) | byte231;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 35;
+ values[valuesOffset++] = (block0 >>> 6) & 536870911L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 63L) << 23) | (block1 >>> 41);
+ values[valuesOffset++] = (block1 >>> 12) & 536870911L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 4095L) << 17) | (block2 >>> 47);
+ values[valuesOffset++] = (block2 >>> 18) & 536870911L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 262143L) << 11) | (block3 >>> 53);
+ values[valuesOffset++] = (block3 >>> 24) & 536870911L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 16777215L) << 5) | (block4 >>> 59);
+ values[valuesOffset++] = (block4 >>> 30) & 536870911L;
+ values[valuesOffset++] = (block4 >>> 1) & 536870911L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1L) << 28) | (block5 >>> 36);
+ values[valuesOffset++] = (block5 >>> 7) & 536870911L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 127L) << 22) | (block6 >>> 42);
+ values[valuesOffset++] = (block6 >>> 13) & 536870911L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 8191L) << 16) | (block7 >>> 48);
+ values[valuesOffset++] = (block7 >>> 19) & 536870911L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 524287L) << 10) | (block8 >>> 54);
+ values[valuesOffset++] = (block8 >>> 25) & 536870911L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 33554431L) << 4) | (block9 >>> 60);
+ values[valuesOffset++] = (block9 >>> 31) & 536870911L;
+ values[valuesOffset++] = (block9 >>> 2) & 536870911L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 3L) << 27) | (block10 >>> 37);
+ values[valuesOffset++] = (block10 >>> 8) & 536870911L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 255L) << 21) | (block11 >>> 43);
+ values[valuesOffset++] = (block11 >>> 14) & 536870911L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 16383L) << 15) | (block12 >>> 49);
+ values[valuesOffset++] = (block12 >>> 20) & 536870911L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 1048575L) << 9) | (block13 >>> 55);
+ values[valuesOffset++] = (block13 >>> 26) & 536870911L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 67108863L) << 3) | (block14 >>> 61);
+ values[valuesOffset++] = (block14 >>> 32) & 536870911L;
+ values[valuesOffset++] = (block14 >>> 3) & 536870911L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 7L) << 26) | (block15 >>> 38);
+ values[valuesOffset++] = (block15 >>> 9) & 536870911L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 511L) << 20) | (block16 >>> 44);
+ values[valuesOffset++] = (block16 >>> 15) & 536870911L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 32767L) << 14) | (block17 >>> 50);
+ values[valuesOffset++] = (block17 >>> 21) & 536870911L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 2097151L) << 8) | (block18 >>> 56);
+ values[valuesOffset++] = (block18 >>> 27) & 536870911L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 134217727L) << 2) | (block19 >>> 62);
+ values[valuesOffset++] = (block19 >>> 33) & 536870911L;
+ values[valuesOffset++] = (block19 >>> 4) & 536870911L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 15L) << 25) | (block20 >>> 39);
+ values[valuesOffset++] = (block20 >>> 10) & 536870911L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 1023L) << 19) | (block21 >>> 45);
+ values[valuesOffset++] = (block21 >>> 16) & 536870911L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 65535L) << 13) | (block22 >>> 51);
+ values[valuesOffset++] = (block22 >>> 22) & 536870911L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4194303L) << 7) | (block23 >>> 57);
+ values[valuesOffset++] = (block23 >>> 28) & 536870911L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 268435455L) << 1) | (block24 >>> 63);
+ values[valuesOffset++] = (block24 >>> 34) & 536870911L;
+ values[valuesOffset++] = (block24 >>> 5) & 536870911L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 31L) << 24) | (block25 >>> 40);
+ values[valuesOffset++] = (block25 >>> 11) & 536870911L;
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 2047L) << 18) | (block26 >>> 46);
+ values[valuesOffset++] = (block26 >>> 17) & 536870911L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 131071L) << 12) | (block27 >>> 52);
+ values[valuesOffset++] = (block27 >>> 23) & 536870911L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 8388607L) << 6) | (block28 >>> 58);
+ values[valuesOffset++] = (block28 >>> 29) & 536870911L;
+ values[valuesOffset++] = block28 & 536870911L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 21) | (byte1 << 13) | (byte2 << 5) | (byte3 >>> 3);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 7) << 26) | (byte4 << 18) | (byte5 << 10) | (byte6 << 2) | (byte7 >>> 6);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 63) << 23) | (byte8 << 15) | (byte9 << 7) | (byte10 >>> 1);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 1) << 28) | (byte11 << 20) | (byte12 << 12) | (byte13 << 4) | (byte14 >>> 4);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 15) << 25) | (byte15 << 17) | (byte16 << 9) | (byte17 << 1) | (byte18 >>> 7);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 127) << 22) | (byte19 << 14) | (byte20 << 6) | (byte21 >>> 2);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 27) | (byte22 << 19) | (byte23 << 11) | (byte24 << 3) | (byte25 >>> 5);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 31) << 24) | (byte26 << 16) | (byte27 << 8) | byte28;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte29 << 21) | (byte30 << 13) | (byte31 << 5) | (byte32 >>> 3);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 7) << 26) | (byte33 << 18) | (byte34 << 10) | (byte35 << 2) | (byte36 >>> 6);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 63) << 23) | (byte37 << 15) | (byte38 << 7) | (byte39 >>> 1);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 1) << 28) | (byte40 << 20) | (byte41 << 12) | (byte42 << 4) | (byte43 >>> 4);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 15) << 25) | (byte44 << 17) | (byte45 << 9) | (byte46 << 1) | (byte47 >>> 7);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 127) << 22) | (byte48 << 14) | (byte49 << 6) | (byte50 >>> 2);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 27) | (byte51 << 19) | (byte52 << 11) | (byte53 << 3) | (byte54 >>> 5);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 31) << 24) | (byte55 << 16) | (byte56 << 8) | byte57;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte58 << 21) | (byte59 << 13) | (byte60 << 5) | (byte61 >>> 3);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 7) << 26) | (byte62 << 18) | (byte63 << 10) | (byte64 << 2) | (byte65 >>> 6);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 23) | (byte66 << 15) | (byte67 << 7) | (byte68 >>> 1);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 1) << 28) | (byte69 << 20) | (byte70 << 12) | (byte71 << 4) | (byte72 >>> 4);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 15) << 25) | (byte73 << 17) | (byte74 << 9) | (byte75 << 1) | (byte76 >>> 7);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 127) << 22) | (byte77 << 14) | (byte78 << 6) | (byte79 >>> 2);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 27) | (byte80 << 19) | (byte81 << 11) | (byte82 << 3) | (byte83 >>> 5);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 31) << 24) | (byte84 << 16) | (byte85 << 8) | byte86;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte87 << 21) | (byte88 << 13) | (byte89 << 5) | (byte90 >>> 3);
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 7) << 26) | (byte91 << 18) | (byte92 << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 23) | (byte95 << 15) | (byte96 << 7) | (byte97 >>> 1);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 1) << 28) | (byte98 << 20) | (byte99 << 12) | (byte100 << 4) | (byte101 >>> 4);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 15) << 25) | (byte102 << 17) | (byte103 << 9) | (byte104 << 1) | (byte105 >>> 7);
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte105 & 127) << 22) | (byte106 << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 27) | (byte109 << 19) | (byte110 << 11) | (byte111 << 3) | (byte112 >>> 5);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 31) << 24) | (byte113 << 16) | (byte114 << 8) | byte115;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte116 << 21) | (byte117 << 13) | (byte118 << 5) | (byte119 >>> 3);
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte119 & 7) << 26) | (byte120 << 18) | (byte121 << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 23) | (byte124 << 15) | (byte125 << 7) | (byte126 >>> 1);
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 1) << 28) | (byte127 << 20) | (byte128 << 12) | (byte129 << 4) | (byte130 >>> 4);
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 15) << 25) | (byte131 << 17) | (byte132 << 9) | (byte133 << 1) | (byte134 >>> 7);
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 127) << 22) | (byte135 << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 27) | (byte138 << 19) | (byte139 << 11) | (byte140 << 3) | (byte141 >>> 5);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 31) << 24) | (byte142 << 16) | (byte143 << 8) | byte144;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte145 << 21) | (byte146 << 13) | (byte147 << 5) | (byte148 >>> 3);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 7) << 26) | (byte149 << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 23) | (byte153 << 15) | (byte154 << 7) | (byte155 >>> 1);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 1) << 28) | (byte156 << 20) | (byte157 << 12) | (byte158 << 4) | (byte159 >>> 4);
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 15) << 25) | (byte160 << 17) | (byte161 << 9) | (byte162 << 1) | (byte163 >>> 7);
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 127) << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 27) | (byte167 << 19) | (byte168 << 11) | (byte169 << 3) | (byte170 >>> 5);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 31) << 24) | (byte171 << 16) | (byte172 << 8) | byte173;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte174 << 21) | (byte175 << 13) | (byte176 << 5) | (byte177 >>> 3);
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte177 & 7) << 26) | (byte178 << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 23) | (byte182 << 15) | (byte183 << 7) | (byte184 >>> 1);
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 1) << 28) | (byte185 << 20) | (byte186 << 12) | (byte187 << 4) | (byte188 >>> 4);
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte188 & 15) << 25) | (byte189 << 17) | (byte190 << 9) | (byte191 << 1) | (byte192 >>> 7);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 127) << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 27) | (byte196 << 19) | (byte197 << 11) | (byte198 << 3) | (byte199 >>> 5);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 31) << 24) | (byte200 << 16) | (byte201 << 8) | byte202;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte203 << 21) | (byte204 << 13) | (byte205 << 5) | (byte206 >>> 3);
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 7) << 26) | (byte207 << 18) | (byte208 << 10) | (byte209 << 2) | (byte210 >>> 6);
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 63) << 23) | (byte211 << 15) | (byte212 << 7) | (byte213 >>> 1);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 1) << 28) | (byte214 << 20) | (byte215 << 12) | (byte216 << 4) | (byte217 >>> 4);
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte217 & 15) << 25) | (byte218 << 17) | (byte219 << 9) | (byte220 << 1) | (byte221 >>> 7);
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte221 & 127) << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 27) | (byte225 << 19) | (byte226 << 11) | (byte227 << 3) | (byte228 >>> 5);
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 31) << 24) | (byte229 << 16) | (byte230 << 8) | byte231;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 29) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 29) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation30 extends BulkOperation {
+ }
+ ,
+ PACKED_30 {
- public int blocks() {
+ public int blockCount() {
return 15;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 34;
- values[vi++] = (block0 >>> 4) & 1073741823L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 26) | (block1 >>> 38);
- values[vi++] = (block1 >>> 8) & 1073741823L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 22) | (block2 >>> 42);
- values[vi++] = (block2 >>> 12) & 1073741823L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 18) | (block3 >>> 46);
- values[vi++] = (block3 >>> 16) & 1073741823L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 65535L) << 14) | (block4 >>> 50);
- values[vi++] = (block4 >>> 20) & 1073741823L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1048575L) << 10) | (block5 >>> 54);
- values[vi++] = (block5 >>> 24) & 1073741823L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 16777215L) << 6) | (block6 >>> 58);
- values[vi++] = (block6 >>> 28) & 1073741823L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 268435455L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 32) & 1073741823L;
- values[vi++] = (block7 >>> 2) & 1073741823L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 3L) << 28) | (block8 >>> 36);
- values[vi++] = (block8 >>> 6) & 1073741823L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 63L) << 24) | (block9 >>> 40);
- values[vi++] = (block9 >>> 10) & 1073741823L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 20) | (block10 >>> 44);
- values[vi++] = (block10 >>> 14) & 1073741823L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 16383L) << 16) | (block11 >>> 48);
- values[vi++] = (block11 >>> 18) & 1073741823L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 262143L) << 12) | (block12 >>> 52);
- values[vi++] = (block12 >>> 22) & 1073741823L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4194303L) << 8) | (block13 >>> 56);
- values[vi++] = (block13 >>> 26) & 1073741823L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 67108863L) << 4) | (block14 >>> 60);
- values[vi++] = (block14 >>> 30) & 1073741823L;
- values[vi++] = block14 & 1073741823L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 34) | (values[vi++] << 4) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 8) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 12) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 16) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 20) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 24) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 28) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 32) | (values[vi++] << 2) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 6) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 10) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 14) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 18) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 22) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 26) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 30) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 34);
+ values[valuesOffset++] = (int) ((block0 >>> 4) & 1073741823L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 15L) << 26) | (block1 >>> 38));
+ values[valuesOffset++] = (int) ((block1 >>> 8) & 1073741823L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 255L) << 22) | (block2 >>> 42));
+ values[valuesOffset++] = (int) ((block2 >>> 12) & 1073741823L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 4095L) << 18) | (block3 >>> 46));
+ values[valuesOffset++] = (int) ((block3 >>> 16) & 1073741823L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 65535L) << 14) | (block4 >>> 50));
+ values[valuesOffset++] = (int) ((block4 >>> 20) & 1073741823L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 1048575L) << 10) | (block5 >>> 54));
+ values[valuesOffset++] = (int) ((block5 >>> 24) & 1073741823L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 16777215L) << 6) | (block6 >>> 58));
+ values[valuesOffset++] = (int) ((block6 >>> 28) & 1073741823L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 268435455L) << 2) | (block7 >>> 62));
+ values[valuesOffset++] = (int) ((block7 >>> 32) & 1073741823L);
+ values[valuesOffset++] = (int) ((block7 >>> 2) & 1073741823L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 3L) << 28) | (block8 >>> 36));
+ values[valuesOffset++] = (int) ((block8 >>> 6) & 1073741823L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 63L) << 24) | (block9 >>> 40));
+ values[valuesOffset++] = (int) ((block9 >>> 10) & 1073741823L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 1023L) << 20) | (block10 >>> 44));
+ values[valuesOffset++] = (int) ((block10 >>> 14) & 1073741823L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 16383L) << 16) | (block11 >>> 48));
+ values[valuesOffset++] = (int) ((block11 >>> 18) & 1073741823L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 262143L) << 12) | (block12 >>> 52));
+ values[valuesOffset++] = (int) ((block12 >>> 22) & 1073741823L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 4194303L) << 8) | (block13 >>> 56));
+ values[valuesOffset++] = (int) ((block13 >>> 26) & 1073741823L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 67108863L) << 4) | (block14 >>> 60));
+ values[valuesOffset++] = (int) ((block14 >>> 30) & 1073741823L);
+ values[valuesOffset++] = (int) (block14 & 1073741823L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 22) | (byte1 << 14) | (byte2 << 6) | (byte3 >>> 2);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 28) | (byte4 << 20) | (byte5 << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 26) | (byte8 << 18) | (byte9 << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 24) | (byte12 << 16) | (byte13 << 8) | byte14;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 22) | (byte16 << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 28) | (byte19 << 20) | (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 26) | (byte23 << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 24) | (byte27 << 16) | (byte28 << 8) | byte29;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 28) | (byte34 << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 26) | (byte38 << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 24) | (byte42 << 16) | (byte43 << 8) | byte44;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 22) | (byte46 << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 28) | (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 26) | (byte53 << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 24) | (byte57 << 16) | (byte58 << 8) | byte59;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte60 << 22) | (byte61 << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 26) | (byte68 << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 26) | (byte83 << 18) | (byte84 << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 24) | (byte87 << 16) | (byte88 << 8) | byte89;
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 22) | (byte91 << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 28) | (byte94 << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 24) | (byte102 << 16) | (byte103 << 8) | byte104;
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 22) | (byte106 << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 28) | (byte109 << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 26) | (byte113 << 18) | (byte114 << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 24) | (byte117 << 16) | (byte118 << 8) | byte119;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 34;
+ values[valuesOffset++] = (block0 >>> 4) & 1073741823L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 26) | (block1 >>> 38);
+ values[valuesOffset++] = (block1 >>> 8) & 1073741823L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 22) | (block2 >>> 42);
+ values[valuesOffset++] = (block2 >>> 12) & 1073741823L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 18) | (block3 >>> 46);
+ values[valuesOffset++] = (block3 >>> 16) & 1073741823L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 65535L) << 14) | (block4 >>> 50);
+ values[valuesOffset++] = (block4 >>> 20) & 1073741823L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1048575L) << 10) | (block5 >>> 54);
+ values[valuesOffset++] = (block5 >>> 24) & 1073741823L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 16777215L) << 6) | (block6 >>> 58);
+ values[valuesOffset++] = (block6 >>> 28) & 1073741823L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 268435455L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 32) & 1073741823L;
+ values[valuesOffset++] = (block7 >>> 2) & 1073741823L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 3L) << 28) | (block8 >>> 36);
+ values[valuesOffset++] = (block8 >>> 6) & 1073741823L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 63L) << 24) | (block9 >>> 40);
+ values[valuesOffset++] = (block9 >>> 10) & 1073741823L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 20) | (block10 >>> 44);
+ values[valuesOffset++] = (block10 >>> 14) & 1073741823L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 16383L) << 16) | (block11 >>> 48);
+ values[valuesOffset++] = (block11 >>> 18) & 1073741823L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 262143L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = (block12 >>> 22) & 1073741823L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4194303L) << 8) | (block13 >>> 56);
+ values[valuesOffset++] = (block13 >>> 26) & 1073741823L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 67108863L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = (block14 >>> 30) & 1073741823L;
+ values[valuesOffset++] = block14 & 1073741823L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 22) | (byte1 << 14) | (byte2 << 6) | (byte3 >>> 2);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 3) << 28) | (byte4 << 20) | (byte5 << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 26) | (byte8 << 18) | (byte9 << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 24) | (byte12 << 16) | (byte13 << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 22) | (byte16 << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 28) | (byte19 << 20) | (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 26) | (byte23 << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 24) | (byte27 << 16) | (byte28 << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 28) | (byte34 << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 26) | (byte38 << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 24) | (byte42 << 16) | (byte43 << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 22) | (byte46 << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 28) | (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 26) | (byte53 << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 24) | (byte57 << 16) | (byte58 << 8) | byte59;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte60 << 22) | (byte61 << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 26) | (byte68 << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 26) | (byte83 << 18) | (byte84 << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 24) | (byte87 << 16) | (byte88 << 8) | byte89;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 22) | (byte91 << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 28) | (byte94 << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 24) | (byte102 << 16) | (byte103 << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 22) | (byte106 << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 28) | (byte109 << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 26) | (byte113 << 18) | (byte114 << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 24) | (byte117 << 16) | (byte118 << 8) | byte119;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 30) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 30) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation31 extends BulkOperation {
+ }
+ ,
+ PACKED_31 {
- public int blocks() {
+ public int blockCount() {
return 31;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 33;
- values[vi++] = (block0 >>> 2) & 2147483647L;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 3L) << 29) | (block1 >>> 35);
- values[vi++] = (block1 >>> 4) & 2147483647L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 15L) << 27) | (block2 >>> 37);
- values[vi++] = (block2 >>> 6) & 2147483647L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 63L) << 25) | (block3 >>> 39);
- values[vi++] = (block3 >>> 8) & 2147483647L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 255L) << 23) | (block4 >>> 41);
- values[vi++] = (block4 >>> 10) & 2147483647L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1023L) << 21) | (block5 >>> 43);
- values[vi++] = (block5 >>> 12) & 2147483647L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 4095L) << 19) | (block6 >>> 45);
- values[vi++] = (block6 >>> 14) & 2147483647L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 16383L) << 17) | (block7 >>> 47);
- values[vi++] = (block7 >>> 16) & 2147483647L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 65535L) << 15) | (block8 >>> 49);
- values[vi++] = (block8 >>> 18) & 2147483647L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 262143L) << 13) | (block9 >>> 51);
- values[vi++] = (block9 >>> 20) & 2147483647L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1048575L) << 11) | (block10 >>> 53);
- values[vi++] = (block10 >>> 22) & 2147483647L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 4194303L) << 9) | (block11 >>> 55);
- values[vi++] = (block11 >>> 24) & 2147483647L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 16777215L) << 7) | (block12 >>> 57);
- values[vi++] = (block12 >>> 26) & 2147483647L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 67108863L) << 5) | (block13 >>> 59);
- values[vi++] = (block13 >>> 28) & 2147483647L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 268435455L) << 3) | (block14 >>> 61);
- values[vi++] = (block14 >>> 30) & 2147483647L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1073741823L) << 1) | (block15 >>> 63);
- values[vi++] = (block15 >>> 32) & 2147483647L;
- values[vi++] = (block15 >>> 1) & 2147483647L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 1L) << 30) | (block16 >>> 34);
- values[vi++] = (block16 >>> 3) & 2147483647L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 7L) << 28) | (block17 >>> 36);
- values[vi++] = (block17 >>> 5) & 2147483647L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 31L) << 26) | (block18 >>> 38);
- values[vi++] = (block18 >>> 7) & 2147483647L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 127L) << 24) | (block19 >>> 40);
- values[vi++] = (block19 >>> 9) & 2147483647L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 511L) << 22) | (block20 >>> 42);
- values[vi++] = (block20 >>> 11) & 2147483647L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 2047L) << 20) | (block21 >>> 44);
- values[vi++] = (block21 >>> 13) & 2147483647L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 8191L) << 18) | (block22 >>> 46);
- values[vi++] = (block22 >>> 15) & 2147483647L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 32767L) << 16) | (block23 >>> 48);
- values[vi++] = (block23 >>> 17) & 2147483647L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 131071L) << 14) | (block24 >>> 50);
- values[vi++] = (block24 >>> 19) & 2147483647L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 524287L) << 12) | (block25 >>> 52);
- values[vi++] = (block25 >>> 21) & 2147483647L;
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 2097151L) << 10) | (block26 >>> 54);
- values[vi++] = (block26 >>> 23) & 2147483647L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 8388607L) << 8) | (block27 >>> 56);
- values[vi++] = (block27 >>> 25) & 2147483647L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 33554431L) << 6) | (block28 >>> 58);
- values[vi++] = (block28 >>> 27) & 2147483647L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 134217727L) << 4) | (block29 >>> 60);
- values[vi++] = (block29 >>> 29) & 2147483647L;
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 536870911L) << 2) | (block30 >>> 62);
- values[vi++] = (block30 >>> 31) & 2147483647L;
- values[vi++] = block30 & 2147483647L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 33) | (values[vi++] << 2) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi++] << 4) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi++] << 6) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 8) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 10) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 12) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 14) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 16) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 18) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 20) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 22) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 24) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 26) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 28) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 30) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 32) | (values[vi++] << 1) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi++] << 3) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 5) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 7) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 9) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 11) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 13) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 15) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 17) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 19) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 21) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 23) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 25) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 27) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 29) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 31) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 33);
+ values[valuesOffset++] = (int) ((block0 >>> 2) & 2147483647L);
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block0 & 3L) << 29) | (block1 >>> 35));
+ values[valuesOffset++] = (int) ((block1 >>> 4) & 2147483647L);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block1 & 15L) << 27) | (block2 >>> 37));
+ values[valuesOffset++] = (int) ((block2 >>> 6) & 2147483647L);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block2 & 63L) << 25) | (block3 >>> 39));
+ values[valuesOffset++] = (int) ((block3 >>> 8) & 2147483647L);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block3 & 255L) << 23) | (block4 >>> 41));
+ values[valuesOffset++] = (int) ((block4 >>> 10) & 2147483647L);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block4 & 1023L) << 21) | (block5 >>> 43));
+ values[valuesOffset++] = (int) ((block5 >>> 12) & 2147483647L);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block5 & 4095L) << 19) | (block6 >>> 45));
+ values[valuesOffset++] = (int) ((block6 >>> 14) & 2147483647L);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block6 & 16383L) << 17) | (block7 >>> 47));
+ values[valuesOffset++] = (int) ((block7 >>> 16) & 2147483647L);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block7 & 65535L) << 15) | (block8 >>> 49));
+ values[valuesOffset++] = (int) ((block8 >>> 18) & 2147483647L);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block8 & 262143L) << 13) | (block9 >>> 51));
+ values[valuesOffset++] = (int) ((block9 >>> 20) & 2147483647L);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block9 & 1048575L) << 11) | (block10 >>> 53));
+ values[valuesOffset++] = (int) ((block10 >>> 22) & 2147483647L);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block10 & 4194303L) << 9) | (block11 >>> 55));
+ values[valuesOffset++] = (int) ((block11 >>> 24) & 2147483647L);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block11 & 16777215L) << 7) | (block12 >>> 57));
+ values[valuesOffset++] = (int) ((block12 >>> 26) & 2147483647L);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block12 & 67108863L) << 5) | (block13 >>> 59));
+ values[valuesOffset++] = (int) ((block13 >>> 28) & 2147483647L);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block13 & 268435455L) << 3) | (block14 >>> 61));
+ values[valuesOffset++] = (int) ((block14 >>> 30) & 2147483647L);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block14 & 1073741823L) << 1) | (block15 >>> 63));
+ values[valuesOffset++] = (int) ((block15 >>> 32) & 2147483647L);
+ values[valuesOffset++] = (int) ((block15 >>> 1) & 2147483647L);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block15 & 1L) << 30) | (block16 >>> 34));
+ values[valuesOffset++] = (int) ((block16 >>> 3) & 2147483647L);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block16 & 7L) << 28) | (block17 >>> 36));
+ values[valuesOffset++] = (int) ((block17 >>> 5) & 2147483647L);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block17 & 31L) << 26) | (block18 >>> 38));
+ values[valuesOffset++] = (int) ((block18 >>> 7) & 2147483647L);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block18 & 127L) << 24) | (block19 >>> 40));
+ values[valuesOffset++] = (int) ((block19 >>> 9) & 2147483647L);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block19 & 511L) << 22) | (block20 >>> 42));
+ values[valuesOffset++] = (int) ((block20 >>> 11) & 2147483647L);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block20 & 2047L) << 20) | (block21 >>> 44));
+ values[valuesOffset++] = (int) ((block21 >>> 13) & 2147483647L);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block21 & 8191L) << 18) | (block22 >>> 46));
+ values[valuesOffset++] = (int) ((block22 >>> 15) & 2147483647L);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block22 & 32767L) << 16) | (block23 >>> 48));
+ values[valuesOffset++] = (int) ((block23 >>> 17) & 2147483647L);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block23 & 131071L) << 14) | (block24 >>> 50));
+ values[valuesOffset++] = (int) ((block24 >>> 19) & 2147483647L);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block24 & 524287L) << 12) | (block25 >>> 52));
+ values[valuesOffset++] = (int) ((block25 >>> 21) & 2147483647L);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block25 & 2097151L) << 10) | (block26 >>> 54));
+ values[valuesOffset++] = (int) ((block26 >>> 23) & 2147483647L);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block26 & 8388607L) << 8) | (block27 >>> 56));
+ values[valuesOffset++] = (int) ((block27 >>> 25) & 2147483647L);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block27 & 33554431L) << 6) | (block28 >>> 58));
+ values[valuesOffset++] = (int) ((block28 >>> 27) & 2147483647L);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block28 & 134217727L) << 4) | (block29 >>> 60));
+ values[valuesOffset++] = (int) ((block29 >>> 29) & 2147483647L);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (((block29 & 536870911L) << 2) | (block30 >>> 62));
+ values[valuesOffset++] = (int) ((block30 >>> 31) & 2147483647L);
+ values[valuesOffset++] = (int) (block30 & 2147483647L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 23) | (byte1 << 15) | (byte2 << 7) | (byte3 >>> 1);
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 1) << 30) | (byte4 << 22) | (byte5 << 14) | (byte6 << 6) | (byte7 >>> 2);
+ final int byte8 = blocks[blocksOffset++] & 0xFF;
+ final int byte9 = blocks[blocksOffset++] & 0xFF;
+ final int byte10 = blocks[blocksOffset++] & 0xFF;
+ final int byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 3) << 29) | (byte8 << 21) | (byte9 << 13) | (byte10 << 5) | (byte11 >>> 3);
+ final int byte12 = blocks[blocksOffset++] & 0xFF;
+ final int byte13 = blocks[blocksOffset++] & 0xFF;
+ final int byte14 = blocks[blocksOffset++] & 0xFF;
+ final int byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 7) << 28) | (byte12 << 20) | (byte13 << 12) | (byte14 << 4) | (byte15 >>> 4);
+ final int byte16 = blocks[blocksOffset++] & 0xFF;
+ final int byte17 = blocks[blocksOffset++] & 0xFF;
+ final int byte18 = blocks[blocksOffset++] & 0xFF;
+ final int byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 15) << 27) | (byte16 << 19) | (byte17 << 11) | (byte18 << 3) | (byte19 >>> 5);
+ final int byte20 = blocks[blocksOffset++] & 0xFF;
+ final int byte21 = blocks[blocksOffset++] & 0xFF;
+ final int byte22 = blocks[blocksOffset++] & 0xFF;
+ final int byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 31) << 26) | (byte20 << 18) | (byte21 << 10) | (byte22 << 2) | (byte23 >>> 6);
+ final int byte24 = blocks[blocksOffset++] & 0xFF;
+ final int byte25 = blocks[blocksOffset++] & 0xFF;
+ final int byte26 = blocks[blocksOffset++] & 0xFF;
+ final int byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 63) << 25) | (byte24 << 17) | (byte25 << 9) | (byte26 << 1) | (byte27 >>> 7);
+ final int byte28 = blocks[blocksOffset++] & 0xFF;
+ final int byte29 = blocks[blocksOffset++] & 0xFF;
+ final int byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 127) << 24) | (byte28 << 16) | (byte29 << 8) | byte30;
+ final int byte31 = blocks[blocksOffset++] & 0xFF;
+ final int byte32 = blocks[blocksOffset++] & 0xFF;
+ final int byte33 = blocks[blocksOffset++] & 0xFF;
+ final int byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte31 << 23) | (byte32 << 15) | (byte33 << 7) | (byte34 >>> 1);
+ final int byte35 = blocks[blocksOffset++] & 0xFF;
+ final int byte36 = blocks[blocksOffset++] & 0xFF;
+ final int byte37 = blocks[blocksOffset++] & 0xFF;
+ final int byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 1) << 30) | (byte35 << 22) | (byte36 << 14) | (byte37 << 6) | (byte38 >>> 2);
+ final int byte39 = blocks[blocksOffset++] & 0xFF;
+ final int byte40 = blocks[blocksOffset++] & 0xFF;
+ final int byte41 = blocks[blocksOffset++] & 0xFF;
+ final int byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 29) | (byte39 << 21) | (byte40 << 13) | (byte41 << 5) | (byte42 >>> 3);
+ final int byte43 = blocks[blocksOffset++] & 0xFF;
+ final int byte44 = blocks[blocksOffset++] & 0xFF;
+ final int byte45 = blocks[blocksOffset++] & 0xFF;
+ final int byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 7) << 28) | (byte43 << 20) | (byte44 << 12) | (byte45 << 4) | (byte46 >>> 4);
+ final int byte47 = blocks[blocksOffset++] & 0xFF;
+ final int byte48 = blocks[blocksOffset++] & 0xFF;
+ final int byte49 = blocks[blocksOffset++] & 0xFF;
+ final int byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 15) << 27) | (byte47 << 19) | (byte48 << 11) | (byte49 << 3) | (byte50 >>> 5);
+ final int byte51 = blocks[blocksOffset++] & 0xFF;
+ final int byte52 = blocks[blocksOffset++] & 0xFF;
+ final int byte53 = blocks[blocksOffset++] & 0xFF;
+ final int byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 31) << 26) | (byte51 << 18) | (byte52 << 10) | (byte53 << 2) | (byte54 >>> 6);
+ final int byte55 = blocks[blocksOffset++] & 0xFF;
+ final int byte56 = blocks[blocksOffset++] & 0xFF;
+ final int byte57 = blocks[blocksOffset++] & 0xFF;
+ final int byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 25) | (byte55 << 17) | (byte56 << 9) | (byte57 << 1) | (byte58 >>> 7);
+ final int byte59 = blocks[blocksOffset++] & 0xFF;
+ final int byte60 = blocks[blocksOffset++] & 0xFF;
+ final int byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 127) << 24) | (byte59 << 16) | (byte60 << 8) | byte61;
+ final int byte62 = blocks[blocksOffset++] & 0xFF;
+ final int byte63 = blocks[blocksOffset++] & 0xFF;
+ final int byte64 = blocks[blocksOffset++] & 0xFF;
+ final int byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte62 << 23) | (byte63 << 15) | (byte64 << 7) | (byte65 >>> 1);
+ final int byte66 = blocks[blocksOffset++] & 0xFF;
+ final int byte67 = blocks[blocksOffset++] & 0xFF;
+ final int byte68 = blocks[blocksOffset++] & 0xFF;
+ final int byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 1) << 30) | (byte66 << 22) | (byte67 << 14) | (byte68 << 6) | (byte69 >>> 2);
+ final int byte70 = blocks[blocksOffset++] & 0xFF;
+ final int byte71 = blocks[blocksOffset++] & 0xFF;
+ final int byte72 = blocks[blocksOffset++] & 0xFF;
+ final int byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 29) | (byte70 << 21) | (byte71 << 13) | (byte72 << 5) | (byte73 >>> 3);
+ final int byte74 = blocks[blocksOffset++] & 0xFF;
+ final int byte75 = blocks[blocksOffset++] & 0xFF;
+ final int byte76 = blocks[blocksOffset++] & 0xFF;
+ final int byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 7) << 28) | (byte74 << 20) | (byte75 << 12) | (byte76 << 4) | (byte77 >>> 4);
+ final int byte78 = blocks[blocksOffset++] & 0xFF;
+ final int byte79 = blocks[blocksOffset++] & 0xFF;
+ final int byte80 = blocks[blocksOffset++] & 0xFF;
+ final int byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 15) << 27) | (byte78 << 19) | (byte79 << 11) | (byte80 << 3) | (byte81 >>> 5);
+ final int byte82 = blocks[blocksOffset++] & 0xFF;
+ final int byte83 = blocks[blocksOffset++] & 0xFF;
+ final int byte84 = blocks[blocksOffset++] & 0xFF;
+ final int byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 31) << 26) | (byte82 << 18) | (byte83 << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final int byte86 = blocks[blocksOffset++] & 0xFF;
+ final int byte87 = blocks[blocksOffset++] & 0xFF;
+ final int byte88 = blocks[blocksOffset++] & 0xFF;
+ final int byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 25) | (byte86 << 17) | (byte87 << 9) | (byte88 << 1) | (byte89 >>> 7);
+ final int byte90 = blocks[blocksOffset++] & 0xFF;
+ final int byte91 = blocks[blocksOffset++] & 0xFF;
+ final int byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 127) << 24) | (byte90 << 16) | (byte91 << 8) | byte92;
+ final int byte93 = blocks[blocksOffset++] & 0xFF;
+ final int byte94 = blocks[blocksOffset++] & 0xFF;
+ final int byte95 = blocks[blocksOffset++] & 0xFF;
+ final int byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte93 << 23) | (byte94 << 15) | (byte95 << 7) | (byte96 >>> 1);
+ final int byte97 = blocks[blocksOffset++] & 0xFF;
+ final int byte98 = blocks[blocksOffset++] & 0xFF;
+ final int byte99 = blocks[blocksOffset++] & 0xFF;
+ final int byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 1) << 30) | (byte97 << 22) | (byte98 << 14) | (byte99 << 6) | (byte100 >>> 2);
+ final int byte101 = blocks[blocksOffset++] & 0xFF;
+ final int byte102 = blocks[blocksOffset++] & 0xFF;
+ final int byte103 = blocks[blocksOffset++] & 0xFF;
+ final int byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 29) | (byte101 << 21) | (byte102 << 13) | (byte103 << 5) | (byte104 >>> 3);
+ final int byte105 = blocks[blocksOffset++] & 0xFF;
+ final int byte106 = blocks[blocksOffset++] & 0xFF;
+ final int byte107 = blocks[blocksOffset++] & 0xFF;
+ final int byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 7) << 28) | (byte105 << 20) | (byte106 << 12) | (byte107 << 4) | (byte108 >>> 4);
+ final int byte109 = blocks[blocksOffset++] & 0xFF;
+ final int byte110 = blocks[blocksOffset++] & 0xFF;
+ final int byte111 = blocks[blocksOffset++] & 0xFF;
+ final int byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 15) << 27) | (byte109 << 19) | (byte110 << 11) | (byte111 << 3) | (byte112 >>> 5);
+ final int byte113 = blocks[blocksOffset++] & 0xFF;
+ final int byte114 = blocks[blocksOffset++] & 0xFF;
+ final int byte115 = blocks[blocksOffset++] & 0xFF;
+ final int byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 31) << 26) | (byte113 << 18) | (byte114 << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final int byte117 = blocks[blocksOffset++] & 0xFF;
+ final int byte118 = blocks[blocksOffset++] & 0xFF;
+ final int byte119 = blocks[blocksOffset++] & 0xFF;
+ final int byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 25) | (byte117 << 17) | (byte118 << 9) | (byte119 << 1) | (byte120 >>> 7);
+ final int byte121 = blocks[blocksOffset++] & 0xFF;
+ final int byte122 = blocks[blocksOffset++] & 0xFF;
+ final int byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 127) << 24) | (byte121 << 16) | (byte122 << 8) | byte123;
+ final int byte124 = blocks[blocksOffset++] & 0xFF;
+ final int byte125 = blocks[blocksOffset++] & 0xFF;
+ final int byte126 = blocks[blocksOffset++] & 0xFF;
+ final int byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte124 << 23) | (byte125 << 15) | (byte126 << 7) | (byte127 >>> 1);
+ final int byte128 = blocks[blocksOffset++] & 0xFF;
+ final int byte129 = blocks[blocksOffset++] & 0xFF;
+ final int byte130 = blocks[blocksOffset++] & 0xFF;
+ final int byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 1) << 30) | (byte128 << 22) | (byte129 << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final int byte132 = blocks[blocksOffset++] & 0xFF;
+ final int byte133 = blocks[blocksOffset++] & 0xFF;
+ final int byte134 = blocks[blocksOffset++] & 0xFF;
+ final int byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 29) | (byte132 << 21) | (byte133 << 13) | (byte134 << 5) | (byte135 >>> 3);
+ final int byte136 = blocks[blocksOffset++] & 0xFF;
+ final int byte137 = blocks[blocksOffset++] & 0xFF;
+ final int byte138 = blocks[blocksOffset++] & 0xFF;
+ final int byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 7) << 28) | (byte136 << 20) | (byte137 << 12) | (byte138 << 4) | (byte139 >>> 4);
+ final int byte140 = blocks[blocksOffset++] & 0xFF;
+ final int byte141 = blocks[blocksOffset++] & 0xFF;
+ final int byte142 = blocks[blocksOffset++] & 0xFF;
+ final int byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 15) << 27) | (byte140 << 19) | (byte141 << 11) | (byte142 << 3) | (byte143 >>> 5);
+ final int byte144 = blocks[blocksOffset++] & 0xFF;
+ final int byte145 = blocks[blocksOffset++] & 0xFF;
+ final int byte146 = blocks[blocksOffset++] & 0xFF;
+ final int byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 31) << 26) | (byte144 << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final int byte148 = blocks[blocksOffset++] & 0xFF;
+ final int byte149 = blocks[blocksOffset++] & 0xFF;
+ final int byte150 = blocks[blocksOffset++] & 0xFF;
+ final int byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 25) | (byte148 << 17) | (byte149 << 9) | (byte150 << 1) | (byte151 >>> 7);
+ final int byte152 = blocks[blocksOffset++] & 0xFF;
+ final int byte153 = blocks[blocksOffset++] & 0xFF;
+ final int byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 127) << 24) | (byte152 << 16) | (byte153 << 8) | byte154;
+ final int byte155 = blocks[blocksOffset++] & 0xFF;
+ final int byte156 = blocks[blocksOffset++] & 0xFF;
+ final int byte157 = blocks[blocksOffset++] & 0xFF;
+ final int byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte155 << 23) | (byte156 << 15) | (byte157 << 7) | (byte158 >>> 1);
+ final int byte159 = blocks[blocksOffset++] & 0xFF;
+ final int byte160 = blocks[blocksOffset++] & 0xFF;
+ final int byte161 = blocks[blocksOffset++] & 0xFF;
+ final int byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 1) << 30) | (byte159 << 22) | (byte160 << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final int byte163 = blocks[blocksOffset++] & 0xFF;
+ final int byte164 = blocks[blocksOffset++] & 0xFF;
+ final int byte165 = blocks[blocksOffset++] & 0xFF;
+ final int byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 29) | (byte163 << 21) | (byte164 << 13) | (byte165 << 5) | (byte166 >>> 3);
+ final int byte167 = blocks[blocksOffset++] & 0xFF;
+ final int byte168 = blocks[blocksOffset++] & 0xFF;
+ final int byte169 = blocks[blocksOffset++] & 0xFF;
+ final int byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 7) << 28) | (byte167 << 20) | (byte168 << 12) | (byte169 << 4) | (byte170 >>> 4);
+ final int byte171 = blocks[blocksOffset++] & 0xFF;
+ final int byte172 = blocks[blocksOffset++] & 0xFF;
+ final int byte173 = blocks[blocksOffset++] & 0xFF;
+ final int byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 15) << 27) | (byte171 << 19) | (byte172 << 11) | (byte173 << 3) | (byte174 >>> 5);
+ final int byte175 = blocks[blocksOffset++] & 0xFF;
+ final int byte176 = blocks[blocksOffset++] & 0xFF;
+ final int byte177 = blocks[blocksOffset++] & 0xFF;
+ final int byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte174 & 31) << 26) | (byte175 << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final int byte179 = blocks[blocksOffset++] & 0xFF;
+ final int byte180 = blocks[blocksOffset++] & 0xFF;
+ final int byte181 = blocks[blocksOffset++] & 0xFF;
+ final int byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 25) | (byte179 << 17) | (byte180 << 9) | (byte181 << 1) | (byte182 >>> 7);
+ final int byte183 = blocks[blocksOffset++] & 0xFF;
+ final int byte184 = blocks[blocksOffset++] & 0xFF;
+ final int byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 127) << 24) | (byte183 << 16) | (byte184 << 8) | byte185;
+ final int byte186 = blocks[blocksOffset++] & 0xFF;
+ final int byte187 = blocks[blocksOffset++] & 0xFF;
+ final int byte188 = blocks[blocksOffset++] & 0xFF;
+ final int byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte186 << 23) | (byte187 << 15) | (byte188 << 7) | (byte189 >>> 1);
+ final int byte190 = blocks[blocksOffset++] & 0xFF;
+ final int byte191 = blocks[blocksOffset++] & 0xFF;
+ final int byte192 = blocks[blocksOffset++] & 0xFF;
+ final int byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 1) << 30) | (byte190 << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final int byte194 = blocks[blocksOffset++] & 0xFF;
+ final int byte195 = blocks[blocksOffset++] & 0xFF;
+ final int byte196 = blocks[blocksOffset++] & 0xFF;
+ final int byte197 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 29) | (byte194 << 21) | (byte195 << 13) | (byte196 << 5) | (byte197 >>> 3);
+ final int byte198 = blocks[blocksOffset++] & 0xFF;
+ final int byte199 = blocks[blocksOffset++] & 0xFF;
+ final int byte200 = blocks[blocksOffset++] & 0xFF;
+ final int byte201 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte197 & 7) << 28) | (byte198 << 20) | (byte199 << 12) | (byte200 << 4) | (byte201 >>> 4);
+ final int byte202 = blocks[blocksOffset++] & 0xFF;
+ final int byte203 = blocks[blocksOffset++] & 0xFF;
+ final int byte204 = blocks[blocksOffset++] & 0xFF;
+ final int byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte201 & 15) << 27) | (byte202 << 19) | (byte203 << 11) | (byte204 << 3) | (byte205 >>> 5);
+ final int byte206 = blocks[blocksOffset++] & 0xFF;
+ final int byte207 = blocks[blocksOffset++] & 0xFF;
+ final int byte208 = blocks[blocksOffset++] & 0xFF;
+ final int byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 31) << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final int byte210 = blocks[blocksOffset++] & 0xFF;
+ final int byte211 = blocks[blocksOffset++] & 0xFF;
+ final int byte212 = blocks[blocksOffset++] & 0xFF;
+ final int byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 25) | (byte210 << 17) | (byte211 << 9) | (byte212 << 1) | (byte213 >>> 7);
+ final int byte214 = blocks[blocksOffset++] & 0xFF;
+ final int byte215 = blocks[blocksOffset++] & 0xFF;
+ final int byte216 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 127) << 24) | (byte214 << 16) | (byte215 << 8) | byte216;
+ final int byte217 = blocks[blocksOffset++] & 0xFF;
+ final int byte218 = blocks[blocksOffset++] & 0xFF;
+ final int byte219 = blocks[blocksOffset++] & 0xFF;
+ final int byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte217 << 23) | (byte218 << 15) | (byte219 << 7) | (byte220 >>> 1);
+ final int byte221 = blocks[blocksOffset++] & 0xFF;
+ final int byte222 = blocks[blocksOffset++] & 0xFF;
+ final int byte223 = blocks[blocksOffset++] & 0xFF;
+ final int byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 1) << 30) | (byte221 << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final int byte225 = blocks[blocksOffset++] & 0xFF;
+ final int byte226 = blocks[blocksOffset++] & 0xFF;
+ final int byte227 = blocks[blocksOffset++] & 0xFF;
+ final int byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 29) | (byte225 << 21) | (byte226 << 13) | (byte227 << 5) | (byte228 >>> 3);
+ final int byte229 = blocks[blocksOffset++] & 0xFF;
+ final int byte230 = blocks[blocksOffset++] & 0xFF;
+ final int byte231 = blocks[blocksOffset++] & 0xFF;
+ final int byte232 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 7) << 28) | (byte229 << 20) | (byte230 << 12) | (byte231 << 4) | (byte232 >>> 4);
+ final int byte233 = blocks[blocksOffset++] & 0xFF;
+ final int byte234 = blocks[blocksOffset++] & 0xFF;
+ final int byte235 = blocks[blocksOffset++] & 0xFF;
+ final int byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte232 & 15) << 27) | (byte233 << 19) | (byte234 << 11) | (byte235 << 3) | (byte236 >>> 5);
+ final int byte237 = blocks[blocksOffset++] & 0xFF;
+ final int byte238 = blocks[blocksOffset++] & 0xFF;
+ final int byte239 = blocks[blocksOffset++] & 0xFF;
+ final int byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 31) << 26) | (byte237 << 18) | (byte238 << 10) | (byte239 << 2) | (byte240 >>> 6);
+ final int byte241 = blocks[blocksOffset++] & 0xFF;
+ final int byte242 = blocks[blocksOffset++] & 0xFF;
+ final int byte243 = blocks[blocksOffset++] & 0xFF;
+ final int byte244 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 63) << 25) | (byte241 << 17) | (byte242 << 9) | (byte243 << 1) | (byte244 >>> 7);
+ final int byte245 = blocks[blocksOffset++] & 0xFF;
+ final int byte246 = blocks[blocksOffset++] & 0xFF;
+ final int byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte244 & 127) << 24) | (byte245 << 16) | (byte246 << 8) | byte247;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 33;
+ values[valuesOffset++] = (block0 >>> 2) & 2147483647L;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 3L) << 29) | (block1 >>> 35);
+ values[valuesOffset++] = (block1 >>> 4) & 2147483647L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 15L) << 27) | (block2 >>> 37);
+ values[valuesOffset++] = (block2 >>> 6) & 2147483647L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 63L) << 25) | (block3 >>> 39);
+ values[valuesOffset++] = (block3 >>> 8) & 2147483647L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 255L) << 23) | (block4 >>> 41);
+ values[valuesOffset++] = (block4 >>> 10) & 2147483647L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1023L) << 21) | (block5 >>> 43);
+ values[valuesOffset++] = (block5 >>> 12) & 2147483647L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 4095L) << 19) | (block6 >>> 45);
+ values[valuesOffset++] = (block6 >>> 14) & 2147483647L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 16383L) << 17) | (block7 >>> 47);
+ values[valuesOffset++] = (block7 >>> 16) & 2147483647L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 65535L) << 15) | (block8 >>> 49);
+ values[valuesOffset++] = (block8 >>> 18) & 2147483647L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 262143L) << 13) | (block9 >>> 51);
+ values[valuesOffset++] = (block9 >>> 20) & 2147483647L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1048575L) << 11) | (block10 >>> 53);
+ values[valuesOffset++] = (block10 >>> 22) & 2147483647L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 4194303L) << 9) | (block11 >>> 55);
+ values[valuesOffset++] = (block11 >>> 24) & 2147483647L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 16777215L) << 7) | (block12 >>> 57);
+ values[valuesOffset++] = (block12 >>> 26) & 2147483647L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 67108863L) << 5) | (block13 >>> 59);
+ values[valuesOffset++] = (block13 >>> 28) & 2147483647L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 268435455L) << 3) | (block14 >>> 61);
+ values[valuesOffset++] = (block14 >>> 30) & 2147483647L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1073741823L) << 1) | (block15 >>> 63);
+ values[valuesOffset++] = (block15 >>> 32) & 2147483647L;
+ values[valuesOffset++] = (block15 >>> 1) & 2147483647L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 1L) << 30) | (block16 >>> 34);
+ values[valuesOffset++] = (block16 >>> 3) & 2147483647L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 7L) << 28) | (block17 >>> 36);
+ values[valuesOffset++] = (block17 >>> 5) & 2147483647L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 31L) << 26) | (block18 >>> 38);
+ values[valuesOffset++] = (block18 >>> 7) & 2147483647L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 127L) << 24) | (block19 >>> 40);
+ values[valuesOffset++] = (block19 >>> 9) & 2147483647L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 511L) << 22) | (block20 >>> 42);
+ values[valuesOffset++] = (block20 >>> 11) & 2147483647L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 2047L) << 20) | (block21 >>> 44);
+ values[valuesOffset++] = (block21 >>> 13) & 2147483647L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 8191L) << 18) | (block22 >>> 46);
+ values[valuesOffset++] = (block22 >>> 15) & 2147483647L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 32767L) << 16) | (block23 >>> 48);
+ values[valuesOffset++] = (block23 >>> 17) & 2147483647L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 131071L) << 14) | (block24 >>> 50);
+ values[valuesOffset++] = (block24 >>> 19) & 2147483647L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 524287L) << 12) | (block25 >>> 52);
+ values[valuesOffset++] = (block25 >>> 21) & 2147483647L;
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 2097151L) << 10) | (block26 >>> 54);
+ values[valuesOffset++] = (block26 >>> 23) & 2147483647L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 8388607L) << 8) | (block27 >>> 56);
+ values[valuesOffset++] = (block27 >>> 25) & 2147483647L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 33554431L) << 6) | (block28 >>> 58);
+ values[valuesOffset++] = (block28 >>> 27) & 2147483647L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 134217727L) << 4) | (block29 >>> 60);
+ values[valuesOffset++] = (block29 >>> 29) & 2147483647L;
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 536870911L) << 2) | (block30 >>> 62);
+ values[valuesOffset++] = (block30 >>> 31) & 2147483647L;
+ values[valuesOffset++] = block30 & 2147483647L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 23) | (byte1 << 15) | (byte2 << 7) | (byte3 >>> 1);
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte3 & 1) << 30) | (byte4 << 22) | (byte5 << 14) | (byte6 << 6) | (byte7 >>> 2);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 3) << 29) | (byte8 << 21) | (byte9 << 13) | (byte10 << 5) | (byte11 >>> 3);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 7) << 28) | (byte12 << 20) | (byte13 << 12) | (byte14 << 4) | (byte15 >>> 4);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 15) << 27) | (byte16 << 19) | (byte17 << 11) | (byte18 << 3) | (byte19 >>> 5);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 31) << 26) | (byte20 << 18) | (byte21 << 10) | (byte22 << 2) | (byte23 >>> 6);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 63) << 25) | (byte24 << 17) | (byte25 << 9) | (byte26 << 1) | (byte27 >>> 7);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 127) << 24) | (byte28 << 16) | (byte29 << 8) | byte30;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte31 << 23) | (byte32 << 15) | (byte33 << 7) | (byte34 >>> 1);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 1) << 30) | (byte35 << 22) | (byte36 << 14) | (byte37 << 6) | (byte38 >>> 2);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 29) | (byte39 << 21) | (byte40 << 13) | (byte41 << 5) | (byte42 >>> 3);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 7) << 28) | (byte43 << 20) | (byte44 << 12) | (byte45 << 4) | (byte46 >>> 4);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 15) << 27) | (byte47 << 19) | (byte48 << 11) | (byte49 << 3) | (byte50 >>> 5);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 31) << 26) | (byte51 << 18) | (byte52 << 10) | (byte53 << 2) | (byte54 >>> 6);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 25) | (byte55 << 17) | (byte56 << 9) | (byte57 << 1) | (byte58 >>> 7);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 127) << 24) | (byte59 << 16) | (byte60 << 8) | byte61;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte62 << 23) | (byte63 << 15) | (byte64 << 7) | (byte65 >>> 1);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 1) << 30) | (byte66 << 22) | (byte67 << 14) | (byte68 << 6) | (byte69 >>> 2);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 29) | (byte70 << 21) | (byte71 << 13) | (byte72 << 5) | (byte73 >>> 3);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 7) << 28) | (byte74 << 20) | (byte75 << 12) | (byte76 << 4) | (byte77 >>> 4);
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 15) << 27) | (byte78 << 19) | (byte79 << 11) | (byte80 << 3) | (byte81 >>> 5);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 31) << 26) | (byte82 << 18) | (byte83 << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 25) | (byte86 << 17) | (byte87 << 9) | (byte88 << 1) | (byte89 >>> 7);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 127) << 24) | (byte90 << 16) | (byte91 << 8) | byte92;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte93 << 23) | (byte94 << 15) | (byte95 << 7) | (byte96 >>> 1);
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 1) << 30) | (byte97 << 22) | (byte98 << 14) | (byte99 << 6) | (byte100 >>> 2);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 29) | (byte101 << 21) | (byte102 << 13) | (byte103 << 5) | (byte104 >>> 3);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 7) << 28) | (byte105 << 20) | (byte106 << 12) | (byte107 << 4) | (byte108 >>> 4);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 15) << 27) | (byte109 << 19) | (byte110 << 11) | (byte111 << 3) | (byte112 >>> 5);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 31) << 26) | (byte113 << 18) | (byte114 << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 25) | (byte117 << 17) | (byte118 << 9) | (byte119 << 1) | (byte120 >>> 7);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 127) << 24) | (byte121 << 16) | (byte122 << 8) | byte123;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte124 << 23) | (byte125 << 15) | (byte126 << 7) | (byte127 >>> 1);
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 1) << 30) | (byte128 << 22) | (byte129 << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 29) | (byte132 << 21) | (byte133 << 13) | (byte134 << 5) | (byte135 >>> 3);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 7) << 28) | (byte136 << 20) | (byte137 << 12) | (byte138 << 4) | (byte139 >>> 4);
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 15) << 27) | (byte140 << 19) | (byte141 << 11) | (byte142 << 3) | (byte143 >>> 5);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 31) << 26) | (byte144 << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 25) | (byte148 << 17) | (byte149 << 9) | (byte150 << 1) | (byte151 >>> 7);
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 127) << 24) | (byte152 << 16) | (byte153 << 8) | byte154;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte155 << 23) | (byte156 << 15) | (byte157 << 7) | (byte158 >>> 1);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 1) << 30) | (byte159 << 22) | (byte160 << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 29) | (byte163 << 21) | (byte164 << 13) | (byte165 << 5) | (byte166 >>> 3);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 7) << 28) | (byte167 << 20) | (byte168 << 12) | (byte169 << 4) | (byte170 >>> 4);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 15) << 27) | (byte171 << 19) | (byte172 << 11) | (byte173 << 3) | (byte174 >>> 5);
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte174 & 31) << 26) | (byte175 << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 25) | (byte179 << 17) | (byte180 << 9) | (byte181 << 1) | (byte182 >>> 7);
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 127) << 24) | (byte183 << 16) | (byte184 << 8) | byte185;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte186 << 23) | (byte187 << 15) | (byte188 << 7) | (byte189 >>> 1);
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 1) << 30) | (byte190 << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 29) | (byte194 << 21) | (byte195 << 13) | (byte196 << 5) | (byte197 >>> 3);
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte197 & 7) << 28) | (byte198 << 20) | (byte199 << 12) | (byte200 << 4) | (byte201 >>> 4);
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte201 & 15) << 27) | (byte202 << 19) | (byte203 << 11) | (byte204 << 3) | (byte205 >>> 5);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 31) << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 25) | (byte210 << 17) | (byte211 << 9) | (byte212 << 1) | (byte213 >>> 7);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 127) << 24) | (byte214 << 16) | (byte215 << 8) | byte216;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte217 << 23) | (byte218 << 15) | (byte219 << 7) | (byte220 >>> 1);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 1) << 30) | (byte221 << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 29) | (byte225 << 21) | (byte226 << 13) | (byte227 << 5) | (byte228 >>> 3);
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 7) << 28) | (byte229 << 20) | (byte230 << 12) | (byte231 << 4) | (byte232 >>> 4);
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte232 & 15) << 27) | (byte233 << 19) | (byte234 << 11) | (byte235 << 3) | (byte236 >>> 5);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 31) << 26) | (byte237 << 18) | (byte238 << 10) | (byte239 << 2) | (byte240 >>> 6);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 63) << 25) | (byte241 << 17) | (byte242 << 9) | (byte243 << 1) | (byte244 >>> 7);
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte244 & 127) << 24) | (byte245 << 16) | (byte246 << 8) | byte247;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 31) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 31) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation32 extends BulkOperation {
+ }
+ ,
+ PACKED_32 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 2;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block0 >>> 32);
+ values[valuesOffset++] = (int) (block0 & 4294967295L);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte4 << 24) | (byte5 << 16) | (byte6 << 8) | byte7;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 32;
+ values[valuesOffset++] = block0 & 4294967295L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 32;
- values[vi++] = block0 & 4294967295L;
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte4 << 24) | (byte5 << 16) | (byte6 << 8) | byte7;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 32) | values[vi++];
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | (values[valuesOffset++] & 0xffffffffL);
}
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | values[valuesOffset++];
+ }
}
- static final class Packed64BulkOperation33 extends BulkOperation {
+ }
+ ,
+ PACKED_33 {
- public int blocks() {
+ public int blockCount() {
return 33;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 31;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 2147483647L) << 2) | (block1 >>> 62);
- values[vi++] = (block1 >>> 29) & 8589934591L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 536870911L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 27) & 8589934591L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 134217727L) << 6) | (block3 >>> 58);
- values[vi++] = (block3 >>> 25) & 8589934591L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 33554431L) << 8) | (block4 >>> 56);
- values[vi++] = (block4 >>> 23) & 8589934591L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 8388607L) << 10) | (block5 >>> 54);
- values[vi++] = (block5 >>> 21) & 8589934591L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 2097151L) << 12) | (block6 >>> 52);
- values[vi++] = (block6 >>> 19) & 8589934591L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 524287L) << 14) | (block7 >>> 50);
- values[vi++] = (block7 >>> 17) & 8589934591L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 131071L) << 16) | (block8 >>> 48);
- values[vi++] = (block8 >>> 15) & 8589934591L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 32767L) << 18) | (block9 >>> 46);
- values[vi++] = (block9 >>> 13) & 8589934591L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 8191L) << 20) | (block10 >>> 44);
- values[vi++] = (block10 >>> 11) & 8589934591L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 2047L) << 22) | (block11 >>> 42);
- values[vi++] = (block11 >>> 9) & 8589934591L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 511L) << 24) | (block12 >>> 40);
- values[vi++] = (block12 >>> 7) & 8589934591L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 127L) << 26) | (block13 >>> 38);
- values[vi++] = (block13 >>> 5) & 8589934591L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 31L) << 28) | (block14 >>> 36);
- values[vi++] = (block14 >>> 3) & 8589934591L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 7L) << 30) | (block15 >>> 34);
- values[vi++] = (block15 >>> 1) & 8589934591L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 1L) << 32) | (block16 >>> 32);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 4294967295L) << 1) | (block17 >>> 63);
- values[vi++] = (block17 >>> 30) & 8589934591L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 1073741823L) << 3) | (block18 >>> 61);
- values[vi++] = (block18 >>> 28) & 8589934591L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 268435455L) << 5) | (block19 >>> 59);
- values[vi++] = (block19 >>> 26) & 8589934591L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 67108863L) << 7) | (block20 >>> 57);
- values[vi++] = (block20 >>> 24) & 8589934591L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 16777215L) << 9) | (block21 >>> 55);
- values[vi++] = (block21 >>> 22) & 8589934591L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 4194303L) << 11) | (block22 >>> 53);
- values[vi++] = (block22 >>> 20) & 8589934591L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 1048575L) << 13) | (block23 >>> 51);
- values[vi++] = (block23 >>> 18) & 8589934591L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 262143L) << 15) | (block24 >>> 49);
- values[vi++] = (block24 >>> 16) & 8589934591L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 65535L) << 17) | (block25 >>> 47);
- values[vi++] = (block25 >>> 14) & 8589934591L;
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 16383L) << 19) | (block26 >>> 45);
- values[vi++] = (block26 >>> 12) & 8589934591L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 4095L) << 21) | (block27 >>> 43);
- values[vi++] = (block27 >>> 10) & 8589934591L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 1023L) << 23) | (block28 >>> 41);
- values[vi++] = (block28 >>> 8) & 8589934591L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 255L) << 25) | (block29 >>> 39);
- values[vi++] = (block29 >>> 6) & 8589934591L;
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 63L) << 27) | (block30 >>> 37);
- values[vi++] = (block30 >>> 4) & 8589934591L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 15L) << 29) | (block31 >>> 35);
- values[vi++] = (block31 >>> 2) & 8589934591L;
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 3L) << 31) | (block32 >>> 33);
- values[vi++] = block32 & 8589934591L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 29) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 27) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 25) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 23) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 21) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 19) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 17) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 15) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 13) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 11) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 9) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 7) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 5) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 3) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi++] << 1) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 30) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 28) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 26) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 24) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 22) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 20) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 18) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 16) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 14) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 12) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 10) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 8) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 6) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi++] << 4) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi++] << 2) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 31;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 2147483647L) << 2) | (block1 >>> 62);
+ values[valuesOffset++] = (block1 >>> 29) & 8589934591L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 536870911L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 27) & 8589934591L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 134217727L) << 6) | (block3 >>> 58);
+ values[valuesOffset++] = (block3 >>> 25) & 8589934591L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 33554431L) << 8) | (block4 >>> 56);
+ values[valuesOffset++] = (block4 >>> 23) & 8589934591L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 8388607L) << 10) | (block5 >>> 54);
+ values[valuesOffset++] = (block5 >>> 21) & 8589934591L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 2097151L) << 12) | (block6 >>> 52);
+ values[valuesOffset++] = (block6 >>> 19) & 8589934591L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 524287L) << 14) | (block7 >>> 50);
+ values[valuesOffset++] = (block7 >>> 17) & 8589934591L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 131071L) << 16) | (block8 >>> 48);
+ values[valuesOffset++] = (block8 >>> 15) & 8589934591L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 32767L) << 18) | (block9 >>> 46);
+ values[valuesOffset++] = (block9 >>> 13) & 8589934591L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 8191L) << 20) | (block10 >>> 44);
+ values[valuesOffset++] = (block10 >>> 11) & 8589934591L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 2047L) << 22) | (block11 >>> 42);
+ values[valuesOffset++] = (block11 >>> 9) & 8589934591L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 511L) << 24) | (block12 >>> 40);
+ values[valuesOffset++] = (block12 >>> 7) & 8589934591L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 127L) << 26) | (block13 >>> 38);
+ values[valuesOffset++] = (block13 >>> 5) & 8589934591L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 31L) << 28) | (block14 >>> 36);
+ values[valuesOffset++] = (block14 >>> 3) & 8589934591L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 7L) << 30) | (block15 >>> 34);
+ values[valuesOffset++] = (block15 >>> 1) & 8589934591L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 1L) << 32) | (block16 >>> 32);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 4294967295L) << 1) | (block17 >>> 63);
+ values[valuesOffset++] = (block17 >>> 30) & 8589934591L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 1073741823L) << 3) | (block18 >>> 61);
+ values[valuesOffset++] = (block18 >>> 28) & 8589934591L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 268435455L) << 5) | (block19 >>> 59);
+ values[valuesOffset++] = (block19 >>> 26) & 8589934591L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 67108863L) << 7) | (block20 >>> 57);
+ values[valuesOffset++] = (block20 >>> 24) & 8589934591L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 16777215L) << 9) | (block21 >>> 55);
+ values[valuesOffset++] = (block21 >>> 22) & 8589934591L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 4194303L) << 11) | (block22 >>> 53);
+ values[valuesOffset++] = (block22 >>> 20) & 8589934591L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 1048575L) << 13) | (block23 >>> 51);
+ values[valuesOffset++] = (block23 >>> 18) & 8589934591L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 262143L) << 15) | (block24 >>> 49);
+ values[valuesOffset++] = (block24 >>> 16) & 8589934591L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 65535L) << 17) | (block25 >>> 47);
+ values[valuesOffset++] = (block25 >>> 14) & 8589934591L;
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 16383L) << 19) | (block26 >>> 45);
+ values[valuesOffset++] = (block26 >>> 12) & 8589934591L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 4095L) << 21) | (block27 >>> 43);
+ values[valuesOffset++] = (block27 >>> 10) & 8589934591L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 1023L) << 23) | (block28 >>> 41);
+ values[valuesOffset++] = (block28 >>> 8) & 8589934591L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 255L) << 25) | (block29 >>> 39);
+ values[valuesOffset++] = (block29 >>> 6) & 8589934591L;
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 63L) << 27) | (block30 >>> 37);
+ values[valuesOffset++] = (block30 >>> 4) & 8589934591L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 15L) << 29) | (block31 >>> 35);
+ values[valuesOffset++] = (block31 >>> 2) & 8589934591L;
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 3L) << 31) | (block32 >>> 33);
+ values[valuesOffset++] = block32 & 8589934591L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 25) | (byte1 << 17) | (byte2 << 9) | (byte3 << 1) | (byte4 >>> 7);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 127) << 26) | (byte5 << 18) | (byte6 << 10) | (byte7 << 2) | (byte8 >>> 6);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 63) << 27) | (byte9 << 19) | (byte10 << 11) | (byte11 << 3) | (byte12 >>> 5);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 31) << 28) | (byte13 << 20) | (byte14 << 12) | (byte15 << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 29) | (byte17 << 21) | (byte18 << 13) | (byte19 << 5) | (byte20 >>> 3);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 30) | (byte21 << 22) | (byte22 << 14) | (byte23 << 6) | (byte24 >>> 2);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 3) << 31) | (byte25 << 23) | (byte26 << 15) | (byte27 << 7) | (byte28 >>> 1);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 1) << 32) | (byte29 << 24) | (byte30 << 16) | (byte31 << 8) | byte32;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 25) | (byte34 << 17) | (byte35 << 9) | (byte36 << 1) | (byte37 >>> 7);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 127) << 26) | (byte38 << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 27) | (byte42 << 19) | (byte43 << 11) | (byte44 << 3) | (byte45 >>> 5);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 31) << 28) | (byte46 << 20) | (byte47 << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 29) | (byte50 << 21) | (byte51 << 13) | (byte52 << 5) | (byte53 >>> 3);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 30) | (byte54 << 22) | (byte55 << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 31) | (byte58 << 23) | (byte59 << 15) | (byte60 << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 32) | (byte62 << 24) | (byte63 << 16) | (byte64 << 8) | byte65;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 25) | (byte67 << 17) | (byte68 << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 26) | (byte71 << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 27) | (byte75 << 19) | (byte76 << 11) | (byte77 << 3) | (byte78 >>> 5);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 29) | (byte83 << 21) | (byte84 << 13) | (byte85 << 5) | (byte86 >>> 3);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 30) | (byte87 << 22) | (byte88 << 14) | (byte89 << 6) | (byte90 >>> 2);
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 3) << 31) | (byte91 << 23) | (byte92 << 15) | (byte93 << 7) | (byte94 >>> 1);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 1) << 32) | (byte95 << 24) | (byte96 << 16) | (byte97 << 8) | byte98;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte99 << 25) | (byte100 << 17) | (byte101 << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 26) | (byte104 << 18) | (byte105 << 10) | (byte106 << 2) | (byte107 >>> 6);
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 63) << 27) | (byte108 << 19) | (byte109 << 11) | (byte110 << 3) | (byte111 >>> 5);
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 31) << 28) | (byte112 << 20) | (byte113 << 12) | (byte114 << 4) | (byte115 >>> 4);
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 15) << 29) | (byte116 << 21) | (byte117 << 13) | (byte118 << 5) | (byte119 >>> 3);
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte119 & 7) << 30) | (byte120 << 22) | (byte121 << 14) | (byte122 << 6) | (byte123 >>> 2);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 3) << 31) | (byte124 << 23) | (byte125 << 15) | (byte126 << 7) | (byte127 >>> 1);
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 1) << 32) | (byte128 << 24) | (byte129 << 16) | (byte130 << 8) | byte131;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte132 << 25) | (byte133 << 17) | (byte134 << 9) | (byte135 << 1) | (byte136 >>> 7);
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte136 & 127) << 26) | (byte137 << 18) | (byte138 << 10) | (byte139 << 2) | (byte140 >>> 6);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 63) << 27) | (byte141 << 19) | (byte142 << 11) | (byte143 << 3) | (byte144 >>> 5);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 31) << 28) | (byte145 << 20) | (byte146 << 12) | (byte147 << 4) | (byte148 >>> 4);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 15) << 29) | (byte149 << 21) | (byte150 << 13) | (byte151 << 5) | (byte152 >>> 3);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 7) << 30) | (byte153 << 22) | (byte154 << 14) | (byte155 << 6) | (byte156 >>> 2);
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte156 & 3) << 31) | (byte157 << 23) | (byte158 << 15) | (byte159 << 7) | (byte160 >>> 1);
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte160 & 1) << 32) | (byte161 << 24) | (byte162 << 16) | (byte163 << 8) | byte164;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte165 << 25) | (byte166 << 17) | (byte167 << 9) | (byte168 << 1) | (byte169 >>> 7);
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte169 & 127) << 26) | (byte170 << 18) | (byte171 << 10) | (byte172 << 2) | (byte173 >>> 6);
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte173 & 63) << 27) | (byte174 << 19) | (byte175 << 11) | (byte176 << 3) | (byte177 >>> 5);
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte177 & 31) << 28) | (byte178 << 20) | (byte179 << 12) | (byte180 << 4) | (byte181 >>> 4);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 15) << 29) | (byte182 << 21) | (byte183 << 13) | (byte184 << 5) | (byte185 >>> 3);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 7) << 30) | (byte186 << 22) | (byte187 << 14) | (byte188 << 6) | (byte189 >>> 2);
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 3) << 31) | (byte190 << 23) | (byte191 << 15) | (byte192 << 7) | (byte193 >>> 1);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 1) << 32) | (byte194 << 24) | (byte195 << 16) | (byte196 << 8) | byte197;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte198 << 25) | (byte199 << 17) | (byte200 << 9) | (byte201 << 1) | (byte202 >>> 7);
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 127) << 26) | (byte203 << 18) | (byte204 << 10) | (byte205 << 2) | (byte206 >>> 6);
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 63) << 27) | (byte207 << 19) | (byte208 << 11) | (byte209 << 3) | (byte210 >>> 5);
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 31) << 28) | (byte211 << 20) | (byte212 << 12) | (byte213 << 4) | (byte214 >>> 4);
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte214 & 15) << 29) | (byte215 << 21) | (byte216 << 13) | (byte217 << 5) | (byte218 >>> 3);
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte218 & 7) << 30) | (byte219 << 22) | (byte220 << 14) | (byte221 << 6) | (byte222 >>> 2);
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte222 & 3) << 31) | (byte223 << 23) | (byte224 << 15) | (byte225 << 7) | (byte226 >>> 1);
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte226 & 1) << 32) | (byte227 << 24) | (byte228 << 16) | (byte229 << 8) | byte230;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte231 << 25) | (byte232 << 17) | (byte233 << 9) | (byte234 << 1) | (byte235 >>> 7);
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte235 & 127) << 26) | (byte236 << 18) | (byte237 << 10) | (byte238 << 2) | (byte239 >>> 6);
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte239 & 63) << 27) | (byte240 << 19) | (byte241 << 11) | (byte242 << 3) | (byte243 >>> 5);
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte243 & 31) << 28) | (byte244 << 20) | (byte245 << 12) | (byte246 << 4) | (byte247 >>> 4);
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte247 & 15) << 29) | (byte248 << 21) | (byte249 << 13) | (byte250 << 5) | (byte251 >>> 3);
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte251 & 7) << 30) | (byte252 << 22) | (byte253 << 14) | (byte254 << 6) | (byte255 >>> 2);
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte255 & 3) << 31) | (byte256 << 23) | (byte257 << 15) | (byte258 << 7) | (byte259 >>> 1);
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte259 & 1) << 32) | (byte260 << 24) | (byte261 << 16) | (byte262 << 8) | byte263;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation34 extends BulkOperation {
+ }
+ ,
+ PACKED_34 {
- public int blocks() {
+ public int blockCount() {
return 17;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 30;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1073741823L) << 4) | (block1 >>> 60);
- values[vi++] = (block1 >>> 26) & 17179869183L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 67108863L) << 8) | (block2 >>> 56);
- values[vi++] = (block2 >>> 22) & 17179869183L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4194303L) << 12) | (block3 >>> 52);
- values[vi++] = (block3 >>> 18) & 17179869183L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 262143L) << 16) | (block4 >>> 48);
- values[vi++] = (block4 >>> 14) & 17179869183L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 16383L) << 20) | (block5 >>> 44);
- values[vi++] = (block5 >>> 10) & 17179869183L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1023L) << 24) | (block6 >>> 40);
- values[vi++] = (block6 >>> 6) & 17179869183L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 63L) << 28) | (block7 >>> 36);
- values[vi++] = (block7 >>> 2) & 17179869183L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 3L) << 32) | (block8 >>> 32);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 4294967295L) << 2) | (block9 >>> 62);
- values[vi++] = (block9 >>> 28) & 17179869183L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 268435455L) << 6) | (block10 >>> 58);
- values[vi++] = (block10 >>> 24) & 17179869183L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 16777215L) << 10) | (block11 >>> 54);
- values[vi++] = (block11 >>> 20) & 17179869183L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 1048575L) << 14) | (block12 >>> 50);
- values[vi++] = (block12 >>> 16) & 17179869183L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 65535L) << 18) | (block13 >>> 46);
- values[vi++] = (block13 >>> 12) & 17179869183L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4095L) << 22) | (block14 >>> 42);
- values[vi++] = (block14 >>> 8) & 17179869183L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 255L) << 26) | (block15 >>> 38);
- values[vi++] = (block15 >>> 4) & 17179869183L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 15L) << 30) | (block16 >>> 34);
- values[vi++] = block16 & 17179869183L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 26) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 22) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 18) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 14) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 10) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 6) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 2) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 28) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 24) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 20) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 16) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 12) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 8) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 4) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 30;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1073741823L) << 4) | (block1 >>> 60);
+ values[valuesOffset++] = (block1 >>> 26) & 17179869183L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 67108863L) << 8) | (block2 >>> 56);
+ values[valuesOffset++] = (block2 >>> 22) & 17179869183L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4194303L) << 12) | (block3 >>> 52);
+ values[valuesOffset++] = (block3 >>> 18) & 17179869183L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 262143L) << 16) | (block4 >>> 48);
+ values[valuesOffset++] = (block4 >>> 14) & 17179869183L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 16383L) << 20) | (block5 >>> 44);
+ values[valuesOffset++] = (block5 >>> 10) & 17179869183L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1023L) << 24) | (block6 >>> 40);
+ values[valuesOffset++] = (block6 >>> 6) & 17179869183L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 63L) << 28) | (block7 >>> 36);
+ values[valuesOffset++] = (block7 >>> 2) & 17179869183L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 3L) << 32) | (block8 >>> 32);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 4294967295L) << 2) | (block9 >>> 62);
+ values[valuesOffset++] = (block9 >>> 28) & 17179869183L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 268435455L) << 6) | (block10 >>> 58);
+ values[valuesOffset++] = (block10 >>> 24) & 17179869183L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 16777215L) << 10) | (block11 >>> 54);
+ values[valuesOffset++] = (block11 >>> 20) & 17179869183L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 1048575L) << 14) | (block12 >>> 50);
+ values[valuesOffset++] = (block12 >>> 16) & 17179869183L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 65535L) << 18) | (block13 >>> 46);
+ values[valuesOffset++] = (block13 >>> 12) & 17179869183L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4095L) << 22) | (block14 >>> 42);
+ values[valuesOffset++] = (block14 >>> 8) & 17179869183L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 255L) << 26) | (block15 >>> 38);
+ values[valuesOffset++] = (block15 >>> 4) & 17179869183L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 15L) << 30) | (block16 >>> 34);
+ values[valuesOffset++] = block16 & 17179869183L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 26) | (byte1 << 18) | (byte2 << 10) | (byte3 << 2) | (byte4 >>> 6);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 63) << 28) | (byte5 << 20) | (byte6 << 12) | (byte7 << 4) | (byte8 >>> 4);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 15) << 30) | (byte9 << 22) | (byte10 << 14) | (byte11 << 6) | (byte12 >>> 2);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 32) | (byte13 << 24) | (byte14 << 16) | (byte15 << 8) | byte16;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte17 << 26) | (byte18 << 18) | (byte19 << 10) | (byte20 << 2) | (byte21 >>> 6);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 63) << 28) | (byte22 << 20) | (byte23 << 12) | (byte24 << 4) | (byte25 >>> 4);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 15) << 30) | (byte26 << 22) | (byte27 << 14) | (byte28 << 6) | (byte29 >>> 2);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 3) << 32) | (byte30 << 24) | (byte31 << 16) | (byte32 << 8) | byte33;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte34 << 26) | (byte35 << 18) | (byte36 << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 28) | (byte39 << 20) | (byte40 << 12) | (byte41 << 4) | (byte42 >>> 4);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 15) << 30) | (byte43 << 22) | (byte44 << 14) | (byte45 << 6) | (byte46 >>> 2);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 3) << 32) | (byte47 << 24) | (byte48 << 16) | (byte49 << 8) | byte50;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte51 << 26) | (byte52 << 18) | (byte53 << 10) | (byte54 << 2) | (byte55 >>> 6);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 63) << 28) | (byte56 << 20) | (byte57 << 12) | (byte58 << 4) | (byte59 >>> 4);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 15) << 30) | (byte60 << 22) | (byte61 << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 32) | (byte64 << 24) | (byte65 << 16) | (byte66 << 8) | byte67;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte68 << 26) | (byte69 << 18) | (byte70 << 10) | (byte71 << 2) | (byte72 >>> 6);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 63) << 28) | (byte73 << 20) | (byte74 << 12) | (byte75 << 4) | (byte76 >>> 4);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 15) << 30) | (byte77 << 22) | (byte78 << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 32) | (byte81 << 24) | (byte82 << 16) | (byte83 << 8) | byte84;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte85 << 26) | (byte86 << 18) | (byte87 << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 28) | (byte90 << 20) | (byte91 << 12) | (byte92 << 4) | (byte93 >>> 4);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 15) << 30) | (byte94 << 22) | (byte95 << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 32) | (byte98 << 24) | (byte99 << 16) | (byte100 << 8) | byte101;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte102 << 26) | (byte103 << 18) | (byte104 << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 28) | (byte107 << 20) | (byte108 << 12) | (byte109 << 4) | (byte110 >>> 4);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 15) << 30) | (byte111 << 22) | (byte112 << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 32) | (byte115 << 24) | (byte116 << 16) | (byte117 << 8) | byte118;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte119 << 26) | (byte120 << 18) | (byte121 << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 28) | (byte124 << 20) | (byte125 << 12) | (byte126 << 4) | (byte127 >>> 4);
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 15) << 30) | (byte128 << 22) | (byte129 << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 32) | (byte132 << 24) | (byte133 << 16) | (byte134 << 8) | byte135;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation35 extends BulkOperation {
+ }
+ ,
+ PACKED_35 {
- public int blocks() {
+ public int blockCount() {
return 35;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 29;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 536870911L) << 6) | (block1 >>> 58);
- values[vi++] = (block1 >>> 23) & 34359738367L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 8388607L) << 12) | (block2 >>> 52);
- values[vi++] = (block2 >>> 17) & 34359738367L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 131071L) << 18) | (block3 >>> 46);
- values[vi++] = (block3 >>> 11) & 34359738367L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 2047L) << 24) | (block4 >>> 40);
- values[vi++] = (block4 >>> 5) & 34359738367L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 30) | (block5 >>> 34);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 17179869183L) << 1) | (block6 >>> 63);
- values[vi++] = (block6 >>> 28) & 34359738367L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 268435455L) << 7) | (block7 >>> 57);
- values[vi++] = (block7 >>> 22) & 34359738367L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4194303L) << 13) | (block8 >>> 51);
- values[vi++] = (block8 >>> 16) & 34359738367L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 65535L) << 19) | (block9 >>> 45);
- values[vi++] = (block9 >>> 10) & 34359738367L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 25) | (block10 >>> 39);
- values[vi++] = (block10 >>> 4) & 34359738367L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 15L) << 31) | (block11 >>> 33);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 8589934591L) << 2) | (block12 >>> 62);
- values[vi++] = (block12 >>> 27) & 34359738367L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 134217727L) << 8) | (block13 >>> 56);
- values[vi++] = (block13 >>> 21) & 34359738367L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2097151L) << 14) | (block14 >>> 50);
- values[vi++] = (block14 >>> 15) & 34359738367L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 32767L) << 20) | (block15 >>> 44);
- values[vi++] = (block15 >>> 9) & 34359738367L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 511L) << 26) | (block16 >>> 38);
- values[vi++] = (block16 >>> 3) & 34359738367L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 7L) << 32) | (block17 >>> 32);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 4294967295L) << 3) | (block18 >>> 61);
- values[vi++] = (block18 >>> 26) & 34359738367L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 67108863L) << 9) | (block19 >>> 55);
- values[vi++] = (block19 >>> 20) & 34359738367L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1048575L) << 15) | (block20 >>> 49);
- values[vi++] = (block20 >>> 14) & 34359738367L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 16383L) << 21) | (block21 >>> 43);
- values[vi++] = (block21 >>> 8) & 34359738367L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 255L) << 27) | (block22 >>> 37);
- values[vi++] = (block22 >>> 2) & 34359738367L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 3L) << 33) | (block23 >>> 31);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 2147483647L) << 4) | (block24 >>> 60);
- values[vi++] = (block24 >>> 25) & 34359738367L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 33554431L) << 10) | (block25 >>> 54);
- values[vi++] = (block25 >>> 19) & 34359738367L;
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 524287L) << 16) | (block26 >>> 48);
- values[vi++] = (block26 >>> 13) & 34359738367L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 8191L) << 22) | (block27 >>> 42);
- values[vi++] = (block27 >>> 7) & 34359738367L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 127L) << 28) | (block28 >>> 36);
- values[vi++] = (block28 >>> 1) & 34359738367L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 1L) << 34) | (block29 >>> 30);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1073741823L) << 5) | (block30 >>> 59);
- values[vi++] = (block30 >>> 24) & 34359738367L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 16777215L) << 11) | (block31 >>> 53);
- values[vi++] = (block31 >>> 18) & 34359738367L;
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 262143L) << 17) | (block32 >>> 47);
- values[vi++] = (block32 >>> 12) & 34359738367L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 4095L) << 23) | (block33 >>> 41);
- values[vi++] = (block33 >>> 6) & 34359738367L;
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 63L) << 29) | (block34 >>> 35);
- values[vi++] = block34 & 34359738367L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 23) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 17) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 11) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 5) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 28) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 22) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 16) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 10) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 4) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 27) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 21) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 15) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 9) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 3) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 26) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 20) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 14) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 8) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi++] << 2) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 25) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 19) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 13) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 7) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi++] << 1) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 24) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 18) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 12) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 6) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 29;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 536870911L) << 6) | (block1 >>> 58);
+ values[valuesOffset++] = (block1 >>> 23) & 34359738367L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 8388607L) << 12) | (block2 >>> 52);
+ values[valuesOffset++] = (block2 >>> 17) & 34359738367L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 131071L) << 18) | (block3 >>> 46);
+ values[valuesOffset++] = (block3 >>> 11) & 34359738367L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 2047L) << 24) | (block4 >>> 40);
+ values[valuesOffset++] = (block4 >>> 5) & 34359738367L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 30) | (block5 >>> 34);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 17179869183L) << 1) | (block6 >>> 63);
+ values[valuesOffset++] = (block6 >>> 28) & 34359738367L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 268435455L) << 7) | (block7 >>> 57);
+ values[valuesOffset++] = (block7 >>> 22) & 34359738367L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4194303L) << 13) | (block8 >>> 51);
+ values[valuesOffset++] = (block8 >>> 16) & 34359738367L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 65535L) << 19) | (block9 >>> 45);
+ values[valuesOffset++] = (block9 >>> 10) & 34359738367L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 25) | (block10 >>> 39);
+ values[valuesOffset++] = (block10 >>> 4) & 34359738367L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 15L) << 31) | (block11 >>> 33);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 8589934591L) << 2) | (block12 >>> 62);
+ values[valuesOffset++] = (block12 >>> 27) & 34359738367L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 134217727L) << 8) | (block13 >>> 56);
+ values[valuesOffset++] = (block13 >>> 21) & 34359738367L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2097151L) << 14) | (block14 >>> 50);
+ values[valuesOffset++] = (block14 >>> 15) & 34359738367L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 32767L) << 20) | (block15 >>> 44);
+ values[valuesOffset++] = (block15 >>> 9) & 34359738367L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 511L) << 26) | (block16 >>> 38);
+ values[valuesOffset++] = (block16 >>> 3) & 34359738367L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 7L) << 32) | (block17 >>> 32);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 4294967295L) << 3) | (block18 >>> 61);
+ values[valuesOffset++] = (block18 >>> 26) & 34359738367L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 67108863L) << 9) | (block19 >>> 55);
+ values[valuesOffset++] = (block19 >>> 20) & 34359738367L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1048575L) << 15) | (block20 >>> 49);
+ values[valuesOffset++] = (block20 >>> 14) & 34359738367L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 16383L) << 21) | (block21 >>> 43);
+ values[valuesOffset++] = (block21 >>> 8) & 34359738367L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 255L) << 27) | (block22 >>> 37);
+ values[valuesOffset++] = (block22 >>> 2) & 34359738367L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 3L) << 33) | (block23 >>> 31);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 2147483647L) << 4) | (block24 >>> 60);
+ values[valuesOffset++] = (block24 >>> 25) & 34359738367L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 33554431L) << 10) | (block25 >>> 54);
+ values[valuesOffset++] = (block25 >>> 19) & 34359738367L;
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 524287L) << 16) | (block26 >>> 48);
+ values[valuesOffset++] = (block26 >>> 13) & 34359738367L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 8191L) << 22) | (block27 >>> 42);
+ values[valuesOffset++] = (block27 >>> 7) & 34359738367L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 127L) << 28) | (block28 >>> 36);
+ values[valuesOffset++] = (block28 >>> 1) & 34359738367L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 1L) << 34) | (block29 >>> 30);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1073741823L) << 5) | (block30 >>> 59);
+ values[valuesOffset++] = (block30 >>> 24) & 34359738367L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 16777215L) << 11) | (block31 >>> 53);
+ values[valuesOffset++] = (block31 >>> 18) & 34359738367L;
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 262143L) << 17) | (block32 >>> 47);
+ values[valuesOffset++] = (block32 >>> 12) & 34359738367L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 4095L) << 23) | (block33 >>> 41);
+ values[valuesOffset++] = (block33 >>> 6) & 34359738367L;
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 63L) << 29) | (block34 >>> 35);
+ values[valuesOffset++] = block34 & 34359738367L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 27) | (byte1 << 19) | (byte2 << 11) | (byte3 << 3) | (byte4 >>> 5);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 31) << 30) | (byte5 << 22) | (byte6 << 14) | (byte7 << 6) | (byte8 >>> 2);
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte8 & 3) << 33) | (byte9 << 25) | (byte10 << 17) | (byte11 << 9) | (byte12 << 1) | (byte13 >>> 7);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 127) << 28) | (byte14 << 20) | (byte15 << 12) | (byte16 << 4) | (byte17 >>> 4);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 15) << 31) | (byte18 << 23) | (byte19 << 15) | (byte20 << 7) | (byte21 >>> 1);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 1) << 34) | (byte22 << 26) | (byte23 << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 29) | (byte27 << 21) | (byte28 << 13) | (byte29 << 5) | (byte30 >>> 3);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 32) | (byte31 << 24) | (byte32 << 16) | (byte33 << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 27) | (byte36 << 19) | (byte37 << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 30) | (byte40 << 22) | (byte41 << 14) | (byte42 << 6) | (byte43 >>> 2);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 33) | (byte44 << 25) | (byte45 << 17) | (byte46 << 9) | (byte47 << 1) | (byte48 >>> 7);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 127) << 28) | (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 31) | (byte53 << 23) | (byte54 << 15) | (byte55 << 7) | (byte56 >>> 1);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 1) << 34) | (byte57 << 26) | (byte58 << 18) | (byte59 << 10) | (byte60 << 2) | (byte61 >>> 6);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 63) << 29) | (byte62 << 21) | (byte63 << 13) | (byte64 << 5) | (byte65 >>> 3);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 7) << 32) | (byte66 << 24) | (byte67 << 16) | (byte68 << 8) | byte69;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte70 << 27) | (byte71 << 19) | (byte72 << 11) | (byte73 << 3) | (byte74 >>> 5);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 31) << 30) | (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 33) | (byte79 << 25) | (byte80 << 17) | (byte81 << 9) | (byte82 << 1) | (byte83 >>> 7);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 127) << 28) | (byte84 << 20) | (byte85 << 12) | (byte86 << 4) | (byte87 >>> 4);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 15) << 31) | (byte88 << 23) | (byte89 << 15) | (byte90 << 7) | (byte91 >>> 1);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 34) | (byte92 << 26) | (byte93 << 18) | (byte94 << 10) | (byte95 << 2) | (byte96 >>> 6);
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 63) << 29) | (byte97 << 21) | (byte98 << 13) | (byte99 << 5) | (byte100 >>> 3);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 7) << 32) | (byte101 << 24) | (byte102 << 16) | (byte103 << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 27) | (byte106 << 19) | (byte107 << 11) | (byte108 << 3) | (byte109 >>> 5);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 31) << 30) | (byte110 << 22) | (byte111 << 14) | (byte112 << 6) | (byte113 >>> 2);
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte113 & 3) << 33) | (byte114 << 25) | (byte115 << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 28) | (byte119 << 20) | (byte120 << 12) | (byte121 << 4) | (byte122 >>> 4);
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte122 & 15) << 31) | (byte123 << 23) | (byte124 << 15) | (byte125 << 7) | (byte126 >>> 1);
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 1) << 34) | (byte127 << 26) | (byte128 << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 29) | (byte132 << 21) | (byte133 << 13) | (byte134 << 5) | (byte135 >>> 3);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 7) << 32) | (byte136 << 24) | (byte137 << 16) | (byte138 << 8) | byte139;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte140 << 27) | (byte141 << 19) | (byte142 << 11) | (byte143 << 3) | (byte144 >>> 5);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 31) << 30) | (byte145 << 22) | (byte146 << 14) | (byte147 << 6) | (byte148 >>> 2);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 3) << 33) | (byte149 << 25) | (byte150 << 17) | (byte151 << 9) | (byte152 << 1) | (byte153 >>> 7);
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte153 & 127) << 28) | (byte154 << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 31) | (byte158 << 23) | (byte159 << 15) | (byte160 << 7) | (byte161 >>> 1);
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte161 & 1) << 34) | (byte162 << 26) | (byte163 << 18) | (byte164 << 10) | (byte165 << 2) | (byte166 >>> 6);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 63) << 29) | (byte167 << 21) | (byte168 << 13) | (byte169 << 5) | (byte170 >>> 3);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 7) << 32) | (byte171 << 24) | (byte172 << 16) | (byte173 << 8) | byte174;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte175 << 27) | (byte176 << 19) | (byte177 << 11) | (byte178 << 3) | (byte179 >>> 5);
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte179 & 31) << 30) | (byte180 << 22) | (byte181 << 14) | (byte182 << 6) | (byte183 >>> 2);
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte183 & 3) << 33) | (byte184 << 25) | (byte185 << 17) | (byte186 << 9) | (byte187 << 1) | (byte188 >>> 7);
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte188 & 127) << 28) | (byte189 << 20) | (byte190 << 12) | (byte191 << 4) | (byte192 >>> 4);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 15) << 31) | (byte193 << 23) | (byte194 << 15) | (byte195 << 7) | (byte196 >>> 1);
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte196 & 1) << 34) | (byte197 << 26) | (byte198 << 18) | (byte199 << 10) | (byte200 << 2) | (byte201 >>> 6);
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte201 & 63) << 29) | (byte202 << 21) | (byte203 << 13) | (byte204 << 5) | (byte205 >>> 3);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 7) << 32) | (byte206 << 24) | (byte207 << 16) | (byte208 << 8) | byte209;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte210 << 27) | (byte211 << 19) | (byte212 << 11) | (byte213 << 3) | (byte214 >>> 5);
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte214 & 31) << 30) | (byte215 << 22) | (byte216 << 14) | (byte217 << 6) | (byte218 >>> 2);
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte218 & 3) << 33) | (byte219 << 25) | (byte220 << 17) | (byte221 << 9) | (byte222 << 1) | (byte223 >>> 7);
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte223 & 127) << 28) | (byte224 << 20) | (byte225 << 12) | (byte226 << 4) | (byte227 >>> 4);
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte227 & 15) << 31) | (byte228 << 23) | (byte229 << 15) | (byte230 << 7) | (byte231 >>> 1);
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte231 & 1) << 34) | (byte232 << 26) | (byte233 << 18) | (byte234 << 10) | (byte235 << 2) | (byte236 >>> 6);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 63) << 29) | (byte237 << 21) | (byte238 << 13) | (byte239 << 5) | (byte240 >>> 3);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 7) << 32) | (byte241 << 24) | (byte242 << 16) | (byte243 << 8) | byte244;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte245 << 27) | (byte246 << 19) | (byte247 << 11) | (byte248 << 3) | (byte249 >>> 5);
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte249 & 31) << 30) | (byte250 << 22) | (byte251 << 14) | (byte252 << 6) | (byte253 >>> 2);
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte253 & 3) << 33) | (byte254 << 25) | (byte255 << 17) | (byte256 << 9) | (byte257 << 1) | (byte258 >>> 7);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 127) << 28) | (byte259 << 20) | (byte260 << 12) | (byte261 << 4) | (byte262 >>> 4);
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte262 & 15) << 31) | (byte263 << 23) | (byte264 << 15) | (byte265 << 7) | (byte266 >>> 1);
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte266 & 1) << 34) | (byte267 << 26) | (byte268 << 18) | (byte269 << 10) | (byte270 << 2) | (byte271 >>> 6);
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte271 & 63) << 29) | (byte272 << 21) | (byte273 << 13) | (byte274 << 5) | (byte275 >>> 3);
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte275 & 7) << 32) | (byte276 << 24) | (byte277 << 16) | (byte278 << 8) | byte279;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation36 extends BulkOperation {
+ }
+ ,
+ PACKED_36 {
- public int blocks() {
+ public int blockCount() {
return 9;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 28;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 268435455L) << 8) | (block1 >>> 56);
- values[vi++] = (block1 >>> 20) & 68719476735L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1048575L) << 16) | (block2 >>> 48);
- values[vi++] = (block2 >>> 12) & 68719476735L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 24) | (block3 >>> 40);
- values[vi++] = (block3 >>> 4) & 68719476735L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 32) | (block4 >>> 32);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 4294967295L) << 4) | (block5 >>> 60);
- values[vi++] = (block5 >>> 24) & 68719476735L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 16777215L) << 12) | (block6 >>> 52);
- values[vi++] = (block6 >>> 16) & 68719476735L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 65535L) << 20) | (block7 >>> 44);
- values[vi++] = (block7 >>> 8) & 68719476735L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 28) | (block8 >>> 36);
- values[vi++] = block8 & 68719476735L;
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 20) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 12) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 4) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 24) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 16) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 8) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 28;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 268435455L) << 8) | (block1 >>> 56);
+ values[valuesOffset++] = (block1 >>> 20) & 68719476735L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1048575L) << 16) | (block2 >>> 48);
+ values[valuesOffset++] = (block2 >>> 12) & 68719476735L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 24) | (block3 >>> 40);
+ values[valuesOffset++] = (block3 >>> 4) & 68719476735L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 32) | (block4 >>> 32);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 4294967295L) << 4) | (block5 >>> 60);
+ values[valuesOffset++] = (block5 >>> 24) & 68719476735L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 16777215L) << 12) | (block6 >>> 52);
+ values[valuesOffset++] = (block6 >>> 16) & 68719476735L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 65535L) << 20) | (block7 >>> 44);
+ values[valuesOffset++] = (block7 >>> 8) & 68719476735L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 28) | (block8 >>> 36);
+ values[valuesOffset++] = block8 & 68719476735L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 28) | (byte1 << 20) | (byte2 << 12) | (byte3 << 4) | (byte4 >>> 4);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 15) << 32) | (byte5 << 24) | (byte6 << 16) | (byte7 << 8) | byte8;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte9 << 28) | (byte10 << 20) | (byte11 << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 32) | (byte14 << 24) | (byte15 << 16) | (byte16 << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 28) | (byte19 << 20) | (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 32) | (byte23 << 24) | (byte24 << 16) | (byte25 << 8) | byte26;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 28) | (byte28 << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 32) | (byte32 << 24) | (byte33 << 16) | (byte34 << 8) | byte35;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte36 << 28) | (byte37 << 20) | (byte38 << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 32) | (byte41 << 24) | (byte42 << 16) | (byte43 << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 28) | (byte46 << 20) | (byte47 << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 32) | (byte50 << 24) | (byte51 << 16) | (byte52 << 8) | byte53;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 28) | (byte55 << 20) | (byte56 << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 32) | (byte59 << 24) | (byte60 << 16) | (byte61 << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 32) | (byte68 << 24) | (byte69 << 16) | (byte70 << 8) | byte71;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation37 extends BulkOperation {
+ }
+ ,
+ PACKED_37 {
- public int blocks() {
+ public int blockCount() {
return 37;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 27;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 134217727L) << 10) | (block1 >>> 54);
- values[vi++] = (block1 >>> 17) & 137438953471L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 131071L) << 20) | (block2 >>> 44);
- values[vi++] = (block2 >>> 7) & 137438953471L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 127L) << 30) | (block3 >>> 34);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 17179869183L) << 3) | (block4 >>> 61);
- values[vi++] = (block4 >>> 24) & 137438953471L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 16777215L) << 13) | (block5 >>> 51);
- values[vi++] = (block5 >>> 14) & 137438953471L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 16383L) << 23) | (block6 >>> 41);
- values[vi++] = (block6 >>> 4) & 137438953471L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 15L) << 33) | (block7 >>> 31);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 2147483647L) << 6) | (block8 >>> 58);
- values[vi++] = (block8 >>> 21) & 137438953471L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 2097151L) << 16) | (block9 >>> 48);
- values[vi++] = (block9 >>> 11) & 137438953471L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 2047L) << 26) | (block10 >>> 38);
- values[vi++] = (block10 >>> 1) & 137438953471L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 1L) << 36) | (block11 >>> 28);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 268435455L) << 9) | (block12 >>> 55);
- values[vi++] = (block12 >>> 18) & 137438953471L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 262143L) << 19) | (block13 >>> 45);
- values[vi++] = (block13 >>> 8) & 137438953471L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 255L) << 29) | (block14 >>> 35);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 34359738367L) << 2) | (block15 >>> 62);
- values[vi++] = (block15 >>> 25) & 137438953471L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 33554431L) << 12) | (block16 >>> 52);
- values[vi++] = (block16 >>> 15) & 137438953471L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 32767L) << 22) | (block17 >>> 42);
- values[vi++] = (block17 >>> 5) & 137438953471L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 31L) << 32) | (block18 >>> 32);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 4294967295L) << 5) | (block19 >>> 59);
- values[vi++] = (block19 >>> 22) & 137438953471L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 4194303L) << 15) | (block20 >>> 49);
- values[vi++] = (block20 >>> 12) & 137438953471L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 4095L) << 25) | (block21 >>> 39);
- values[vi++] = (block21 >>> 2) & 137438953471L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 3L) << 35) | (block22 >>> 29);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 536870911L) << 8) | (block23 >>> 56);
- values[vi++] = (block23 >>> 19) & 137438953471L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 524287L) << 18) | (block24 >>> 46);
- values[vi++] = (block24 >>> 9) & 137438953471L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 511L) << 28) | (block25 >>> 36);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 68719476735L) << 1) | (block26 >>> 63);
- values[vi++] = (block26 >>> 26) & 137438953471L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 67108863L) << 11) | (block27 >>> 53);
- values[vi++] = (block27 >>> 16) & 137438953471L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 65535L) << 21) | (block28 >>> 43);
- values[vi++] = (block28 >>> 6) & 137438953471L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 63L) << 31) | (block29 >>> 33);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 8589934591L) << 4) | (block30 >>> 60);
- values[vi++] = (block30 >>> 23) & 137438953471L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 8388607L) << 14) | (block31 >>> 50);
- values[vi++] = (block31 >>> 13) & 137438953471L;
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 8191L) << 24) | (block32 >>> 40);
- values[vi++] = (block32 >>> 3) & 137438953471L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 7L) << 34) | (block33 >>> 30);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 1073741823L) << 7) | (block34 >>> 57);
- values[vi++] = (block34 >>> 20) & 137438953471L;
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 1048575L) << 17) | (block35 >>> 47);
- values[vi++] = (block35 >>> 10) & 137438953471L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 1023L) << 27) | (block36 >>> 37);
- values[vi++] = block36 & 137438953471L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 17) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 7) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 24) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 14) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 4) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 21) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 11) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi++] << 1) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 18) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 8) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 25) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 15) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 5) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 22) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 12) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi++] << 2) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 19) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 9) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 26) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 16) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 6) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 23) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 13) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 3) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 20) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 10) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 27;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 134217727L) << 10) | (block1 >>> 54);
+ values[valuesOffset++] = (block1 >>> 17) & 137438953471L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 131071L) << 20) | (block2 >>> 44);
+ values[valuesOffset++] = (block2 >>> 7) & 137438953471L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 127L) << 30) | (block3 >>> 34);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 17179869183L) << 3) | (block4 >>> 61);
+ values[valuesOffset++] = (block4 >>> 24) & 137438953471L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 16777215L) << 13) | (block5 >>> 51);
+ values[valuesOffset++] = (block5 >>> 14) & 137438953471L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 16383L) << 23) | (block6 >>> 41);
+ values[valuesOffset++] = (block6 >>> 4) & 137438953471L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 15L) << 33) | (block7 >>> 31);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 2147483647L) << 6) | (block8 >>> 58);
+ values[valuesOffset++] = (block8 >>> 21) & 137438953471L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 2097151L) << 16) | (block9 >>> 48);
+ values[valuesOffset++] = (block9 >>> 11) & 137438953471L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 2047L) << 26) | (block10 >>> 38);
+ values[valuesOffset++] = (block10 >>> 1) & 137438953471L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 1L) << 36) | (block11 >>> 28);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 268435455L) << 9) | (block12 >>> 55);
+ values[valuesOffset++] = (block12 >>> 18) & 137438953471L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 262143L) << 19) | (block13 >>> 45);
+ values[valuesOffset++] = (block13 >>> 8) & 137438953471L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 255L) << 29) | (block14 >>> 35);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 34359738367L) << 2) | (block15 >>> 62);
+ values[valuesOffset++] = (block15 >>> 25) & 137438953471L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 33554431L) << 12) | (block16 >>> 52);
+ values[valuesOffset++] = (block16 >>> 15) & 137438953471L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 32767L) << 22) | (block17 >>> 42);
+ values[valuesOffset++] = (block17 >>> 5) & 137438953471L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 31L) << 32) | (block18 >>> 32);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 4294967295L) << 5) | (block19 >>> 59);
+ values[valuesOffset++] = (block19 >>> 22) & 137438953471L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 4194303L) << 15) | (block20 >>> 49);
+ values[valuesOffset++] = (block20 >>> 12) & 137438953471L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 4095L) << 25) | (block21 >>> 39);
+ values[valuesOffset++] = (block21 >>> 2) & 137438953471L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 3L) << 35) | (block22 >>> 29);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 536870911L) << 8) | (block23 >>> 56);
+ values[valuesOffset++] = (block23 >>> 19) & 137438953471L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 524287L) << 18) | (block24 >>> 46);
+ values[valuesOffset++] = (block24 >>> 9) & 137438953471L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 511L) << 28) | (block25 >>> 36);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 68719476735L) << 1) | (block26 >>> 63);
+ values[valuesOffset++] = (block26 >>> 26) & 137438953471L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 67108863L) << 11) | (block27 >>> 53);
+ values[valuesOffset++] = (block27 >>> 16) & 137438953471L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 65535L) << 21) | (block28 >>> 43);
+ values[valuesOffset++] = (block28 >>> 6) & 137438953471L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 63L) << 31) | (block29 >>> 33);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 8589934591L) << 4) | (block30 >>> 60);
+ values[valuesOffset++] = (block30 >>> 23) & 137438953471L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 8388607L) << 14) | (block31 >>> 50);
+ values[valuesOffset++] = (block31 >>> 13) & 137438953471L;
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 8191L) << 24) | (block32 >>> 40);
+ values[valuesOffset++] = (block32 >>> 3) & 137438953471L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 7L) << 34) | (block33 >>> 30);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 1073741823L) << 7) | (block34 >>> 57);
+ values[valuesOffset++] = (block34 >>> 20) & 137438953471L;
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 1048575L) << 17) | (block35 >>> 47);
+ values[valuesOffset++] = (block35 >>> 10) & 137438953471L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 1023L) << 27) | (block36 >>> 37);
+ values[valuesOffset++] = block36 & 137438953471L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 29) | (byte1 << 21) | (byte2 << 13) | (byte3 << 5) | (byte4 >>> 3);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 7) << 34) | (byte5 << 26) | (byte6 << 18) | (byte7 << 10) | (byte8 << 2) | (byte9 >>> 6);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 63) << 31) | (byte10 << 23) | (byte11 << 15) | (byte12 << 7) | (byte13 >>> 1);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 1) << 36) | (byte14 << 28) | (byte15 << 20) | (byte16 << 12) | (byte17 << 4) | (byte18 >>> 4);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 15) << 33) | (byte19 << 25) | (byte20 << 17) | (byte21 << 9) | (byte22 << 1) | (byte23 >>> 7);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 127) << 30) | (byte24 << 22) | (byte25 << 14) | (byte26 << 6) | (byte27 >>> 2);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 3) << 35) | (byte28 << 27) | (byte29 << 19) | (byte30 << 11) | (byte31 << 3) | (byte32 >>> 5);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 31) << 32) | (byte33 << 24) | (byte34 << 16) | (byte35 << 8) | byte36;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte37 << 29) | (byte38 << 21) | (byte39 << 13) | (byte40 << 5) | (byte41 >>> 3);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 7) << 34) | (byte42 << 26) | (byte43 << 18) | (byte44 << 10) | (byte45 << 2) | (byte46 >>> 6);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 63) << 31) | (byte47 << 23) | (byte48 << 15) | (byte49 << 7) | (byte50 >>> 1);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 1) << 36) | (byte51 << 28) | (byte52 << 20) | (byte53 << 12) | (byte54 << 4) | (byte55 >>> 4);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 15) << 33) | (byte56 << 25) | (byte57 << 17) | (byte58 << 9) | (byte59 << 1) | (byte60 >>> 7);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 127) << 30) | (byte61 << 22) | (byte62 << 14) | (byte63 << 6) | (byte64 >>> 2);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 3) << 35) | (byte65 << 27) | (byte66 << 19) | (byte67 << 11) | (byte68 << 3) | (byte69 >>> 5);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 31) << 32) | (byte70 << 24) | (byte71 << 16) | (byte72 << 8) | byte73;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte74 << 29) | (byte75 << 21) | (byte76 << 13) | (byte77 << 5) | (byte78 >>> 3);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 7) << 34) | (byte79 << 26) | (byte80 << 18) | (byte81 << 10) | (byte82 << 2) | (byte83 >>> 6);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 63) << 31) | (byte84 << 23) | (byte85 << 15) | (byte86 << 7) | (byte87 >>> 1);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 1) << 36) | (byte88 << 28) | (byte89 << 20) | (byte90 << 12) | (byte91 << 4) | (byte92 >>> 4);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 15) << 33) | (byte93 << 25) | (byte94 << 17) | (byte95 << 9) | (byte96 << 1) | (byte97 >>> 7);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 127) << 30) | (byte98 << 22) | (byte99 << 14) | (byte100 << 6) | (byte101 >>> 2);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 3) << 35) | (byte102 << 27) | (byte103 << 19) | (byte104 << 11) | (byte105 << 3) | (byte106 >>> 5);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 31) << 32) | (byte107 << 24) | (byte108 << 16) | (byte109 << 8) | byte110;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte111 << 29) | (byte112 << 21) | (byte113 << 13) | (byte114 << 5) | (byte115 >>> 3);
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 7) << 34) | (byte116 << 26) | (byte117 << 18) | (byte118 << 10) | (byte119 << 2) | (byte120 >>> 6);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 63) << 31) | (byte121 << 23) | (byte122 << 15) | (byte123 << 7) | (byte124 >>> 1);
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte124 & 1) << 36) | (byte125 << 28) | (byte126 << 20) | (byte127 << 12) | (byte128 << 4) | (byte129 >>> 4);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 15) << 33) | (byte130 << 25) | (byte131 << 17) | (byte132 << 9) | (byte133 << 1) | (byte134 >>> 7);
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 127) << 30) | (byte135 << 22) | (byte136 << 14) | (byte137 << 6) | (byte138 >>> 2);
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte138 & 3) << 35) | (byte139 << 27) | (byte140 << 19) | (byte141 << 11) | (byte142 << 3) | (byte143 >>> 5);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 31) << 32) | (byte144 << 24) | (byte145 << 16) | (byte146 << 8) | byte147;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte148 << 29) | (byte149 << 21) | (byte150 << 13) | (byte151 << 5) | (byte152 >>> 3);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 7) << 34) | (byte153 << 26) | (byte154 << 18) | (byte155 << 10) | (byte156 << 2) | (byte157 >>> 6);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 63) << 31) | (byte158 << 23) | (byte159 << 15) | (byte160 << 7) | (byte161 >>> 1);
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte161 & 1) << 36) | (byte162 << 28) | (byte163 << 20) | (byte164 << 12) | (byte165 << 4) | (byte166 >>> 4);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 15) << 33) | (byte167 << 25) | (byte168 << 17) | (byte169 << 9) | (byte170 << 1) | (byte171 >>> 7);
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte171 & 127) << 30) | (byte172 << 22) | (byte173 << 14) | (byte174 << 6) | (byte175 >>> 2);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 3) << 35) | (byte176 << 27) | (byte177 << 19) | (byte178 << 11) | (byte179 << 3) | (byte180 >>> 5);
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte180 & 31) << 32) | (byte181 << 24) | (byte182 << 16) | (byte183 << 8) | byte184;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte185 << 29) | (byte186 << 21) | (byte187 << 13) | (byte188 << 5) | (byte189 >>> 3);
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 7) << 34) | (byte190 << 26) | (byte191 << 18) | (byte192 << 10) | (byte193 << 2) | (byte194 >>> 6);
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte194 & 63) << 31) | (byte195 << 23) | (byte196 << 15) | (byte197 << 7) | (byte198 >>> 1);
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte198 & 1) << 36) | (byte199 << 28) | (byte200 << 20) | (byte201 << 12) | (byte202 << 4) | (byte203 >>> 4);
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte203 & 15) << 33) | (byte204 << 25) | (byte205 << 17) | (byte206 << 9) | (byte207 << 1) | (byte208 >>> 7);
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte208 & 127) << 30) | (byte209 << 22) | (byte210 << 14) | (byte211 << 6) | (byte212 >>> 2);
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte212 & 3) << 35) | (byte213 << 27) | (byte214 << 19) | (byte215 << 11) | (byte216 << 3) | (byte217 >>> 5);
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte217 & 31) << 32) | (byte218 << 24) | (byte219 << 16) | (byte220 << 8) | byte221;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte222 << 29) | (byte223 << 21) | (byte224 << 13) | (byte225 << 5) | (byte226 >>> 3);
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte226 & 7) << 34) | (byte227 << 26) | (byte228 << 18) | (byte229 << 10) | (byte230 << 2) | (byte231 >>> 6);
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte231 & 63) << 31) | (byte232 << 23) | (byte233 << 15) | (byte234 << 7) | (byte235 >>> 1);
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte235 & 1) << 36) | (byte236 << 28) | (byte237 << 20) | (byte238 << 12) | (byte239 << 4) | (byte240 >>> 4);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 15) << 33) | (byte241 << 25) | (byte242 << 17) | (byte243 << 9) | (byte244 << 1) | (byte245 >>> 7);
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte245 & 127) << 30) | (byte246 << 22) | (byte247 << 14) | (byte248 << 6) | (byte249 >>> 2);
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte249 & 3) << 35) | (byte250 << 27) | (byte251 << 19) | (byte252 << 11) | (byte253 << 3) | (byte254 >>> 5);
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte254 & 31) << 32) | (byte255 << 24) | (byte256 << 16) | (byte257 << 8) | byte258;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte259 << 29) | (byte260 << 21) | (byte261 << 13) | (byte262 << 5) | (byte263 >>> 3);
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte263 & 7) << 34) | (byte264 << 26) | (byte265 << 18) | (byte266 << 10) | (byte267 << 2) | (byte268 >>> 6);
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte268 & 63) << 31) | (byte269 << 23) | (byte270 << 15) | (byte271 << 7) | (byte272 >>> 1);
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte272 & 1) << 36) | (byte273 << 28) | (byte274 << 20) | (byte275 << 12) | (byte276 << 4) | (byte277 >>> 4);
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte277 & 15) << 33) | (byte278 << 25) | (byte279 << 17) | (byte280 << 9) | (byte281 << 1) | (byte282 >>> 7);
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte282 & 127) << 30) | (byte283 << 22) | (byte284 << 14) | (byte285 << 6) | (byte286 >>> 2);
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte286 & 3) << 35) | (byte287 << 27) | (byte288 << 19) | (byte289 << 11) | (byte290 << 3) | (byte291 >>> 5);
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte291 & 31) << 32) | (byte292 << 24) | (byte293 << 16) | (byte294 << 8) | byte295;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation38 extends BulkOperation {
+ }
+ ,
+ PACKED_38 {
- public int blocks() {
+ public int blockCount() {
return 19;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 26;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 67108863L) << 12) | (block1 >>> 52);
- values[vi++] = (block1 >>> 14) & 274877906943L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 16383L) << 24) | (block2 >>> 40);
- values[vi++] = (block2 >>> 2) & 274877906943L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 3L) << 36) | (block3 >>> 28);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 268435455L) << 10) | (block4 >>> 54);
- values[vi++] = (block4 >>> 16) & 274877906943L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 65535L) << 22) | (block5 >>> 42);
- values[vi++] = (block5 >>> 4) & 274877906943L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 15L) << 34) | (block6 >>> 30);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 1073741823L) << 8) | (block7 >>> 56);
- values[vi++] = (block7 >>> 18) & 274877906943L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 262143L) << 20) | (block8 >>> 44);
- values[vi++] = (block8 >>> 6) & 274877906943L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 63L) << 32) | (block9 >>> 32);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 4294967295L) << 6) | (block10 >>> 58);
- values[vi++] = (block10 >>> 20) & 274877906943L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 1048575L) << 18) | (block11 >>> 46);
- values[vi++] = (block11 >>> 8) & 274877906943L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 255L) << 30) | (block12 >>> 34);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 17179869183L) << 4) | (block13 >>> 60);
- values[vi++] = (block13 >>> 22) & 274877906943L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4194303L) << 16) | (block14 >>> 48);
- values[vi++] = (block14 >>> 10) & 274877906943L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1023L) << 28) | (block15 >>> 36);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 68719476735L) << 2) | (block16 >>> 62);
- values[vi++] = (block16 >>> 24) & 274877906943L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 16777215L) << 14) | (block17 >>> 50);
- values[vi++] = (block17 >>> 12) & 274877906943L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 4095L) << 26) | (block18 >>> 38);
- values[vi++] = block18 & 274877906943L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 14) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 2) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 16) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 4) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 18) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 6) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 20) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 8) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 22) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 10) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 24) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 12) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 26;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 67108863L) << 12) | (block1 >>> 52);
+ values[valuesOffset++] = (block1 >>> 14) & 274877906943L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 16383L) << 24) | (block2 >>> 40);
+ values[valuesOffset++] = (block2 >>> 2) & 274877906943L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 3L) << 36) | (block3 >>> 28);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 268435455L) << 10) | (block4 >>> 54);
+ values[valuesOffset++] = (block4 >>> 16) & 274877906943L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 65535L) << 22) | (block5 >>> 42);
+ values[valuesOffset++] = (block5 >>> 4) & 274877906943L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 15L) << 34) | (block6 >>> 30);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 1073741823L) << 8) | (block7 >>> 56);
+ values[valuesOffset++] = (block7 >>> 18) & 274877906943L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 262143L) << 20) | (block8 >>> 44);
+ values[valuesOffset++] = (block8 >>> 6) & 274877906943L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 63L) << 32) | (block9 >>> 32);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 4294967295L) << 6) | (block10 >>> 58);
+ values[valuesOffset++] = (block10 >>> 20) & 274877906943L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 1048575L) << 18) | (block11 >>> 46);
+ values[valuesOffset++] = (block11 >>> 8) & 274877906943L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 255L) << 30) | (block12 >>> 34);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 17179869183L) << 4) | (block13 >>> 60);
+ values[valuesOffset++] = (block13 >>> 22) & 274877906943L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4194303L) << 16) | (block14 >>> 48);
+ values[valuesOffset++] = (block14 >>> 10) & 274877906943L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1023L) << 28) | (block15 >>> 36);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 68719476735L) << 2) | (block16 >>> 62);
+ values[valuesOffset++] = (block16 >>> 24) & 274877906943L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 16777215L) << 14) | (block17 >>> 50);
+ values[valuesOffset++] = (block17 >>> 12) & 274877906943L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 4095L) << 26) | (block18 >>> 38);
+ values[valuesOffset++] = block18 & 274877906943L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 30) | (byte1 << 22) | (byte2 << 14) | (byte3 << 6) | (byte4 >>> 2);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 3) << 36) | (byte5 << 28) | (byte6 << 20) | (byte7 << 12) | (byte8 << 4) | (byte9 >>> 4);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 15) << 34) | (byte10 << 26) | (byte11 << 18) | (byte12 << 10) | (byte13 << 2) | (byte14 >>> 6);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 63) << 32) | (byte15 << 24) | (byte16 << 16) | (byte17 << 8) | byte18;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte19 << 30) | (byte20 << 22) | (byte21 << 14) | (byte22 << 6) | (byte23 >>> 2);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 3) << 36) | (byte24 << 28) | (byte25 << 20) | (byte26 << 12) | (byte27 << 4) | (byte28 >>> 4);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 15) << 34) | (byte29 << 26) | (byte30 << 18) | (byte31 << 10) | (byte32 << 2) | (byte33 >>> 6);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 63) << 32) | (byte34 << 24) | (byte35 << 16) | (byte36 << 8) | byte37;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte38 << 30) | (byte39 << 22) | (byte40 << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 36) | (byte43 << 28) | (byte44 << 20) | (byte45 << 12) | (byte46 << 4) | (byte47 >>> 4);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 15) << 34) | (byte48 << 26) | (byte49 << 18) | (byte50 << 10) | (byte51 << 2) | (byte52 >>> 6);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 63) << 32) | (byte53 << 24) | (byte54 << 16) | (byte55 << 8) | byte56;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte57 << 30) | (byte58 << 22) | (byte59 << 14) | (byte60 << 6) | (byte61 >>> 2);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 3) << 36) | (byte62 << 28) | (byte63 << 20) | (byte64 << 12) | (byte65 << 4) | (byte66 >>> 4);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 15) << 34) | (byte67 << 26) | (byte68 << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 32) | (byte72 << 24) | (byte73 << 16) | (byte74 << 8) | byte75;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte76 << 30) | (byte77 << 22) | (byte78 << 14) | (byte79 << 6) | (byte80 >>> 2);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 3) << 36) | (byte81 << 28) | (byte82 << 20) | (byte83 << 12) | (byte84 << 4) | (byte85 >>> 4);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 15) << 34) | (byte86 << 26) | (byte87 << 18) | (byte88 << 10) | (byte89 << 2) | (byte90 >>> 6);
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte90 & 63) << 32) | (byte91 << 24) | (byte92 << 16) | (byte93 << 8) | byte94;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte95 << 30) | (byte96 << 22) | (byte97 << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 36) | (byte100 << 28) | (byte101 << 20) | (byte102 << 12) | (byte103 << 4) | (byte104 >>> 4);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 15) << 34) | (byte105 << 26) | (byte106 << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 32) | (byte110 << 24) | (byte111 << 16) | (byte112 << 8) | byte113;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte114 << 30) | (byte115 << 22) | (byte116 << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 36) | (byte119 << 28) | (byte120 << 20) | (byte121 << 12) | (byte122 << 4) | (byte123 >>> 4);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 15) << 34) | (byte124 << 26) | (byte125 << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 32) | (byte129 << 24) | (byte130 << 16) | (byte131 << 8) | byte132;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte133 << 30) | (byte134 << 22) | (byte135 << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 36) | (byte138 << 28) | (byte139 << 20) | (byte140 << 12) | (byte141 << 4) | (byte142 >>> 4);
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte142 & 15) << 34) | (byte143 << 26) | (byte144 << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 32) | (byte148 << 24) | (byte149 << 16) | (byte150 << 8) | byte151;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation39 extends BulkOperation {
+ }
+ ,
+ PACKED_39 {
- public int blocks() {
+ public int blockCount() {
return 39;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 25;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 33554431L) << 14) | (block1 >>> 50);
- values[vi++] = (block1 >>> 11) & 549755813887L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 2047L) << 28) | (block2 >>> 36);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 68719476735L) << 3) | (block3 >>> 61);
- values[vi++] = (block3 >>> 22) & 549755813887L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 4194303L) << 17) | (block4 >>> 47);
- values[vi++] = (block4 >>> 8) & 549755813887L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 255L) << 31) | (block5 >>> 33);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 8589934591L) << 6) | (block6 >>> 58);
- values[vi++] = (block6 >>> 19) & 549755813887L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 524287L) << 20) | (block7 >>> 44);
- values[vi++] = (block7 >>> 5) & 549755813887L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 31L) << 34) | (block8 >>> 30);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 1073741823L) << 9) | (block9 >>> 55);
- values[vi++] = (block9 >>> 16) & 549755813887L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 65535L) << 23) | (block10 >>> 41);
- values[vi++] = (block10 >>> 2) & 549755813887L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 3L) << 37) | (block11 >>> 27);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 134217727L) << 12) | (block12 >>> 52);
- values[vi++] = (block12 >>> 13) & 549755813887L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 8191L) << 26) | (block13 >>> 38);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 274877906943L) << 1) | (block14 >>> 63);
- values[vi++] = (block14 >>> 24) & 549755813887L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 16777215L) << 15) | (block15 >>> 49);
- values[vi++] = (block15 >>> 10) & 549755813887L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 1023L) << 29) | (block16 >>> 35);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 34359738367L) << 4) | (block17 >>> 60);
- values[vi++] = (block17 >>> 21) & 549755813887L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 2097151L) << 18) | (block18 >>> 46);
- values[vi++] = (block18 >>> 7) & 549755813887L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 127L) << 32) | (block19 >>> 32);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 4294967295L) << 7) | (block20 >>> 57);
- values[vi++] = (block20 >>> 18) & 549755813887L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 262143L) << 21) | (block21 >>> 43);
- values[vi++] = (block21 >>> 4) & 549755813887L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 15L) << 35) | (block22 >>> 29);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 536870911L) << 10) | (block23 >>> 54);
- values[vi++] = (block23 >>> 15) & 549755813887L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 32767L) << 24) | (block24 >>> 40);
- values[vi++] = (block24 >>> 1) & 549755813887L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 1L) << 38) | (block25 >>> 26);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 67108863L) << 13) | (block26 >>> 51);
- values[vi++] = (block26 >>> 12) & 549755813887L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 4095L) << 27) | (block27 >>> 37);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 137438953471L) << 2) | (block28 >>> 62);
- values[vi++] = (block28 >>> 23) & 549755813887L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 8388607L) << 16) | (block29 >>> 48);
- values[vi++] = (block29 >>> 9) & 549755813887L;
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 511L) << 30) | (block30 >>> 34);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 17179869183L) << 5) | (block31 >>> 59);
- values[vi++] = (block31 >>> 20) & 549755813887L;
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 1048575L) << 19) | (block32 >>> 45);
- values[vi++] = (block32 >>> 6) & 549755813887L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 63L) << 33) | (block33 >>> 31);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 2147483647L) << 8) | (block34 >>> 56);
- values[vi++] = (block34 >>> 17) & 549755813887L;
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 131071L) << 22) | (block35 >>> 42);
- values[vi++] = (block35 >>> 3) & 549755813887L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 7L) << 36) | (block36 >>> 28);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 268435455L) << 11) | (block37 >>> 53);
- values[vi++] = (block37 >>> 14) & 549755813887L;
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 16383L) << 25) | (block38 >>> 39);
- values[vi++] = block38 & 549755813887L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 11) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 22) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 8) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 19) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 5) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 16) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi++] << 2) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 13) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 24) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 10) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 21) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 7) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 18) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 4) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 15) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi++] << 1) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 12) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 23) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 9) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 20) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 6) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 17) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 3) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 14) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 25;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 33554431L) << 14) | (block1 >>> 50);
+ values[valuesOffset++] = (block1 >>> 11) & 549755813887L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 2047L) << 28) | (block2 >>> 36);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 68719476735L) << 3) | (block3 >>> 61);
+ values[valuesOffset++] = (block3 >>> 22) & 549755813887L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 4194303L) << 17) | (block4 >>> 47);
+ values[valuesOffset++] = (block4 >>> 8) & 549755813887L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 255L) << 31) | (block5 >>> 33);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 8589934591L) << 6) | (block6 >>> 58);
+ values[valuesOffset++] = (block6 >>> 19) & 549755813887L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 524287L) << 20) | (block7 >>> 44);
+ values[valuesOffset++] = (block7 >>> 5) & 549755813887L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 31L) << 34) | (block8 >>> 30);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 1073741823L) << 9) | (block9 >>> 55);
+ values[valuesOffset++] = (block9 >>> 16) & 549755813887L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 65535L) << 23) | (block10 >>> 41);
+ values[valuesOffset++] = (block10 >>> 2) & 549755813887L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 3L) << 37) | (block11 >>> 27);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 134217727L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = (block12 >>> 13) & 549755813887L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 8191L) << 26) | (block13 >>> 38);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 274877906943L) << 1) | (block14 >>> 63);
+ values[valuesOffset++] = (block14 >>> 24) & 549755813887L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 16777215L) << 15) | (block15 >>> 49);
+ values[valuesOffset++] = (block15 >>> 10) & 549755813887L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 1023L) << 29) | (block16 >>> 35);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 34359738367L) << 4) | (block17 >>> 60);
+ values[valuesOffset++] = (block17 >>> 21) & 549755813887L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 2097151L) << 18) | (block18 >>> 46);
+ values[valuesOffset++] = (block18 >>> 7) & 549755813887L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 127L) << 32) | (block19 >>> 32);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 4294967295L) << 7) | (block20 >>> 57);
+ values[valuesOffset++] = (block20 >>> 18) & 549755813887L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 262143L) << 21) | (block21 >>> 43);
+ values[valuesOffset++] = (block21 >>> 4) & 549755813887L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 15L) << 35) | (block22 >>> 29);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 536870911L) << 10) | (block23 >>> 54);
+ values[valuesOffset++] = (block23 >>> 15) & 549755813887L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 32767L) << 24) | (block24 >>> 40);
+ values[valuesOffset++] = (block24 >>> 1) & 549755813887L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 1L) << 38) | (block25 >>> 26);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 67108863L) << 13) | (block26 >>> 51);
+ values[valuesOffset++] = (block26 >>> 12) & 549755813887L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 4095L) << 27) | (block27 >>> 37);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 137438953471L) << 2) | (block28 >>> 62);
+ values[valuesOffset++] = (block28 >>> 23) & 549755813887L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 8388607L) << 16) | (block29 >>> 48);
+ values[valuesOffset++] = (block29 >>> 9) & 549755813887L;
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 511L) << 30) | (block30 >>> 34);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 17179869183L) << 5) | (block31 >>> 59);
+ values[valuesOffset++] = (block31 >>> 20) & 549755813887L;
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 1048575L) << 19) | (block32 >>> 45);
+ values[valuesOffset++] = (block32 >>> 6) & 549755813887L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 63L) << 33) | (block33 >>> 31);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 2147483647L) << 8) | (block34 >>> 56);
+ values[valuesOffset++] = (block34 >>> 17) & 549755813887L;
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 131071L) << 22) | (block35 >>> 42);
+ values[valuesOffset++] = (block35 >>> 3) & 549755813887L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 7L) << 36) | (block36 >>> 28);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 268435455L) << 11) | (block37 >>> 53);
+ values[valuesOffset++] = (block37 >>> 14) & 549755813887L;
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 16383L) << 25) | (block38 >>> 39);
+ values[valuesOffset++] = block38 & 549755813887L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 31) | (byte1 << 23) | (byte2 << 15) | (byte3 << 7) | (byte4 >>> 1);
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte4 & 1) << 38) | (byte5 << 30) | (byte6 << 22) | (byte7 << 14) | (byte8 << 6) | (byte9 >>> 2);
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte9 & 3) << 37) | (byte10 << 29) | (byte11 << 21) | (byte12 << 13) | (byte13 << 5) | (byte14 >>> 3);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 7) << 36) | (byte15 << 28) | (byte16 << 20) | (byte17 << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 35) | (byte20 << 27) | (byte21 << 19) | (byte22 << 11) | (byte23 << 3) | (byte24 >>> 5);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 31) << 34) | (byte25 << 26) | (byte26 << 18) | (byte27 << 10) | (byte28 << 2) | (byte29 >>> 6);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 63) << 33) | (byte30 << 25) | (byte31 << 17) | (byte32 << 9) | (byte33 << 1) | (byte34 >>> 7);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 127) << 32) | (byte35 << 24) | (byte36 << 16) | (byte37 << 8) | byte38;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 31) | (byte40 << 23) | (byte41 << 15) | (byte42 << 7) | (byte43 >>> 1);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 1) << 38) | (byte44 << 30) | (byte45 << 22) | (byte46 << 14) | (byte47 << 6) | (byte48 >>> 2);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 3) << 37) | (byte49 << 29) | (byte50 << 21) | (byte51 << 13) | (byte52 << 5) | (byte53 >>> 3);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 7) << 36) | (byte54 << 28) | (byte55 << 20) | (byte56 << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 35) | (byte59 << 27) | (byte60 << 19) | (byte61 << 11) | (byte62 << 3) | (byte63 >>> 5);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 31) << 34) | (byte64 << 26) | (byte65 << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 33) | (byte69 << 25) | (byte70 << 17) | (byte71 << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 32) | (byte74 << 24) | (byte75 << 16) | (byte76 << 8) | byte77;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 31) | (byte79 << 23) | (byte80 << 15) | (byte81 << 7) | (byte82 >>> 1);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 38) | (byte83 << 30) | (byte84 << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 37) | (byte88 << 29) | (byte89 << 21) | (byte90 << 13) | (byte91 << 5) | (byte92 >>> 3);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 36) | (byte93 << 28) | (byte94 << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 35) | (byte98 << 27) | (byte99 << 19) | (byte100 << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 34) | (byte103 << 26) | (byte104 << 18) | (byte105 << 10) | (byte106 << 2) | (byte107 >>> 6);
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 63) << 33) | (byte108 << 25) | (byte109 << 17) | (byte110 << 9) | (byte111 << 1) | (byte112 >>> 7);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 127) << 32) | (byte113 << 24) | (byte114 << 16) | (byte115 << 8) | byte116;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte117 << 31) | (byte118 << 23) | (byte119 << 15) | (byte120 << 7) | (byte121 >>> 1);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 1) << 38) | (byte122 << 30) | (byte123 << 22) | (byte124 << 14) | (byte125 << 6) | (byte126 >>> 2);
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 3) << 37) | (byte127 << 29) | (byte128 << 21) | (byte129 << 13) | (byte130 << 5) | (byte131 >>> 3);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 7) << 36) | (byte132 << 28) | (byte133 << 20) | (byte134 << 12) | (byte135 << 4) | (byte136 >>> 4);
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte136 & 15) << 35) | (byte137 << 27) | (byte138 << 19) | (byte139 << 11) | (byte140 << 3) | (byte141 >>> 5);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 31) << 34) | (byte142 << 26) | (byte143 << 18) | (byte144 << 10) | (byte145 << 2) | (byte146 >>> 6);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 63) << 33) | (byte147 << 25) | (byte148 << 17) | (byte149 << 9) | (byte150 << 1) | (byte151 >>> 7);
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 127) << 32) | (byte152 << 24) | (byte153 << 16) | (byte154 << 8) | byte155;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte156 << 31) | (byte157 << 23) | (byte158 << 15) | (byte159 << 7) | (byte160 >>> 1);
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte160 & 1) << 38) | (byte161 << 30) | (byte162 << 22) | (byte163 << 14) | (byte164 << 6) | (byte165 >>> 2);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 3) << 37) | (byte166 << 29) | (byte167 << 21) | (byte168 << 13) | (byte169 << 5) | (byte170 >>> 3);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 7) << 36) | (byte171 << 28) | (byte172 << 20) | (byte173 << 12) | (byte174 << 4) | (byte175 >>> 4);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 15) << 35) | (byte176 << 27) | (byte177 << 19) | (byte178 << 11) | (byte179 << 3) | (byte180 >>> 5);
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte180 & 31) << 34) | (byte181 << 26) | (byte182 << 18) | (byte183 << 10) | (byte184 << 2) | (byte185 >>> 6);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 63) << 33) | (byte186 << 25) | (byte187 << 17) | (byte188 << 9) | (byte189 << 1) | (byte190 >>> 7);
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte190 & 127) << 32) | (byte191 << 24) | (byte192 << 16) | (byte193 << 8) | byte194;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte195 << 31) | (byte196 << 23) | (byte197 << 15) | (byte198 << 7) | (byte199 >>> 1);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 1) << 38) | (byte200 << 30) | (byte201 << 22) | (byte202 << 14) | (byte203 << 6) | (byte204 >>> 2);
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte204 & 3) << 37) | (byte205 << 29) | (byte206 << 21) | (byte207 << 13) | (byte208 << 5) | (byte209 >>> 3);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 7) << 36) | (byte210 << 28) | (byte211 << 20) | (byte212 << 12) | (byte213 << 4) | (byte214 >>> 4);
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte214 & 15) << 35) | (byte215 << 27) | (byte216 << 19) | (byte217 << 11) | (byte218 << 3) | (byte219 >>> 5);
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte219 & 31) << 34) | (byte220 << 26) | (byte221 << 18) | (byte222 << 10) | (byte223 << 2) | (byte224 >>> 6);
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 63) << 33) | (byte225 << 25) | (byte226 << 17) | (byte227 << 9) | (byte228 << 1) | (byte229 >>> 7);
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte229 & 127) << 32) | (byte230 << 24) | (byte231 << 16) | (byte232 << 8) | byte233;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte234 << 31) | (byte235 << 23) | (byte236 << 15) | (byte237 << 7) | (byte238 >>> 1);
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte238 & 1) << 38) | (byte239 << 30) | (byte240 << 22) | (byte241 << 14) | (byte242 << 6) | (byte243 >>> 2);
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte243 & 3) << 37) | (byte244 << 29) | (byte245 << 21) | (byte246 << 13) | (byte247 << 5) | (byte248 >>> 3);
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte248 & 7) << 36) | (byte249 << 28) | (byte250 << 20) | (byte251 << 12) | (byte252 << 4) | (byte253 >>> 4);
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte253 & 15) << 35) | (byte254 << 27) | (byte255 << 19) | (byte256 << 11) | (byte257 << 3) | (byte258 >>> 5);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 31) << 34) | (byte259 << 26) | (byte260 << 18) | (byte261 << 10) | (byte262 << 2) | (byte263 >>> 6);
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte263 & 63) << 33) | (byte264 << 25) | (byte265 << 17) | (byte266 << 9) | (byte267 << 1) | (byte268 >>> 7);
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte268 & 127) << 32) | (byte269 << 24) | (byte270 << 16) | (byte271 << 8) | byte272;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte273 << 31) | (byte274 << 23) | (byte275 << 15) | (byte276 << 7) | (byte277 >>> 1);
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte277 & 1) << 38) | (byte278 << 30) | (byte279 << 22) | (byte280 << 14) | (byte281 << 6) | (byte282 >>> 2);
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte282 & 3) << 37) | (byte283 << 29) | (byte284 << 21) | (byte285 << 13) | (byte286 << 5) | (byte287 >>> 3);
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte287 & 7) << 36) | (byte288 << 28) | (byte289 << 20) | (byte290 << 12) | (byte291 << 4) | (byte292 >>> 4);
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte292 & 15) << 35) | (byte293 << 27) | (byte294 << 19) | (byte295 << 11) | (byte296 << 3) | (byte297 >>> 5);
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte297 & 31) << 34) | (byte298 << 26) | (byte299 << 18) | (byte300 << 10) | (byte301 << 2) | (byte302 >>> 6);
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte302 & 63) << 33) | (byte303 << 25) | (byte304 << 17) | (byte305 << 9) | (byte306 << 1) | (byte307 >>> 7);
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte307 & 127) << 32) | (byte308 << 24) | (byte309 << 16) | (byte310 << 8) | byte311;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation40 extends BulkOperation {
+ }
+ ,
+ PACKED_40 {
- public int blocks() {
+ public int blockCount() {
return 5;
}
- public int values() {
+ public int valueCount() {
return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 24;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 16777215L) << 16) | (block1 >>> 48);
- values[vi++] = (block1 >>> 8) & 1099511627775L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 32) | (block2 >>> 32);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4294967295L) << 8) | (block3 >>> 56);
- values[vi++] = (block3 >>> 16) & 1099511627775L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 65535L) << 24) | (block4 >>> 40);
- values[vi++] = block4 & 1099511627775L;
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 8) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 16) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 24;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 16777215L) << 16) | (block1 >>> 48);
+ values[valuesOffset++] = (block1 >>> 8) & 1099511627775L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 32) | (block2 >>> 32);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4294967295L) << 8) | (block3 >>> 56);
+ values[valuesOffset++] = (block3 >>> 16) & 1099511627775L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 65535L) << 24) | (block4 >>> 40);
+ values[valuesOffset++] = block4 & 1099511627775L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 32) | (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte5 << 32) | (byte6 << 24) | (byte7 << 16) | (byte8 << 8) | byte9;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte10 << 32) | (byte11 << 24) | (byte12 << 16) | (byte13 << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 32) | (byte16 << 24) | (byte17 << 16) | (byte18 << 8) | byte19;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte20 << 32) | (byte21 << 24) | (byte22 << 16) | (byte23 << 8) | byte24;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 32) | (byte26 << 24) | (byte27 << 16) | (byte28 << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 32) | (byte31 << 24) | (byte32 << 16) | (byte33 << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 32) | (byte36 << 24) | (byte37 << 16) | (byte38 << 8) | byte39;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation41 extends BulkOperation {
+ }
+ ,
+ PACKED_41 {
- public int blocks() {
+ public int blockCount() {
return 41;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 23;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 8388607L) << 18) | (block1 >>> 46);
- values[vi++] = (block1 >>> 5) & 2199023255551L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 31L) << 36) | (block2 >>> 28);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 268435455L) << 13) | (block3 >>> 51);
- values[vi++] = (block3 >>> 10) & 2199023255551L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1023L) << 31) | (block4 >>> 33);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 8589934591L) << 8) | (block5 >>> 56);
- values[vi++] = (block5 >>> 15) & 2199023255551L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 32767L) << 26) | (block6 >>> 38);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 274877906943L) << 3) | (block7 >>> 61);
- values[vi++] = (block7 >>> 20) & 2199023255551L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 1048575L) << 21) | (block8 >>> 43);
- values[vi++] = (block8 >>> 2) & 2199023255551L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 3L) << 39) | (block9 >>> 25);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 33554431L) << 16) | (block10 >>> 48);
- values[vi++] = (block10 >>> 7) & 2199023255551L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 127L) << 34) | (block11 >>> 30);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 1073741823L) << 11) | (block12 >>> 53);
- values[vi++] = (block12 >>> 12) & 2199023255551L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4095L) << 29) | (block13 >>> 35);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 34359738367L) << 6) | (block14 >>> 58);
- values[vi++] = (block14 >>> 17) & 2199023255551L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 131071L) << 24) | (block15 >>> 40);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 1099511627775L) << 1) | (block16 >>> 63);
- values[vi++] = (block16 >>> 22) & 2199023255551L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 4194303L) << 19) | (block17 >>> 45);
- values[vi++] = (block17 >>> 4) & 2199023255551L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 15L) << 37) | (block18 >>> 27);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 134217727L) << 14) | (block19 >>> 50);
- values[vi++] = (block19 >>> 9) & 2199023255551L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 511L) << 32) | (block20 >>> 32);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 4294967295L) << 9) | (block21 >>> 55);
- values[vi++] = (block21 >>> 14) & 2199023255551L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 16383L) << 27) | (block22 >>> 37);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 137438953471L) << 4) | (block23 >>> 60);
- values[vi++] = (block23 >>> 19) & 2199023255551L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 524287L) << 22) | (block24 >>> 42);
- values[vi++] = (block24 >>> 1) & 2199023255551L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 1L) << 40) | (block25 >>> 24);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 16777215L) << 17) | (block26 >>> 47);
- values[vi++] = (block26 >>> 6) & 2199023255551L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 63L) << 35) | (block27 >>> 29);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 536870911L) << 12) | (block28 >>> 52);
- values[vi++] = (block28 >>> 11) & 2199023255551L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 2047L) << 30) | (block29 >>> 34);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 17179869183L) << 7) | (block30 >>> 57);
- values[vi++] = (block30 >>> 16) & 2199023255551L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 65535L) << 25) | (block31 >>> 39);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 549755813887L) << 2) | (block32 >>> 62);
- values[vi++] = (block32 >>> 21) & 2199023255551L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 2097151L) << 20) | (block33 >>> 44);
- values[vi++] = (block33 >>> 3) & 2199023255551L;
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 7L) << 38) | (block34 >>> 26);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 67108863L) << 15) | (block35 >>> 49);
- values[vi++] = (block35 >>> 8) & 2199023255551L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 255L) << 33) | (block36 >>> 31);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 2147483647L) << 10) | (block37 >>> 54);
- values[vi++] = (block37 >>> 13) & 2199023255551L;
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 8191L) << 28) | (block38 >>> 36);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 68719476735L) << 5) | (block39 >>> 59);
- values[vi++] = (block39 >>> 18) & 2199023255551L;
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 262143L) << 23) | (block40 >>> 41);
- values[vi++] = block40 & 2199023255551L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 5) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 10) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 15) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 20) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi++] << 2) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 7) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 12) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 17) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 22) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 4) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 9) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 14) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 19) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi++] << 1) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 6) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 11) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 16) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 21) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 3) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 8) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 13) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 18) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 23;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 8388607L) << 18) | (block1 >>> 46);
+ values[valuesOffset++] = (block1 >>> 5) & 2199023255551L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 31L) << 36) | (block2 >>> 28);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 268435455L) << 13) | (block3 >>> 51);
+ values[valuesOffset++] = (block3 >>> 10) & 2199023255551L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1023L) << 31) | (block4 >>> 33);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 8589934591L) << 8) | (block5 >>> 56);
+ values[valuesOffset++] = (block5 >>> 15) & 2199023255551L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 32767L) << 26) | (block6 >>> 38);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 274877906943L) << 3) | (block7 >>> 61);
+ values[valuesOffset++] = (block7 >>> 20) & 2199023255551L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 1048575L) << 21) | (block8 >>> 43);
+ values[valuesOffset++] = (block8 >>> 2) & 2199023255551L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 3L) << 39) | (block9 >>> 25);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 33554431L) << 16) | (block10 >>> 48);
+ values[valuesOffset++] = (block10 >>> 7) & 2199023255551L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 127L) << 34) | (block11 >>> 30);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 1073741823L) << 11) | (block12 >>> 53);
+ values[valuesOffset++] = (block12 >>> 12) & 2199023255551L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4095L) << 29) | (block13 >>> 35);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 34359738367L) << 6) | (block14 >>> 58);
+ values[valuesOffset++] = (block14 >>> 17) & 2199023255551L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 131071L) << 24) | (block15 >>> 40);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 1099511627775L) << 1) | (block16 >>> 63);
+ values[valuesOffset++] = (block16 >>> 22) & 2199023255551L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 4194303L) << 19) | (block17 >>> 45);
+ values[valuesOffset++] = (block17 >>> 4) & 2199023255551L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 15L) << 37) | (block18 >>> 27);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 134217727L) << 14) | (block19 >>> 50);
+ values[valuesOffset++] = (block19 >>> 9) & 2199023255551L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 511L) << 32) | (block20 >>> 32);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 4294967295L) << 9) | (block21 >>> 55);
+ values[valuesOffset++] = (block21 >>> 14) & 2199023255551L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 16383L) << 27) | (block22 >>> 37);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 137438953471L) << 4) | (block23 >>> 60);
+ values[valuesOffset++] = (block23 >>> 19) & 2199023255551L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 524287L) << 22) | (block24 >>> 42);
+ values[valuesOffset++] = (block24 >>> 1) & 2199023255551L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 1L) << 40) | (block25 >>> 24);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 16777215L) << 17) | (block26 >>> 47);
+ values[valuesOffset++] = (block26 >>> 6) & 2199023255551L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 63L) << 35) | (block27 >>> 29);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 536870911L) << 12) | (block28 >>> 52);
+ values[valuesOffset++] = (block28 >>> 11) & 2199023255551L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 2047L) << 30) | (block29 >>> 34);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 17179869183L) << 7) | (block30 >>> 57);
+ values[valuesOffset++] = (block30 >>> 16) & 2199023255551L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 65535L) << 25) | (block31 >>> 39);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 549755813887L) << 2) | (block32 >>> 62);
+ values[valuesOffset++] = (block32 >>> 21) & 2199023255551L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 2097151L) << 20) | (block33 >>> 44);
+ values[valuesOffset++] = (block33 >>> 3) & 2199023255551L;
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 7L) << 38) | (block34 >>> 26);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 67108863L) << 15) | (block35 >>> 49);
+ values[valuesOffset++] = (block35 >>> 8) & 2199023255551L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 255L) << 33) | (block36 >>> 31);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 2147483647L) << 10) | (block37 >>> 54);
+ values[valuesOffset++] = (block37 >>> 13) & 2199023255551L;
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 8191L) << 28) | (block38 >>> 36);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 68719476735L) << 5) | (block39 >>> 59);
+ values[valuesOffset++] = (block39 >>> 18) & 2199023255551L;
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 262143L) << 23) | (block40 >>> 41);
+ values[valuesOffset++] = block40 & 2199023255551L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 33) | (byte1 << 25) | (byte2 << 17) | (byte3 << 9) | (byte4 << 1) | (byte5 >>> 7);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 127) << 34) | (byte6 << 26) | (byte7 << 18) | (byte8 << 10) | (byte9 << 2) | (byte10 >>> 6);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 63) << 35) | (byte11 << 27) | (byte12 << 19) | (byte13 << 11) | (byte14 << 3) | (byte15 >>> 5);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 31) << 36) | (byte16 << 28) | (byte17 << 20) | (byte18 << 12) | (byte19 << 4) | (byte20 >>> 4);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 15) << 37) | (byte21 << 29) | (byte22 << 21) | (byte23 << 13) | (byte24 << 5) | (byte25 >>> 3);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 7) << 38) | (byte26 << 30) | (byte27 << 22) | (byte28 << 14) | (byte29 << 6) | (byte30 >>> 2);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 3) << 39) | (byte31 << 31) | (byte32 << 23) | (byte33 << 15) | (byte34 << 7) | (byte35 >>> 1);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 1) << 40) | (byte36 << 32) | (byte37 << 24) | (byte38 << 16) | (byte39 << 8) | byte40;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte41 << 33) | (byte42 << 25) | (byte43 << 17) | (byte44 << 9) | (byte45 << 1) | (byte46 >>> 7);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 127) << 34) | (byte47 << 26) | (byte48 << 18) | (byte49 << 10) | (byte50 << 2) | (byte51 >>> 6);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 63) << 35) | (byte52 << 27) | (byte53 << 19) | (byte54 << 11) | (byte55 << 3) | (byte56 >>> 5);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 31) << 36) | (byte57 << 28) | (byte58 << 20) | (byte59 << 12) | (byte60 << 4) | (byte61 >>> 4);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 15) << 37) | (byte62 << 29) | (byte63 << 21) | (byte64 << 13) | (byte65 << 5) | (byte66 >>> 3);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 7) << 38) | (byte67 << 30) | (byte68 << 22) | (byte69 << 14) | (byte70 << 6) | (byte71 >>> 2);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 3) << 39) | (byte72 << 31) | (byte73 << 23) | (byte74 << 15) | (byte75 << 7) | (byte76 >>> 1);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 1) << 40) | (byte77 << 32) | (byte78 << 24) | (byte79 << 16) | (byte80 << 8) | byte81;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte82 << 33) | (byte83 << 25) | (byte84 << 17) | (byte85 << 9) | (byte86 << 1) | (byte87 >>> 7);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 127) << 34) | (byte88 << 26) | (byte89 << 18) | (byte90 << 10) | (byte91 << 2) | (byte92 >>> 6);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 63) << 35) | (byte93 << 27) | (byte94 << 19) | (byte95 << 11) | (byte96 << 3) | (byte97 >>> 5);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 31) << 36) | (byte98 << 28) | (byte99 << 20) | (byte100 << 12) | (byte101 << 4) | (byte102 >>> 4);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 15) << 37) | (byte103 << 29) | (byte104 << 21) | (byte105 << 13) | (byte106 << 5) | (byte107 >>> 3);
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 7) << 38) | (byte108 << 30) | (byte109 << 22) | (byte110 << 14) | (byte111 << 6) | (byte112 >>> 2);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 3) << 39) | (byte113 << 31) | (byte114 << 23) | (byte115 << 15) | (byte116 << 7) | (byte117 >>> 1);
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte117 & 1) << 40) | (byte118 << 32) | (byte119 << 24) | (byte120 << 16) | (byte121 << 8) | byte122;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte123 << 33) | (byte124 << 25) | (byte125 << 17) | (byte126 << 9) | (byte127 << 1) | (byte128 >>> 7);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 127) << 34) | (byte129 << 26) | (byte130 << 18) | (byte131 << 10) | (byte132 << 2) | (byte133 >>> 6);
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 63) << 35) | (byte134 << 27) | (byte135 << 19) | (byte136 << 11) | (byte137 << 3) | (byte138 >>> 5);
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte138 & 31) << 36) | (byte139 << 28) | (byte140 << 20) | (byte141 << 12) | (byte142 << 4) | (byte143 >>> 4);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 15) << 37) | (byte144 << 29) | (byte145 << 21) | (byte146 << 13) | (byte147 << 5) | (byte148 >>> 3);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 7) << 38) | (byte149 << 30) | (byte150 << 22) | (byte151 << 14) | (byte152 << 6) | (byte153 >>> 2);
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte153 & 3) << 39) | (byte154 << 31) | (byte155 << 23) | (byte156 << 15) | (byte157 << 7) | (byte158 >>> 1);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 1) << 40) | (byte159 << 32) | (byte160 << 24) | (byte161 << 16) | (byte162 << 8) | byte163;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte164 << 33) | (byte165 << 25) | (byte166 << 17) | (byte167 << 9) | (byte168 << 1) | (byte169 >>> 7);
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte169 & 127) << 34) | (byte170 << 26) | (byte171 << 18) | (byte172 << 10) | (byte173 << 2) | (byte174 >>> 6);
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte174 & 63) << 35) | (byte175 << 27) | (byte176 << 19) | (byte177 << 11) | (byte178 << 3) | (byte179 >>> 5);
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte179 & 31) << 36) | (byte180 << 28) | (byte181 << 20) | (byte182 << 12) | (byte183 << 4) | (byte184 >>> 4);
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 15) << 37) | (byte185 << 29) | (byte186 << 21) | (byte187 << 13) | (byte188 << 5) | (byte189 >>> 3);
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 7) << 38) | (byte190 << 30) | (byte191 << 22) | (byte192 << 14) | (byte193 << 6) | (byte194 >>> 2);
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte194 & 3) << 39) | (byte195 << 31) | (byte196 << 23) | (byte197 << 15) | (byte198 << 7) | (byte199 >>> 1);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 1) << 40) | (byte200 << 32) | (byte201 << 24) | (byte202 << 16) | (byte203 << 8) | byte204;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte205 << 33) | (byte206 << 25) | (byte207 << 17) | (byte208 << 9) | (byte209 << 1) | (byte210 >>> 7);
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 127) << 34) | (byte211 << 26) | (byte212 << 18) | (byte213 << 10) | (byte214 << 2) | (byte215 >>> 6);
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte215 & 63) << 35) | (byte216 << 27) | (byte217 << 19) | (byte218 << 11) | (byte219 << 3) | (byte220 >>> 5);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 31) << 36) | (byte221 << 28) | (byte222 << 20) | (byte223 << 12) | (byte224 << 4) | (byte225 >>> 4);
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte225 & 15) << 37) | (byte226 << 29) | (byte227 << 21) | (byte228 << 13) | (byte229 << 5) | (byte230 >>> 3);
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte230 & 7) << 38) | (byte231 << 30) | (byte232 << 22) | (byte233 << 14) | (byte234 << 6) | (byte235 >>> 2);
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte235 & 3) << 39) | (byte236 << 31) | (byte237 << 23) | (byte238 << 15) | (byte239 << 7) | (byte240 >>> 1);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 1) << 40) | (byte241 << 32) | (byte242 << 24) | (byte243 << 16) | (byte244 << 8) | byte245;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte246 << 33) | (byte247 << 25) | (byte248 << 17) | (byte249 << 9) | (byte250 << 1) | (byte251 >>> 7);
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte251 & 127) << 34) | (byte252 << 26) | (byte253 << 18) | (byte254 << 10) | (byte255 << 2) | (byte256 >>> 6);
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte256 & 63) << 35) | (byte257 << 27) | (byte258 << 19) | (byte259 << 11) | (byte260 << 3) | (byte261 >>> 5);
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte261 & 31) << 36) | (byte262 << 28) | (byte263 << 20) | (byte264 << 12) | (byte265 << 4) | (byte266 >>> 4);
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte266 & 15) << 37) | (byte267 << 29) | (byte268 << 21) | (byte269 << 13) | (byte270 << 5) | (byte271 >>> 3);
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte271 & 7) << 38) | (byte272 << 30) | (byte273 << 22) | (byte274 << 14) | (byte275 << 6) | (byte276 >>> 2);
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte276 & 3) << 39) | (byte277 << 31) | (byte278 << 23) | (byte279 << 15) | (byte280 << 7) | (byte281 >>> 1);
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte281 & 1) << 40) | (byte282 << 32) | (byte283 << 24) | (byte284 << 16) | (byte285 << 8) | byte286;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte287 << 33) | (byte288 << 25) | (byte289 << 17) | (byte290 << 9) | (byte291 << 1) | (byte292 >>> 7);
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte292 & 127) << 34) | (byte293 << 26) | (byte294 << 18) | (byte295 << 10) | (byte296 << 2) | (byte297 >>> 6);
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte297 & 63) << 35) | (byte298 << 27) | (byte299 << 19) | (byte300 << 11) | (byte301 << 3) | (byte302 >>> 5);
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte302 & 31) << 36) | (byte303 << 28) | (byte304 << 20) | (byte305 << 12) | (byte306 << 4) | (byte307 >>> 4);
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte307 & 15) << 37) | (byte308 << 29) | (byte309 << 21) | (byte310 << 13) | (byte311 << 5) | (byte312 >>> 3);
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte312 & 7) << 38) | (byte313 << 30) | (byte314 << 22) | (byte315 << 14) | (byte316 << 6) | (byte317 >>> 2);
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte317 & 3) << 39) | (byte318 << 31) | (byte319 << 23) | (byte320 << 15) | (byte321 << 7) | (byte322 >>> 1);
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte322 & 1) << 40) | (byte323 << 32) | (byte324 << 24) | (byte325 << 16) | (byte326 << 8) | byte327;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation42 extends BulkOperation {
+ }
+ ,
+ PACKED_42 {
- public int blocks() {
+ public int blockCount() {
return 21;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 22;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 4194303L) << 20) | (block1 >>> 44);
- values[vi++] = (block1 >>> 2) & 4398046511103L;
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 40) | (block2 >>> 24);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 16777215L) << 18) | (block3 >>> 46);
- values[vi++] = (block3 >>> 4) & 4398046511103L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 38) | (block4 >>> 26);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 67108863L) << 16) | (block5 >>> 48);
- values[vi++] = (block5 >>> 6) & 4398046511103L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 36) | (block6 >>> 28);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 268435455L) << 14) | (block7 >>> 50);
- values[vi++] = (block7 >>> 8) & 4398046511103L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 34) | (block8 >>> 30);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 1073741823L) << 12) | (block9 >>> 52);
- values[vi++] = (block9 >>> 10) & 4398046511103L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 32) | (block10 >>> 32);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 4294967295L) << 10) | (block11 >>> 54);
- values[vi++] = (block11 >>> 12) & 4398046511103L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4095L) << 30) | (block12 >>> 34);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 17179869183L) << 8) | (block13 >>> 56);
- values[vi++] = (block13 >>> 14) & 4398046511103L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 16383L) << 28) | (block14 >>> 36);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 68719476735L) << 6) | (block15 >>> 58);
- values[vi++] = (block15 >>> 16) & 4398046511103L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 65535L) << 26) | (block16 >>> 38);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 274877906943L) << 4) | (block17 >>> 60);
- values[vi++] = (block17 >>> 18) & 4398046511103L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 262143L) << 24) | (block18 >>> 40);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1099511627775L) << 2) | (block19 >>> 62);
- values[vi++] = (block19 >>> 20) & 4398046511103L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1048575L) << 22) | (block20 >>> 42);
- values[vi++] = block20 & 4398046511103L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 2) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 4) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 6) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 8) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 10) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 12) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 14) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 16) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 18) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 20) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 22;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 4194303L) << 20) | (block1 >>> 44);
+ values[valuesOffset++] = (block1 >>> 2) & 4398046511103L;
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 40) | (block2 >>> 24);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 16777215L) << 18) | (block3 >>> 46);
+ values[valuesOffset++] = (block3 >>> 4) & 4398046511103L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 38) | (block4 >>> 26);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 67108863L) << 16) | (block5 >>> 48);
+ values[valuesOffset++] = (block5 >>> 6) & 4398046511103L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 36) | (block6 >>> 28);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 268435455L) << 14) | (block7 >>> 50);
+ values[valuesOffset++] = (block7 >>> 8) & 4398046511103L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 34) | (block8 >>> 30);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 1073741823L) << 12) | (block9 >>> 52);
+ values[valuesOffset++] = (block9 >>> 10) & 4398046511103L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 32) | (block10 >>> 32);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 4294967295L) << 10) | (block11 >>> 54);
+ values[valuesOffset++] = (block11 >>> 12) & 4398046511103L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4095L) << 30) | (block12 >>> 34);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 17179869183L) << 8) | (block13 >>> 56);
+ values[valuesOffset++] = (block13 >>> 14) & 4398046511103L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 16383L) << 28) | (block14 >>> 36);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 68719476735L) << 6) | (block15 >>> 58);
+ values[valuesOffset++] = (block15 >>> 16) & 4398046511103L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 65535L) << 26) | (block16 >>> 38);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 274877906943L) << 4) | (block17 >>> 60);
+ values[valuesOffset++] = (block17 >>> 18) & 4398046511103L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 262143L) << 24) | (block18 >>> 40);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1099511627775L) << 2) | (block19 >>> 62);
+ values[valuesOffset++] = (block19 >>> 20) & 4398046511103L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1048575L) << 22) | (block20 >>> 42);
+ values[valuesOffset++] = block20 & 4398046511103L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 34) | (byte1 << 26) | (byte2 << 18) | (byte3 << 10) | (byte4 << 2) | (byte5 >>> 6);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 63) << 36) | (byte6 << 28) | (byte7 << 20) | (byte8 << 12) | (byte9 << 4) | (byte10 >>> 4);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 15) << 38) | (byte11 << 30) | (byte12 << 22) | (byte13 << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 40) | (byte16 << 32) | (byte17 << 24) | (byte18 << 16) | (byte19 << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 34) | (byte22 << 26) | (byte23 << 18) | (byte24 << 10) | (byte25 << 2) | (byte26 >>> 6);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 63) << 36) | (byte27 << 28) | (byte28 << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 38) | (byte32 << 30) | (byte33 << 22) | (byte34 << 14) | (byte35 << 6) | (byte36 >>> 2);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 40) | (byte37 << 32) | (byte38 << 24) | (byte39 << 16) | (byte40 << 8) | byte41;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 34) | (byte43 << 26) | (byte44 << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 36) | (byte48 << 28) | (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 38) | (byte53 << 30) | (byte54 << 22) | (byte55 << 14) | (byte56 << 6) | (byte57 >>> 2);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 3) << 40) | (byte58 << 32) | (byte59 << 24) | (byte60 << 16) | (byte61 << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 34) | (byte64 << 26) | (byte65 << 18) | (byte66 << 10) | (byte67 << 2) | (byte68 >>> 6);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 63) << 36) | (byte69 << 28) | (byte70 << 20) | (byte71 << 12) | (byte72 << 4) | (byte73 >>> 4);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 15) << 38) | (byte74 << 30) | (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 40) | (byte79 << 32) | (byte80 << 24) | (byte81 << 16) | (byte82 << 8) | byte83;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte84 << 34) | (byte85 << 26) | (byte86 << 18) | (byte87 << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 36) | (byte90 << 28) | (byte91 << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 38) | (byte95 << 30) | (byte96 << 22) | (byte97 << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 40) | (byte100 << 32) | (byte101 << 24) | (byte102 << 16) | (byte103 << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 34) | (byte106 << 26) | (byte107 << 18) | (byte108 << 10) | (byte109 << 2) | (byte110 >>> 6);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 63) << 36) | (byte111 << 28) | (byte112 << 20) | (byte113 << 12) | (byte114 << 4) | (byte115 >>> 4);
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte115 & 15) << 38) | (byte116 << 30) | (byte117 << 22) | (byte118 << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 40) | (byte121 << 32) | (byte122 << 24) | (byte123 << 16) | (byte124 << 8) | byte125;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte126 << 34) | (byte127 << 26) | (byte128 << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 36) | (byte132 << 28) | (byte133 << 20) | (byte134 << 12) | (byte135 << 4) | (byte136 >>> 4);
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte136 & 15) << 38) | (byte137 << 30) | (byte138 << 22) | (byte139 << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 40) | (byte142 << 32) | (byte143 << 24) | (byte144 << 16) | (byte145 << 8) | byte146;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte147 << 34) | (byte148 << 26) | (byte149 << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 36) | (byte153 << 28) | (byte154 << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 38) | (byte158 << 30) | (byte159 << 22) | (byte160 << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 40) | (byte163 << 32) | (byte164 << 24) | (byte165 << 16) | (byte166 << 8) | byte167;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation43 extends BulkOperation {
+ }
+ ,
+ PACKED_43 {
- public int blocks() {
+ public int blockCount() {
return 43;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 21;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 2097151L) << 22) | (block1 >>> 42);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 4398046511103L) << 1) | (block2 >>> 63);
- values[vi++] = (block2 >>> 20) & 8796093022207L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 1048575L) << 23) | (block3 >>> 41);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 2199023255551L) << 2) | (block4 >>> 62);
- values[vi++] = (block4 >>> 19) & 8796093022207L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 524287L) << 24) | (block5 >>> 40);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1099511627775L) << 3) | (block6 >>> 61);
- values[vi++] = (block6 >>> 18) & 8796093022207L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 262143L) << 25) | (block7 >>> 39);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 549755813887L) << 4) | (block8 >>> 60);
- values[vi++] = (block8 >>> 17) & 8796093022207L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 131071L) << 26) | (block9 >>> 38);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 274877906943L) << 5) | (block10 >>> 59);
- values[vi++] = (block10 >>> 16) & 8796093022207L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 65535L) << 27) | (block11 >>> 37);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 137438953471L) << 6) | (block12 >>> 58);
- values[vi++] = (block12 >>> 15) & 8796093022207L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 32767L) << 28) | (block13 >>> 36);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 68719476735L) << 7) | (block14 >>> 57);
- values[vi++] = (block14 >>> 14) & 8796093022207L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 16383L) << 29) | (block15 >>> 35);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 34359738367L) << 8) | (block16 >>> 56);
- values[vi++] = (block16 >>> 13) & 8796093022207L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 8191L) << 30) | (block17 >>> 34);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 17179869183L) << 9) | (block18 >>> 55);
- values[vi++] = (block18 >>> 12) & 8796093022207L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 4095L) << 31) | (block19 >>> 33);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 8589934591L) << 10) | (block20 >>> 54);
- values[vi++] = (block20 >>> 11) & 8796093022207L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 2047L) << 32) | (block21 >>> 32);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 4294967295L) << 11) | (block22 >>> 53);
- values[vi++] = (block22 >>> 10) & 8796093022207L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 1023L) << 33) | (block23 >>> 31);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 2147483647L) << 12) | (block24 >>> 52);
- values[vi++] = (block24 >>> 9) & 8796093022207L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 511L) << 34) | (block25 >>> 30);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 1073741823L) << 13) | (block26 >>> 51);
- values[vi++] = (block26 >>> 8) & 8796093022207L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 255L) << 35) | (block27 >>> 29);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 536870911L) << 14) | (block28 >>> 50);
- values[vi++] = (block28 >>> 7) & 8796093022207L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 127L) << 36) | (block29 >>> 28);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 268435455L) << 15) | (block30 >>> 49);
- values[vi++] = (block30 >>> 6) & 8796093022207L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 63L) << 37) | (block31 >>> 27);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 134217727L) << 16) | (block32 >>> 48);
- values[vi++] = (block32 >>> 5) & 8796093022207L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 31L) << 38) | (block33 >>> 26);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 67108863L) << 17) | (block34 >>> 47);
- values[vi++] = (block34 >>> 4) & 8796093022207L;
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 15L) << 39) | (block35 >>> 25);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 33554431L) << 18) | (block36 >>> 46);
- values[vi++] = (block36 >>> 3) & 8796093022207L;
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 7L) << 40) | (block37 >>> 24);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 16777215L) << 19) | (block38 >>> 45);
- values[vi++] = (block38 >>> 2) & 8796093022207L;
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 3L) << 41) | (block39 >>> 23);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 8388607L) << 20) | (block40 >>> 44);
- values[vi++] = (block40 >>> 1) & 8796093022207L;
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 1L) << 42) | (block41 >>> 22);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 4194303L) << 21) | (block42 >>> 43);
- values[vi++] = block42 & 8796093022207L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 20) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 19) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 18) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 17) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 16) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 15) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 14) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 13) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 12) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 11) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 10) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 9) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 8) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 7) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 6) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 5) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 4) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 3) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi++] << 2) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi++] << 1) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 21;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 2097151L) << 22) | (block1 >>> 42);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 4398046511103L) << 1) | (block2 >>> 63);
+ values[valuesOffset++] = (block2 >>> 20) & 8796093022207L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 1048575L) << 23) | (block3 >>> 41);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 2199023255551L) << 2) | (block4 >>> 62);
+ values[valuesOffset++] = (block4 >>> 19) & 8796093022207L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 524287L) << 24) | (block5 >>> 40);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1099511627775L) << 3) | (block6 >>> 61);
+ values[valuesOffset++] = (block6 >>> 18) & 8796093022207L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 262143L) << 25) | (block7 >>> 39);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 549755813887L) << 4) | (block8 >>> 60);
+ values[valuesOffset++] = (block8 >>> 17) & 8796093022207L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 131071L) << 26) | (block9 >>> 38);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 274877906943L) << 5) | (block10 >>> 59);
+ values[valuesOffset++] = (block10 >>> 16) & 8796093022207L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 65535L) << 27) | (block11 >>> 37);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 137438953471L) << 6) | (block12 >>> 58);
+ values[valuesOffset++] = (block12 >>> 15) & 8796093022207L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 32767L) << 28) | (block13 >>> 36);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 68719476735L) << 7) | (block14 >>> 57);
+ values[valuesOffset++] = (block14 >>> 14) & 8796093022207L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 16383L) << 29) | (block15 >>> 35);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 34359738367L) << 8) | (block16 >>> 56);
+ values[valuesOffset++] = (block16 >>> 13) & 8796093022207L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 8191L) << 30) | (block17 >>> 34);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 17179869183L) << 9) | (block18 >>> 55);
+ values[valuesOffset++] = (block18 >>> 12) & 8796093022207L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 4095L) << 31) | (block19 >>> 33);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 8589934591L) << 10) | (block20 >>> 54);
+ values[valuesOffset++] = (block20 >>> 11) & 8796093022207L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 2047L) << 32) | (block21 >>> 32);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 4294967295L) << 11) | (block22 >>> 53);
+ values[valuesOffset++] = (block22 >>> 10) & 8796093022207L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 1023L) << 33) | (block23 >>> 31);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 2147483647L) << 12) | (block24 >>> 52);
+ values[valuesOffset++] = (block24 >>> 9) & 8796093022207L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 511L) << 34) | (block25 >>> 30);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 1073741823L) << 13) | (block26 >>> 51);
+ values[valuesOffset++] = (block26 >>> 8) & 8796093022207L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 255L) << 35) | (block27 >>> 29);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 536870911L) << 14) | (block28 >>> 50);
+ values[valuesOffset++] = (block28 >>> 7) & 8796093022207L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 127L) << 36) | (block29 >>> 28);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 268435455L) << 15) | (block30 >>> 49);
+ values[valuesOffset++] = (block30 >>> 6) & 8796093022207L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 63L) << 37) | (block31 >>> 27);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 134217727L) << 16) | (block32 >>> 48);
+ values[valuesOffset++] = (block32 >>> 5) & 8796093022207L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 31L) << 38) | (block33 >>> 26);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 67108863L) << 17) | (block34 >>> 47);
+ values[valuesOffset++] = (block34 >>> 4) & 8796093022207L;
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 15L) << 39) | (block35 >>> 25);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 33554431L) << 18) | (block36 >>> 46);
+ values[valuesOffset++] = (block36 >>> 3) & 8796093022207L;
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 7L) << 40) | (block37 >>> 24);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 16777215L) << 19) | (block38 >>> 45);
+ values[valuesOffset++] = (block38 >>> 2) & 8796093022207L;
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 3L) << 41) | (block39 >>> 23);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 8388607L) << 20) | (block40 >>> 44);
+ values[valuesOffset++] = (block40 >>> 1) & 8796093022207L;
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 1L) << 42) | (block41 >>> 22);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 4194303L) << 21) | (block42 >>> 43);
+ values[valuesOffset++] = block42 & 8796093022207L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 35) | (byte1 << 27) | (byte2 << 19) | (byte3 << 11) | (byte4 << 3) | (byte5 >>> 5);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 31) << 38) | (byte6 << 30) | (byte7 << 22) | (byte8 << 14) | (byte9 << 6) | (byte10 >>> 2);
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte10 & 3) << 41) | (byte11 << 33) | (byte12 << 25) | (byte13 << 17) | (byte14 << 9) | (byte15 << 1) | (byte16 >>> 7);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 127) << 36) | (byte17 << 28) | (byte18 << 20) | (byte19 << 12) | (byte20 << 4) | (byte21 >>> 4);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 15) << 39) | (byte22 << 31) | (byte23 << 23) | (byte24 << 15) | (byte25 << 7) | (byte26 >>> 1);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 1) << 42) | (byte27 << 34) | (byte28 << 26) | (byte29 << 18) | (byte30 << 10) | (byte31 << 2) | (byte32 >>> 6);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 63) << 37) | (byte33 << 29) | (byte34 << 21) | (byte35 << 13) | (byte36 << 5) | (byte37 >>> 3);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 7) << 40) | (byte38 << 32) | (byte39 << 24) | (byte40 << 16) | (byte41 << 8) | byte42;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte43 << 35) | (byte44 << 27) | (byte45 << 19) | (byte46 << 11) | (byte47 << 3) | (byte48 >>> 5);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 31) << 38) | (byte49 << 30) | (byte50 << 22) | (byte51 << 14) | (byte52 << 6) | (byte53 >>> 2);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 3) << 41) | (byte54 << 33) | (byte55 << 25) | (byte56 << 17) | (byte57 << 9) | (byte58 << 1) | (byte59 >>> 7);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 127) << 36) | (byte60 << 28) | (byte61 << 20) | (byte62 << 12) | (byte63 << 4) | (byte64 >>> 4);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 15) << 39) | (byte65 << 31) | (byte66 << 23) | (byte67 << 15) | (byte68 << 7) | (byte69 >>> 1);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 1) << 42) | (byte70 << 34) | (byte71 << 26) | (byte72 << 18) | (byte73 << 10) | (byte74 << 2) | (byte75 >>> 6);
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte75 & 63) << 37) | (byte76 << 29) | (byte77 << 21) | (byte78 << 13) | (byte79 << 5) | (byte80 >>> 3);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 7) << 40) | (byte81 << 32) | (byte82 << 24) | (byte83 << 16) | (byte84 << 8) | byte85;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte86 << 35) | (byte87 << 27) | (byte88 << 19) | (byte89 << 11) | (byte90 << 3) | (byte91 >>> 5);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 31) << 38) | (byte92 << 30) | (byte93 << 22) | (byte94 << 14) | (byte95 << 6) | (byte96 >>> 2);
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 3) << 41) | (byte97 << 33) | (byte98 << 25) | (byte99 << 17) | (byte100 << 9) | (byte101 << 1) | (byte102 >>> 7);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 127) << 36) | (byte103 << 28) | (byte104 << 20) | (byte105 << 12) | (byte106 << 4) | (byte107 >>> 4);
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte107 & 15) << 39) | (byte108 << 31) | (byte109 << 23) | (byte110 << 15) | (byte111 << 7) | (byte112 >>> 1);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 1) << 42) | (byte113 << 34) | (byte114 << 26) | (byte115 << 18) | (byte116 << 10) | (byte117 << 2) | (byte118 >>> 6);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 63) << 37) | (byte119 << 29) | (byte120 << 21) | (byte121 << 13) | (byte122 << 5) | (byte123 >>> 3);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 7) << 40) | (byte124 << 32) | (byte125 << 24) | (byte126 << 16) | (byte127 << 8) | byte128;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte129 << 35) | (byte130 << 27) | (byte131 << 19) | (byte132 << 11) | (byte133 << 3) | (byte134 >>> 5);
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 31) << 38) | (byte135 << 30) | (byte136 << 22) | (byte137 << 14) | (byte138 << 6) | (byte139 >>> 2);
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 3) << 41) | (byte140 << 33) | (byte141 << 25) | (byte142 << 17) | (byte143 << 9) | (byte144 << 1) | (byte145 >>> 7);
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte145 & 127) << 36) | (byte146 << 28) | (byte147 << 20) | (byte148 << 12) | (byte149 << 4) | (byte150 >>> 4);
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte150 & 15) << 39) | (byte151 << 31) | (byte152 << 23) | (byte153 << 15) | (byte154 << 7) | (byte155 >>> 1);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 1) << 42) | (byte156 << 34) | (byte157 << 26) | (byte158 << 18) | (byte159 << 10) | (byte160 << 2) | (byte161 >>> 6);
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte161 & 63) << 37) | (byte162 << 29) | (byte163 << 21) | (byte164 << 13) | (byte165 << 5) | (byte166 >>> 3);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 7) << 40) | (byte167 << 32) | (byte168 << 24) | (byte169 << 16) | (byte170 << 8) | byte171;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte172 << 35) | (byte173 << 27) | (byte174 << 19) | (byte175 << 11) | (byte176 << 3) | (byte177 >>> 5);
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte177 & 31) << 38) | (byte178 << 30) | (byte179 << 22) | (byte180 << 14) | (byte181 << 6) | (byte182 >>> 2);
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 3) << 41) | (byte183 << 33) | (byte184 << 25) | (byte185 << 17) | (byte186 << 9) | (byte187 << 1) | (byte188 >>> 7);
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte188 & 127) << 36) | (byte189 << 28) | (byte190 << 20) | (byte191 << 12) | (byte192 << 4) | (byte193 >>> 4);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 15) << 39) | (byte194 << 31) | (byte195 << 23) | (byte196 << 15) | (byte197 << 7) | (byte198 >>> 1);
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte198 & 1) << 42) | (byte199 << 34) | (byte200 << 26) | (byte201 << 18) | (byte202 << 10) | (byte203 << 2) | (byte204 >>> 6);
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte204 & 63) << 37) | (byte205 << 29) | (byte206 << 21) | (byte207 << 13) | (byte208 << 5) | (byte209 >>> 3);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 7) << 40) | (byte210 << 32) | (byte211 << 24) | (byte212 << 16) | (byte213 << 8) | byte214;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte215 << 35) | (byte216 << 27) | (byte217 << 19) | (byte218 << 11) | (byte219 << 3) | (byte220 >>> 5);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 31) << 38) | (byte221 << 30) | (byte222 << 22) | (byte223 << 14) | (byte224 << 6) | (byte225 >>> 2);
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte225 & 3) << 41) | (byte226 << 33) | (byte227 << 25) | (byte228 << 17) | (byte229 << 9) | (byte230 << 1) | (byte231 >>> 7);
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte231 & 127) << 36) | (byte232 << 28) | (byte233 << 20) | (byte234 << 12) | (byte235 << 4) | (byte236 >>> 4);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 15) << 39) | (byte237 << 31) | (byte238 << 23) | (byte239 << 15) | (byte240 << 7) | (byte241 >>> 1);
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte241 & 1) << 42) | (byte242 << 34) | (byte243 << 26) | (byte244 << 18) | (byte245 << 10) | (byte246 << 2) | (byte247 >>> 6);
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte247 & 63) << 37) | (byte248 << 29) | (byte249 << 21) | (byte250 << 13) | (byte251 << 5) | (byte252 >>> 3);
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte252 & 7) << 40) | (byte253 << 32) | (byte254 << 24) | (byte255 << 16) | (byte256 << 8) | byte257;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte258 << 35) | (byte259 << 27) | (byte260 << 19) | (byte261 << 11) | (byte262 << 3) | (byte263 >>> 5);
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte263 & 31) << 38) | (byte264 << 30) | (byte265 << 22) | (byte266 << 14) | (byte267 << 6) | (byte268 >>> 2);
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte268 & 3) << 41) | (byte269 << 33) | (byte270 << 25) | (byte271 << 17) | (byte272 << 9) | (byte273 << 1) | (byte274 >>> 7);
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte274 & 127) << 36) | (byte275 << 28) | (byte276 << 20) | (byte277 << 12) | (byte278 << 4) | (byte279 >>> 4);
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte279 & 15) << 39) | (byte280 << 31) | (byte281 << 23) | (byte282 << 15) | (byte283 << 7) | (byte284 >>> 1);
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte284 & 1) << 42) | (byte285 << 34) | (byte286 << 26) | (byte287 << 18) | (byte288 << 10) | (byte289 << 2) | (byte290 >>> 6);
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte290 & 63) << 37) | (byte291 << 29) | (byte292 << 21) | (byte293 << 13) | (byte294 << 5) | (byte295 >>> 3);
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte295 & 7) << 40) | (byte296 << 32) | (byte297 << 24) | (byte298 << 16) | (byte299 << 8) | byte300;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte301 << 35) | (byte302 << 27) | (byte303 << 19) | (byte304 << 11) | (byte305 << 3) | (byte306 >>> 5);
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte306 & 31) << 38) | (byte307 << 30) | (byte308 << 22) | (byte309 << 14) | (byte310 << 6) | (byte311 >>> 2);
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte311 & 3) << 41) | (byte312 << 33) | (byte313 << 25) | (byte314 << 17) | (byte315 << 9) | (byte316 << 1) | (byte317 >>> 7);
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte317 & 127) << 36) | (byte318 << 28) | (byte319 << 20) | (byte320 << 12) | (byte321 << 4) | (byte322 >>> 4);
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte322 & 15) << 39) | (byte323 << 31) | (byte324 << 23) | (byte325 << 15) | (byte326 << 7) | (byte327 >>> 1);
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte327 & 1) << 42) | (byte328 << 34) | (byte329 << 26) | (byte330 << 18) | (byte331 << 10) | (byte332 << 2) | (byte333 >>> 6);
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte333 & 63) << 37) | (byte334 << 29) | (byte335 << 21) | (byte336 << 13) | (byte337 << 5) | (byte338 >>> 3);
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte338 & 7) << 40) | (byte339 << 32) | (byte340 << 24) | (byte341 << 16) | (byte342 << 8) | byte343;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation44 extends BulkOperation {
+ }
+ ,
+ PACKED_44 {
- public int blocks() {
+ public int blockCount() {
return 11;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 20;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1048575L) << 24) | (block1 >>> 40);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1099511627775L) << 4) | (block2 >>> 60);
- values[vi++] = (block2 >>> 16) & 17592186044415L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 65535L) << 28) | (block3 >>> 36);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 68719476735L) << 8) | (block4 >>> 56);
- values[vi++] = (block4 >>> 12) & 17592186044415L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 4095L) << 32) | (block5 >>> 32);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 4294967295L) << 12) | (block6 >>> 52);
- values[vi++] = (block6 >>> 8) & 17592186044415L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 255L) << 36) | (block7 >>> 28);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 268435455L) << 16) | (block8 >>> 48);
- values[vi++] = (block8 >>> 4) & 17592186044415L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 40) | (block9 >>> 24);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 16777215L) << 20) | (block10 >>> 44);
- values[vi++] = block10 & 17592186044415L;
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 16) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 12) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 8) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 4) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 20;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1048575L) << 24) | (block1 >>> 40);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1099511627775L) << 4) | (block2 >>> 60);
+ values[valuesOffset++] = (block2 >>> 16) & 17592186044415L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 65535L) << 28) | (block3 >>> 36);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 68719476735L) << 8) | (block4 >>> 56);
+ values[valuesOffset++] = (block4 >>> 12) & 17592186044415L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 4095L) << 32) | (block5 >>> 32);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 4294967295L) << 12) | (block6 >>> 52);
+ values[valuesOffset++] = (block6 >>> 8) & 17592186044415L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 255L) << 36) | (block7 >>> 28);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 268435455L) << 16) | (block8 >>> 48);
+ values[valuesOffset++] = (block8 >>> 4) & 17592186044415L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 40) | (block9 >>> 24);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 16777215L) << 20) | (block10 >>> 44);
+ values[valuesOffset++] = block10 & 17592186044415L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 36) | (byte1 << 28) | (byte2 << 20) | (byte3 << 12) | (byte4 << 4) | (byte5 >>> 4);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 15) << 40) | (byte6 << 32) | (byte7 << 24) | (byte8 << 16) | (byte9 << 8) | byte10;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte11 << 36) | (byte12 << 28) | (byte13 << 20) | (byte14 << 12) | (byte15 << 4) | (byte16 >>> 4);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 15) << 40) | (byte17 << 32) | (byte18 << 24) | (byte19 << 16) | (byte20 << 8) | byte21;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte22 << 36) | (byte23 << 28) | (byte24 << 20) | (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 40) | (byte28 << 32) | (byte29 << 24) | (byte30 << 16) | (byte31 << 8) | byte32;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte33 << 36) | (byte34 << 28) | (byte35 << 20) | (byte36 << 12) | (byte37 << 4) | (byte38 >>> 4);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 15) << 40) | (byte39 << 32) | (byte40 << 24) | (byte41 << 16) | (byte42 << 8) | byte43;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte44 << 36) | (byte45 << 28) | (byte46 << 20) | (byte47 << 12) | (byte48 << 4) | (byte49 >>> 4);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 15) << 40) | (byte50 << 32) | (byte51 << 24) | (byte52 << 16) | (byte53 << 8) | byte54;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 36) | (byte56 << 28) | (byte57 << 20) | (byte58 << 12) | (byte59 << 4) | (byte60 >>> 4);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 15) << 40) | (byte61 << 32) | (byte62 << 24) | (byte63 << 16) | (byte64 << 8) | byte65;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte66 << 36) | (byte67 << 28) | (byte68 << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 40) | (byte72 << 32) | (byte73 << 24) | (byte74 << 16) | (byte75 << 8) | byte76;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte77 << 36) | (byte78 << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 40) | (byte83 << 32) | (byte84 << 24) | (byte85 << 16) | (byte86 << 8) | byte87;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation45 extends BulkOperation {
+ }
+ ,
+ PACKED_45 {
- public int blocks() {
+ public int blockCount() {
return 45;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 19;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 524287L) << 26) | (block1 >>> 38);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 274877906943L) << 7) | (block2 >>> 57);
- values[vi++] = (block2 >>> 12) & 35184372088831L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 33) | (block3 >>> 31);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 2147483647L) << 14) | (block4 >>> 50);
- values[vi++] = (block4 >>> 5) & 35184372088831L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 40) | (block5 >>> 24);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 16777215L) << 21) | (block6 >>> 43);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 8796093022207L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 17) & 35184372088831L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 131071L) << 28) | (block8 >>> 36);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 68719476735L) << 9) | (block9 >>> 55);
- values[vi++] = (block9 >>> 10) & 35184372088831L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 35) | (block10 >>> 29);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 536870911L) << 16) | (block11 >>> 48);
- values[vi++] = (block11 >>> 3) & 35184372088831L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 7L) << 42) | (block12 >>> 22);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4194303L) << 23) | (block13 >>> 41);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2199023255551L) << 4) | (block14 >>> 60);
- values[vi++] = (block14 >>> 15) & 35184372088831L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 32767L) << 30) | (block15 >>> 34);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 17179869183L) << 11) | (block16 >>> 53);
- values[vi++] = (block16 >>> 8) & 35184372088831L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 255L) << 37) | (block17 >>> 27);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 134217727L) << 18) | (block18 >>> 46);
- values[vi++] = (block18 >>> 1) & 35184372088831L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1L) << 44) | (block19 >>> 20);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1048575L) << 25) | (block20 >>> 39);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 549755813887L) << 6) | (block21 >>> 58);
- values[vi++] = (block21 >>> 13) & 35184372088831L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 8191L) << 32) | (block22 >>> 32);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4294967295L) << 13) | (block23 >>> 51);
- values[vi++] = (block23 >>> 6) & 35184372088831L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 63L) << 39) | (block24 >>> 25);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 33554431L) << 20) | (block25 >>> 44);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 17592186044415L) << 1) | (block26 >>> 63);
- values[vi++] = (block26 >>> 18) & 35184372088831L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 262143L) << 27) | (block27 >>> 37);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 137438953471L) << 8) | (block28 >>> 56);
- values[vi++] = (block28 >>> 11) & 35184372088831L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 2047L) << 34) | (block29 >>> 30);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1073741823L) << 15) | (block30 >>> 49);
- values[vi++] = (block30 >>> 4) & 35184372088831L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 15L) << 41) | (block31 >>> 23);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 8388607L) << 22) | (block32 >>> 42);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 4398046511103L) << 3) | (block33 >>> 61);
- values[vi++] = (block33 >>> 16) & 35184372088831L;
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 65535L) << 29) | (block34 >>> 35);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 34359738367L) << 10) | (block35 >>> 54);
- values[vi++] = (block35 >>> 9) & 35184372088831L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 511L) << 36) | (block36 >>> 28);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 268435455L) << 17) | (block37 >>> 47);
- values[vi++] = (block37 >>> 2) & 35184372088831L;
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 3L) << 43) | (block38 >>> 21);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 2097151L) << 24) | (block39 >>> 40);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 1099511627775L) << 5) | (block40 >>> 59);
- values[vi++] = (block40 >>> 14) & 35184372088831L;
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 16383L) << 31) | (block41 >>> 33);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 8589934591L) << 12) | (block42 >>> 52);
- values[vi++] = (block42 >>> 7) & 35184372088831L;
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 127L) << 38) | (block43 >>> 26);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 67108863L) << 19) | (block44 >>> 45);
- values[vi++] = block44 & 35184372088831L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 12) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 5) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 17) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 10) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 3) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 15) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 8) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi++] << 1) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 13) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 6) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 18) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 11) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 4) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 16) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 9) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi++] << 2) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 14) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 7) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 19;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 524287L) << 26) | (block1 >>> 38);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 274877906943L) << 7) | (block2 >>> 57);
+ values[valuesOffset++] = (block2 >>> 12) & 35184372088831L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 33) | (block3 >>> 31);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 2147483647L) << 14) | (block4 >>> 50);
+ values[valuesOffset++] = (block4 >>> 5) & 35184372088831L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 40) | (block5 >>> 24);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 16777215L) << 21) | (block6 >>> 43);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 8796093022207L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 17) & 35184372088831L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 131071L) << 28) | (block8 >>> 36);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 68719476735L) << 9) | (block9 >>> 55);
+ values[valuesOffset++] = (block9 >>> 10) & 35184372088831L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 35) | (block10 >>> 29);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 536870911L) << 16) | (block11 >>> 48);
+ values[valuesOffset++] = (block11 >>> 3) & 35184372088831L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 7L) << 42) | (block12 >>> 22);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4194303L) << 23) | (block13 >>> 41);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2199023255551L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = (block14 >>> 15) & 35184372088831L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 32767L) << 30) | (block15 >>> 34);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 17179869183L) << 11) | (block16 >>> 53);
+ values[valuesOffset++] = (block16 >>> 8) & 35184372088831L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 255L) << 37) | (block17 >>> 27);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 134217727L) << 18) | (block18 >>> 46);
+ values[valuesOffset++] = (block18 >>> 1) & 35184372088831L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1L) << 44) | (block19 >>> 20);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1048575L) << 25) | (block20 >>> 39);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 549755813887L) << 6) | (block21 >>> 58);
+ values[valuesOffset++] = (block21 >>> 13) & 35184372088831L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 8191L) << 32) | (block22 >>> 32);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4294967295L) << 13) | (block23 >>> 51);
+ values[valuesOffset++] = (block23 >>> 6) & 35184372088831L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 63L) << 39) | (block24 >>> 25);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 33554431L) << 20) | (block25 >>> 44);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 17592186044415L) << 1) | (block26 >>> 63);
+ values[valuesOffset++] = (block26 >>> 18) & 35184372088831L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 262143L) << 27) | (block27 >>> 37);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 137438953471L) << 8) | (block28 >>> 56);
+ values[valuesOffset++] = (block28 >>> 11) & 35184372088831L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 2047L) << 34) | (block29 >>> 30);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1073741823L) << 15) | (block30 >>> 49);
+ values[valuesOffset++] = (block30 >>> 4) & 35184372088831L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 15L) << 41) | (block31 >>> 23);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 8388607L) << 22) | (block32 >>> 42);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 4398046511103L) << 3) | (block33 >>> 61);
+ values[valuesOffset++] = (block33 >>> 16) & 35184372088831L;
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 65535L) << 29) | (block34 >>> 35);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 34359738367L) << 10) | (block35 >>> 54);
+ values[valuesOffset++] = (block35 >>> 9) & 35184372088831L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 511L) << 36) | (block36 >>> 28);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 268435455L) << 17) | (block37 >>> 47);
+ values[valuesOffset++] = (block37 >>> 2) & 35184372088831L;
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 3L) << 43) | (block38 >>> 21);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 2097151L) << 24) | (block39 >>> 40);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 1099511627775L) << 5) | (block40 >>> 59);
+ values[valuesOffset++] = (block40 >>> 14) & 35184372088831L;
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 16383L) << 31) | (block41 >>> 33);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 8589934591L) << 12) | (block42 >>> 52);
+ values[valuesOffset++] = (block42 >>> 7) & 35184372088831L;
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 127L) << 38) | (block43 >>> 26);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 67108863L) << 19) | (block44 >>> 45);
+ values[valuesOffset++] = block44 & 35184372088831L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 37) | (byte1 << 29) | (byte2 << 21) | (byte3 << 13) | (byte4 << 5) | (byte5 >>> 3);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 7) << 42) | (byte6 << 34) | (byte7 << 26) | (byte8 << 18) | (byte9 << 10) | (byte10 << 2) | (byte11 >>> 6);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 63) << 39) | (byte12 << 31) | (byte13 << 23) | (byte14 << 15) | (byte15 << 7) | (byte16 >>> 1);
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte16 & 1) << 44) | (byte17 << 36) | (byte18 << 28) | (byte19 << 20) | (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 41) | (byte23 << 33) | (byte24 << 25) | (byte25 << 17) | (byte26 << 9) | (byte27 << 1) | (byte28 >>> 7);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 127) << 38) | (byte29 << 30) | (byte30 << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 43) | (byte34 << 35) | (byte35 << 27) | (byte36 << 19) | (byte37 << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 40) | (byte40 << 32) | (byte41 << 24) | (byte42 << 16) | (byte43 << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 37) | (byte46 << 29) | (byte47 << 21) | (byte48 << 13) | (byte49 << 5) | (byte50 >>> 3);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 7) << 42) | (byte51 << 34) | (byte52 << 26) | (byte53 << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 39) | (byte57 << 31) | (byte58 << 23) | (byte59 << 15) | (byte60 << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 44) | (byte62 << 36) | (byte63 << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 41) | (byte68 << 33) | (byte69 << 25) | (byte70 << 17) | (byte71 << 9) | (byte72 << 1) | (byte73 >>> 7);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 127) << 38) | (byte74 << 30) | (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 43) | (byte79 << 35) | (byte80 << 27) | (byte81 << 19) | (byte82 << 11) | (byte83 << 3) | (byte84 >>> 5);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 31) << 40) | (byte85 << 32) | (byte86 << 24) | (byte87 << 16) | (byte88 << 8) | byte89;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 37) | (byte91 << 29) | (byte92 << 21) | (byte93 << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 42) | (byte96 << 34) | (byte97 << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 39) | (byte102 << 31) | (byte103 << 23) | (byte104 << 15) | (byte105 << 7) | (byte106 >>> 1);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 44) | (byte107 << 36) | (byte108 << 28) | (byte109 << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 41) | (byte113 << 33) | (byte114 << 25) | (byte115 << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 38) | (byte119 << 30) | (byte120 << 22) | (byte121 << 14) | (byte122 << 6) | (byte123 >>> 2);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 3) << 43) | (byte124 << 35) | (byte125 << 27) | (byte126 << 19) | (byte127 << 11) | (byte128 << 3) | (byte129 >>> 5);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 31) << 40) | (byte130 << 32) | (byte131 << 24) | (byte132 << 16) | (byte133 << 8) | byte134;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte135 << 37) | (byte136 << 29) | (byte137 << 21) | (byte138 << 13) | (byte139 << 5) | (byte140 >>> 3);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 7) << 42) | (byte141 << 34) | (byte142 << 26) | (byte143 << 18) | (byte144 << 10) | (byte145 << 2) | (byte146 >>> 6);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 63) << 39) | (byte147 << 31) | (byte148 << 23) | (byte149 << 15) | (byte150 << 7) | (byte151 >>> 1);
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 1) << 44) | (byte152 << 36) | (byte153 << 28) | (byte154 << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 41) | (byte158 << 33) | (byte159 << 25) | (byte160 << 17) | (byte161 << 9) | (byte162 << 1) | (byte163 >>> 7);
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 127) << 38) | (byte164 << 30) | (byte165 << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 43) | (byte169 << 35) | (byte170 << 27) | (byte171 << 19) | (byte172 << 11) | (byte173 << 3) | (byte174 >>> 5);
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte174 & 31) << 40) | (byte175 << 32) | (byte176 << 24) | (byte177 << 16) | (byte178 << 8) | byte179;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte180 << 37) | (byte181 << 29) | (byte182 << 21) | (byte183 << 13) | (byte184 << 5) | (byte185 >>> 3);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 7) << 42) | (byte186 << 34) | (byte187 << 26) | (byte188 << 18) | (byte189 << 10) | (byte190 << 2) | (byte191 >>> 6);
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte191 & 63) << 39) | (byte192 << 31) | (byte193 << 23) | (byte194 << 15) | (byte195 << 7) | (byte196 >>> 1);
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte196 & 1) << 44) | (byte197 << 36) | (byte198 << 28) | (byte199 << 20) | (byte200 << 12) | (byte201 << 4) | (byte202 >>> 4);
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 15) << 41) | (byte203 << 33) | (byte204 << 25) | (byte205 << 17) | (byte206 << 9) | (byte207 << 1) | (byte208 >>> 7);
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte208 & 127) << 38) | (byte209 << 30) | (byte210 << 22) | (byte211 << 14) | (byte212 << 6) | (byte213 >>> 2);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 3) << 43) | (byte214 << 35) | (byte215 << 27) | (byte216 << 19) | (byte217 << 11) | (byte218 << 3) | (byte219 >>> 5);
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte219 & 31) << 40) | (byte220 << 32) | (byte221 << 24) | (byte222 << 16) | (byte223 << 8) | byte224;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte225 << 37) | (byte226 << 29) | (byte227 << 21) | (byte228 << 13) | (byte229 << 5) | (byte230 >>> 3);
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte230 & 7) << 42) | (byte231 << 34) | (byte232 << 26) | (byte233 << 18) | (byte234 << 10) | (byte235 << 2) | (byte236 >>> 6);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 63) << 39) | (byte237 << 31) | (byte238 << 23) | (byte239 << 15) | (byte240 << 7) | (byte241 >>> 1);
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte241 & 1) << 44) | (byte242 << 36) | (byte243 << 28) | (byte244 << 20) | (byte245 << 12) | (byte246 << 4) | (byte247 >>> 4);
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte247 & 15) << 41) | (byte248 << 33) | (byte249 << 25) | (byte250 << 17) | (byte251 << 9) | (byte252 << 1) | (byte253 >>> 7);
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte253 & 127) << 38) | (byte254 << 30) | (byte255 << 22) | (byte256 << 14) | (byte257 << 6) | (byte258 >>> 2);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 3) << 43) | (byte259 << 35) | (byte260 << 27) | (byte261 << 19) | (byte262 << 11) | (byte263 << 3) | (byte264 >>> 5);
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte264 & 31) << 40) | (byte265 << 32) | (byte266 << 24) | (byte267 << 16) | (byte268 << 8) | byte269;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte270 << 37) | (byte271 << 29) | (byte272 << 21) | (byte273 << 13) | (byte274 << 5) | (byte275 >>> 3);
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte275 & 7) << 42) | (byte276 << 34) | (byte277 << 26) | (byte278 << 18) | (byte279 << 10) | (byte280 << 2) | (byte281 >>> 6);
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte281 & 63) << 39) | (byte282 << 31) | (byte283 << 23) | (byte284 << 15) | (byte285 << 7) | (byte286 >>> 1);
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte286 & 1) << 44) | (byte287 << 36) | (byte288 << 28) | (byte289 << 20) | (byte290 << 12) | (byte291 << 4) | (byte292 >>> 4);
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte292 & 15) << 41) | (byte293 << 33) | (byte294 << 25) | (byte295 << 17) | (byte296 << 9) | (byte297 << 1) | (byte298 >>> 7);
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte298 & 127) << 38) | (byte299 << 30) | (byte300 << 22) | (byte301 << 14) | (byte302 << 6) | (byte303 >>> 2);
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte303 & 3) << 43) | (byte304 << 35) | (byte305 << 27) | (byte306 << 19) | (byte307 << 11) | (byte308 << 3) | (byte309 >>> 5);
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte309 & 31) << 40) | (byte310 << 32) | (byte311 << 24) | (byte312 << 16) | (byte313 << 8) | byte314;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte315 << 37) | (byte316 << 29) | (byte317 << 21) | (byte318 << 13) | (byte319 << 5) | (byte320 >>> 3);
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte320 & 7) << 42) | (byte321 << 34) | (byte322 << 26) | (byte323 << 18) | (byte324 << 10) | (byte325 << 2) | (byte326 >>> 6);
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte326 & 63) << 39) | (byte327 << 31) | (byte328 << 23) | (byte329 << 15) | (byte330 << 7) | (byte331 >>> 1);
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte331 & 1) << 44) | (byte332 << 36) | (byte333 << 28) | (byte334 << 20) | (byte335 << 12) | (byte336 << 4) | (byte337 >>> 4);
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte337 & 15) << 41) | (byte338 << 33) | (byte339 << 25) | (byte340 << 17) | (byte341 << 9) | (byte342 << 1) | (byte343 >>> 7);
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte343 & 127) << 38) | (byte344 << 30) | (byte345 << 22) | (byte346 << 14) | (byte347 << 6) | (byte348 >>> 2);
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte348 & 3) << 43) | (byte349 << 35) | (byte350 << 27) | (byte351 << 19) | (byte352 << 11) | (byte353 << 3) | (byte354 >>> 5);
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte354 & 31) << 40) | (byte355 << 32) | (byte356 << 24) | (byte357 << 16) | (byte358 << 8) | byte359;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation46 extends BulkOperation {
+ }
+ ,
+ PACKED_46 {
- public int blocks() {
+ public int blockCount() {
return 23;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 18;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 262143L) << 28) | (block1 >>> 36);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 68719476735L) << 10) | (block2 >>> 54);
- values[vi++] = (block2 >>> 8) & 70368744177663L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 255L) << 38) | (block3 >>> 26);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 67108863L) << 20) | (block4 >>> 44);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 17592186044415L) << 2) | (block5 >>> 62);
- values[vi++] = (block5 >>> 16) & 70368744177663L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 65535L) << 30) | (block6 >>> 34);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 17179869183L) << 12) | (block7 >>> 52);
- values[vi++] = (block7 >>> 6) & 70368744177663L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 63L) << 40) | (block8 >>> 24);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 16777215L) << 22) | (block9 >>> 42);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 4398046511103L) << 4) | (block10 >>> 60);
- values[vi++] = (block10 >>> 14) & 70368744177663L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 16383L) << 32) | (block11 >>> 32);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4294967295L) << 14) | (block12 >>> 50);
- values[vi++] = (block12 >>> 4) & 70368744177663L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 15L) << 42) | (block13 >>> 22);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4194303L) << 24) | (block14 >>> 40);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1099511627775L) << 6) | (block15 >>> 58);
- values[vi++] = (block15 >>> 12) & 70368744177663L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 4095L) << 34) | (block16 >>> 30);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 1073741823L) << 16) | (block17 >>> 48);
- values[vi++] = (block17 >>> 2) & 70368744177663L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 3L) << 44) | (block18 >>> 20);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1048575L) << 26) | (block19 >>> 38);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 274877906943L) << 8) | (block20 >>> 56);
- values[vi++] = (block20 >>> 10) & 70368744177663L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 1023L) << 36) | (block21 >>> 28);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 268435455L) << 18) | (block22 >>> 46);
- values[vi++] = block22 & 70368744177663L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 8) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 16) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 6) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 14) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 4) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 12) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 2) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 10) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 18;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 262143L) << 28) | (block1 >>> 36);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 68719476735L) << 10) | (block2 >>> 54);
+ values[valuesOffset++] = (block2 >>> 8) & 70368744177663L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 255L) << 38) | (block3 >>> 26);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 67108863L) << 20) | (block4 >>> 44);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 17592186044415L) << 2) | (block5 >>> 62);
+ values[valuesOffset++] = (block5 >>> 16) & 70368744177663L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 65535L) << 30) | (block6 >>> 34);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 17179869183L) << 12) | (block7 >>> 52);
+ values[valuesOffset++] = (block7 >>> 6) & 70368744177663L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 63L) << 40) | (block8 >>> 24);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 16777215L) << 22) | (block9 >>> 42);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 4398046511103L) << 4) | (block10 >>> 60);
+ values[valuesOffset++] = (block10 >>> 14) & 70368744177663L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 16383L) << 32) | (block11 >>> 32);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4294967295L) << 14) | (block12 >>> 50);
+ values[valuesOffset++] = (block12 >>> 4) & 70368744177663L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 15L) << 42) | (block13 >>> 22);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4194303L) << 24) | (block14 >>> 40);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1099511627775L) << 6) | (block15 >>> 58);
+ values[valuesOffset++] = (block15 >>> 12) & 70368744177663L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 4095L) << 34) | (block16 >>> 30);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 1073741823L) << 16) | (block17 >>> 48);
+ values[valuesOffset++] = (block17 >>> 2) & 70368744177663L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 3L) << 44) | (block18 >>> 20);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1048575L) << 26) | (block19 >>> 38);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 274877906943L) << 8) | (block20 >>> 56);
+ values[valuesOffset++] = (block20 >>> 10) & 70368744177663L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 1023L) << 36) | (block21 >>> 28);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 268435455L) << 18) | (block22 >>> 46);
+ values[valuesOffset++] = block22 & 70368744177663L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 38) | (byte1 << 30) | (byte2 << 22) | (byte3 << 14) | (byte4 << 6) | (byte5 >>> 2);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 3) << 44) | (byte6 << 36) | (byte7 << 28) | (byte8 << 20) | (byte9 << 12) | (byte10 << 4) | (byte11 >>> 4);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 15) << 42) | (byte12 << 34) | (byte13 << 26) | (byte14 << 18) | (byte15 << 10) | (byte16 << 2) | (byte17 >>> 6);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 63) << 40) | (byte18 << 32) | (byte19 << 24) | (byte20 << 16) | (byte21 << 8) | byte22;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte23 << 38) | (byte24 << 30) | (byte25 << 22) | (byte26 << 14) | (byte27 << 6) | (byte28 >>> 2);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 3) << 44) | (byte29 << 36) | (byte30 << 28) | (byte31 << 20) | (byte32 << 12) | (byte33 << 4) | (byte34 >>> 4);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 15) << 42) | (byte35 << 34) | (byte36 << 26) | (byte37 << 18) | (byte38 << 10) | (byte39 << 2) | (byte40 >>> 6);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 63) << 40) | (byte41 << 32) | (byte42 << 24) | (byte43 << 16) | (byte44 << 8) | byte45;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte46 << 38) | (byte47 << 30) | (byte48 << 22) | (byte49 << 14) | (byte50 << 6) | (byte51 >>> 2);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 3) << 44) | (byte52 << 36) | (byte53 << 28) | (byte54 << 20) | (byte55 << 12) | (byte56 << 4) | (byte57 >>> 4);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 15) << 42) | (byte58 << 34) | (byte59 << 26) | (byte60 << 18) | (byte61 << 10) | (byte62 << 2) | (byte63 >>> 6);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 63) << 40) | (byte64 << 32) | (byte65 << 24) | (byte66 << 16) | (byte67 << 8) | byte68;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte69 << 38) | (byte70 << 30) | (byte71 << 22) | (byte72 << 14) | (byte73 << 6) | (byte74 >>> 2);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 3) << 44) | (byte75 << 36) | (byte76 << 28) | (byte77 << 20) | (byte78 << 12) | (byte79 << 4) | (byte80 >>> 4);
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte80 & 15) << 42) | (byte81 << 34) | (byte82 << 26) | (byte83 << 18) | (byte84 << 10) | (byte85 << 2) | (byte86 >>> 6);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 63) << 40) | (byte87 << 32) | (byte88 << 24) | (byte89 << 16) | (byte90 << 8) | byte91;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte92 << 38) | (byte93 << 30) | (byte94 << 22) | (byte95 << 14) | (byte96 << 6) | (byte97 >>> 2);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 3) << 44) | (byte98 << 36) | (byte99 << 28) | (byte100 << 20) | (byte101 << 12) | (byte102 << 4) | (byte103 >>> 4);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 15) << 42) | (byte104 << 34) | (byte105 << 26) | (byte106 << 18) | (byte107 << 10) | (byte108 << 2) | (byte109 >>> 6);
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte109 & 63) << 40) | (byte110 << 32) | (byte111 << 24) | (byte112 << 16) | (byte113 << 8) | byte114;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte115 << 38) | (byte116 << 30) | (byte117 << 22) | (byte118 << 14) | (byte119 << 6) | (byte120 >>> 2);
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte120 & 3) << 44) | (byte121 << 36) | (byte122 << 28) | (byte123 << 20) | (byte124 << 12) | (byte125 << 4) | (byte126 >>> 4);
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte126 & 15) << 42) | (byte127 << 34) | (byte128 << 26) | (byte129 << 18) | (byte130 << 10) | (byte131 << 2) | (byte132 >>> 6);
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte132 & 63) << 40) | (byte133 << 32) | (byte134 << 24) | (byte135 << 16) | (byte136 << 8) | byte137;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte138 << 38) | (byte139 << 30) | (byte140 << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 44) | (byte144 << 36) | (byte145 << 28) | (byte146 << 20) | (byte147 << 12) | (byte148 << 4) | (byte149 >>> 4);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 15) << 42) | (byte150 << 34) | (byte151 << 26) | (byte152 << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 40) | (byte156 << 32) | (byte157 << 24) | (byte158 << 16) | (byte159 << 8) | byte160;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte161 << 38) | (byte162 << 30) | (byte163 << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 44) | (byte167 << 36) | (byte168 << 28) | (byte169 << 20) | (byte170 << 12) | (byte171 << 4) | (byte172 >>> 4);
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 15) << 42) | (byte173 << 34) | (byte174 << 26) | (byte175 << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 40) | (byte179 << 32) | (byte180 << 24) | (byte181 << 16) | (byte182 << 8) | byte183;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation47 extends BulkOperation {
+ }
+ ,
+ PACKED_47 {
- public int blocks() {
+ public int blockCount() {
return 47;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 17;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 131071L) << 30) | (block1 >>> 34);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 17179869183L) << 13) | (block2 >>> 51);
- values[vi++] = (block2 >>> 4) & 140737488355327L;
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 15L) << 43) | (block3 >>> 21);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 2097151L) << 26) | (block4 >>> 38);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 274877906943L) << 9) | (block5 >>> 55);
- values[vi++] = (block5 >>> 8) & 140737488355327L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 255L) << 39) | (block6 >>> 25);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 33554431L) << 22) | (block7 >>> 42);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4398046511103L) << 5) | (block8 >>> 59);
- values[vi++] = (block8 >>> 12) & 140737488355327L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 4095L) << 35) | (block9 >>> 29);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 536870911L) << 18) | (block10 >>> 46);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 70368744177663L) << 1) | (block11 >>> 63);
- values[vi++] = (block11 >>> 16) & 140737488355327L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 65535L) << 31) | (block12 >>> 33);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 8589934591L) << 14) | (block13 >>> 50);
- values[vi++] = (block13 >>> 3) & 140737488355327L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 7L) << 44) | (block14 >>> 20);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1048575L) << 27) | (block15 >>> 37);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 137438953471L) << 10) | (block16 >>> 54);
- values[vi++] = (block16 >>> 7) & 140737488355327L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 127L) << 40) | (block17 >>> 24);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 16777215L) << 23) | (block18 >>> 41);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 2199023255551L) << 6) | (block19 >>> 58);
- values[vi++] = (block19 >>> 11) & 140737488355327L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 2047L) << 36) | (block20 >>> 28);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 268435455L) << 19) | (block21 >>> 45);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 35184372088831L) << 2) | (block22 >>> 62);
- values[vi++] = (block22 >>> 15) & 140737488355327L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 32767L) << 32) | (block23 >>> 32);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 4294967295L) << 15) | (block24 >>> 49);
- values[vi++] = (block24 >>> 2) & 140737488355327L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 3L) << 45) | (block25 >>> 19);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 524287L) << 28) | (block26 >>> 36);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 68719476735L) << 11) | (block27 >>> 53);
- values[vi++] = (block27 >>> 6) & 140737488355327L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 63L) << 41) | (block28 >>> 23);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 8388607L) << 24) | (block29 >>> 40);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1099511627775L) << 7) | (block30 >>> 57);
- values[vi++] = (block30 >>> 10) & 140737488355327L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 1023L) << 37) | (block31 >>> 27);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 134217727L) << 20) | (block32 >>> 44);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 17592186044415L) << 3) | (block33 >>> 61);
- values[vi++] = (block33 >>> 14) & 140737488355327L;
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 16383L) << 33) | (block34 >>> 31);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 2147483647L) << 16) | (block35 >>> 48);
- values[vi++] = (block35 >>> 1) & 140737488355327L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 1L) << 46) | (block36 >>> 18);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 262143L) << 29) | (block37 >>> 35);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 34359738367L) << 12) | (block38 >>> 52);
- values[vi++] = (block38 >>> 5) & 140737488355327L;
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 31L) << 42) | (block39 >>> 22);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 4194303L) << 25) | (block40 >>> 39);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 549755813887L) << 8) | (block41 >>> 56);
- values[vi++] = (block41 >>> 9) & 140737488355327L;
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 511L) << 38) | (block42 >>> 26);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 67108863L) << 21) | (block43 >>> 43);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 8796093022207L) << 4) | (block44 >>> 60);
- values[vi++] = (block44 >>> 13) & 140737488355327L;
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 8191L) << 34) | (block45 >>> 30);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 1073741823L) << 17) | (block46 >>> 47);
- values[vi++] = block46 & 140737488355327L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 4) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 8) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 12) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 16) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 3) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 7) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 11) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 15) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi++] << 2) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 6) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 10) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 14) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi++] << 1) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 5) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 9) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 13) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 17;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 131071L) << 30) | (block1 >>> 34);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 17179869183L) << 13) | (block2 >>> 51);
+ values[valuesOffset++] = (block2 >>> 4) & 140737488355327L;
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 15L) << 43) | (block3 >>> 21);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 2097151L) << 26) | (block4 >>> 38);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 274877906943L) << 9) | (block5 >>> 55);
+ values[valuesOffset++] = (block5 >>> 8) & 140737488355327L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 255L) << 39) | (block6 >>> 25);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 33554431L) << 22) | (block7 >>> 42);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4398046511103L) << 5) | (block8 >>> 59);
+ values[valuesOffset++] = (block8 >>> 12) & 140737488355327L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 4095L) << 35) | (block9 >>> 29);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 536870911L) << 18) | (block10 >>> 46);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 70368744177663L) << 1) | (block11 >>> 63);
+ values[valuesOffset++] = (block11 >>> 16) & 140737488355327L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 65535L) << 31) | (block12 >>> 33);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 8589934591L) << 14) | (block13 >>> 50);
+ values[valuesOffset++] = (block13 >>> 3) & 140737488355327L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 7L) << 44) | (block14 >>> 20);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1048575L) << 27) | (block15 >>> 37);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 137438953471L) << 10) | (block16 >>> 54);
+ values[valuesOffset++] = (block16 >>> 7) & 140737488355327L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 127L) << 40) | (block17 >>> 24);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 16777215L) << 23) | (block18 >>> 41);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 2199023255551L) << 6) | (block19 >>> 58);
+ values[valuesOffset++] = (block19 >>> 11) & 140737488355327L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 2047L) << 36) | (block20 >>> 28);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 268435455L) << 19) | (block21 >>> 45);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 35184372088831L) << 2) | (block22 >>> 62);
+ values[valuesOffset++] = (block22 >>> 15) & 140737488355327L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 32767L) << 32) | (block23 >>> 32);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 4294967295L) << 15) | (block24 >>> 49);
+ values[valuesOffset++] = (block24 >>> 2) & 140737488355327L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 3L) << 45) | (block25 >>> 19);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 524287L) << 28) | (block26 >>> 36);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 68719476735L) << 11) | (block27 >>> 53);
+ values[valuesOffset++] = (block27 >>> 6) & 140737488355327L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 63L) << 41) | (block28 >>> 23);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 8388607L) << 24) | (block29 >>> 40);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1099511627775L) << 7) | (block30 >>> 57);
+ values[valuesOffset++] = (block30 >>> 10) & 140737488355327L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 1023L) << 37) | (block31 >>> 27);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 134217727L) << 20) | (block32 >>> 44);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 17592186044415L) << 3) | (block33 >>> 61);
+ values[valuesOffset++] = (block33 >>> 14) & 140737488355327L;
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 16383L) << 33) | (block34 >>> 31);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 2147483647L) << 16) | (block35 >>> 48);
+ values[valuesOffset++] = (block35 >>> 1) & 140737488355327L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 1L) << 46) | (block36 >>> 18);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 262143L) << 29) | (block37 >>> 35);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 34359738367L) << 12) | (block38 >>> 52);
+ values[valuesOffset++] = (block38 >>> 5) & 140737488355327L;
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 31L) << 42) | (block39 >>> 22);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 4194303L) << 25) | (block40 >>> 39);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 549755813887L) << 8) | (block41 >>> 56);
+ values[valuesOffset++] = (block41 >>> 9) & 140737488355327L;
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 511L) << 38) | (block42 >>> 26);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 67108863L) << 21) | (block43 >>> 43);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 8796093022207L) << 4) | (block44 >>> 60);
+ values[valuesOffset++] = (block44 >>> 13) & 140737488355327L;
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 8191L) << 34) | (block45 >>> 30);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 1073741823L) << 17) | (block46 >>> 47);
+ values[valuesOffset++] = block46 & 140737488355327L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 39) | (byte1 << 31) | (byte2 << 23) | (byte3 << 15) | (byte4 << 7) | (byte5 >>> 1);
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte5 & 1) << 46) | (byte6 << 38) | (byte7 << 30) | (byte8 << 22) | (byte9 << 14) | (byte10 << 6) | (byte11 >>> 2);
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte11 & 3) << 45) | (byte12 << 37) | (byte13 << 29) | (byte14 << 21) | (byte15 << 13) | (byte16 << 5) | (byte17 >>> 3);
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte17 & 7) << 44) | (byte18 << 36) | (byte19 << 28) | (byte20 << 20) | (byte21 << 12) | (byte22 << 4) | (byte23 >>> 4);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 15) << 43) | (byte24 << 35) | (byte25 << 27) | (byte26 << 19) | (byte27 << 11) | (byte28 << 3) | (byte29 >>> 5);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 31) << 42) | (byte30 << 34) | (byte31 << 26) | (byte32 << 18) | (byte33 << 10) | (byte34 << 2) | (byte35 >>> 6);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 63) << 41) | (byte36 << 33) | (byte37 << 25) | (byte38 << 17) | (byte39 << 9) | (byte40 << 1) | (byte41 >>> 7);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 127) << 40) | (byte42 << 32) | (byte43 << 24) | (byte44 << 16) | (byte45 << 8) | byte46;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte47 << 39) | (byte48 << 31) | (byte49 << 23) | (byte50 << 15) | (byte51 << 7) | (byte52 >>> 1);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 1) << 46) | (byte53 << 38) | (byte54 << 30) | (byte55 << 22) | (byte56 << 14) | (byte57 << 6) | (byte58 >>> 2);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 3) << 45) | (byte59 << 37) | (byte60 << 29) | (byte61 << 21) | (byte62 << 13) | (byte63 << 5) | (byte64 >>> 3);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 7) << 44) | (byte65 << 36) | (byte66 << 28) | (byte67 << 20) | (byte68 << 12) | (byte69 << 4) | (byte70 >>> 4);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 15) << 43) | (byte71 << 35) | (byte72 << 27) | (byte73 << 19) | (byte74 << 11) | (byte75 << 3) | (byte76 >>> 5);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 31) << 42) | (byte77 << 34) | (byte78 << 26) | (byte79 << 18) | (byte80 << 10) | (byte81 << 2) | (byte82 >>> 6);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 63) << 41) | (byte83 << 33) | (byte84 << 25) | (byte85 << 17) | (byte86 << 9) | (byte87 << 1) | (byte88 >>> 7);
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte88 & 127) << 40) | (byte89 << 32) | (byte90 << 24) | (byte91 << 16) | (byte92 << 8) | byte93;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte94 << 39) | (byte95 << 31) | (byte96 << 23) | (byte97 << 15) | (byte98 << 7) | (byte99 >>> 1);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 1) << 46) | (byte100 << 38) | (byte101 << 30) | (byte102 << 22) | (byte103 << 14) | (byte104 << 6) | (byte105 >>> 2);
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte105 & 3) << 45) | (byte106 << 37) | (byte107 << 29) | (byte108 << 21) | (byte109 << 13) | (byte110 << 5) | (byte111 >>> 3);
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte111 & 7) << 44) | (byte112 << 36) | (byte113 << 28) | (byte114 << 20) | (byte115 << 12) | (byte116 << 4) | (byte117 >>> 4);
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte117 & 15) << 43) | (byte118 << 35) | (byte119 << 27) | (byte120 << 19) | (byte121 << 11) | (byte122 << 3) | (byte123 >>> 5);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 31) << 42) | (byte124 << 34) | (byte125 << 26) | (byte126 << 18) | (byte127 << 10) | (byte128 << 2) | (byte129 >>> 6);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 63) << 41) | (byte130 << 33) | (byte131 << 25) | (byte132 << 17) | (byte133 << 9) | (byte134 << 1) | (byte135 >>> 7);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 127) << 40) | (byte136 << 32) | (byte137 << 24) | (byte138 << 16) | (byte139 << 8) | byte140;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte141 << 39) | (byte142 << 31) | (byte143 << 23) | (byte144 << 15) | (byte145 << 7) | (byte146 >>> 1);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 1) << 46) | (byte147 << 38) | (byte148 << 30) | (byte149 << 22) | (byte150 << 14) | (byte151 << 6) | (byte152 >>> 2);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 3) << 45) | (byte153 << 37) | (byte154 << 29) | (byte155 << 21) | (byte156 << 13) | (byte157 << 5) | (byte158 >>> 3);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 7) << 44) | (byte159 << 36) | (byte160 << 28) | (byte161 << 20) | (byte162 << 12) | (byte163 << 4) | (byte164 >>> 4);
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte164 & 15) << 43) | (byte165 << 35) | (byte166 << 27) | (byte167 << 19) | (byte168 << 11) | (byte169 << 3) | (byte170 >>> 5);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 31) << 42) | (byte171 << 34) | (byte172 << 26) | (byte173 << 18) | (byte174 << 10) | (byte175 << 2) | (byte176 >>> 6);
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte176 & 63) << 41) | (byte177 << 33) | (byte178 << 25) | (byte179 << 17) | (byte180 << 9) | (byte181 << 1) | (byte182 >>> 7);
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 127) << 40) | (byte183 << 32) | (byte184 << 24) | (byte185 << 16) | (byte186 << 8) | byte187;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte188 << 39) | (byte189 << 31) | (byte190 << 23) | (byte191 << 15) | (byte192 << 7) | (byte193 >>> 1);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 1) << 46) | (byte194 << 38) | (byte195 << 30) | (byte196 << 22) | (byte197 << 14) | (byte198 << 6) | (byte199 >>> 2);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 3) << 45) | (byte200 << 37) | (byte201 << 29) | (byte202 << 21) | (byte203 << 13) | (byte204 << 5) | (byte205 >>> 3);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 7) << 44) | (byte206 << 36) | (byte207 << 28) | (byte208 << 20) | (byte209 << 12) | (byte210 << 4) | (byte211 >>> 4);
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte211 & 15) << 43) | (byte212 << 35) | (byte213 << 27) | (byte214 << 19) | (byte215 << 11) | (byte216 << 3) | (byte217 >>> 5);
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte217 & 31) << 42) | (byte218 << 34) | (byte219 << 26) | (byte220 << 18) | (byte221 << 10) | (byte222 << 2) | (byte223 >>> 6);
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte223 & 63) << 41) | (byte224 << 33) | (byte225 << 25) | (byte226 << 17) | (byte227 << 9) | (byte228 << 1) | (byte229 >>> 7);
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte229 & 127) << 40) | (byte230 << 32) | (byte231 << 24) | (byte232 << 16) | (byte233 << 8) | byte234;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte235 << 39) | (byte236 << 31) | (byte237 << 23) | (byte238 << 15) | (byte239 << 7) | (byte240 >>> 1);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 1) << 46) | (byte241 << 38) | (byte242 << 30) | (byte243 << 22) | (byte244 << 14) | (byte245 << 6) | (byte246 >>> 2);
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte246 & 3) << 45) | (byte247 << 37) | (byte248 << 29) | (byte249 << 21) | (byte250 << 13) | (byte251 << 5) | (byte252 >>> 3);
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte252 & 7) << 44) | (byte253 << 36) | (byte254 << 28) | (byte255 << 20) | (byte256 << 12) | (byte257 << 4) | (byte258 >>> 4);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 15) << 43) | (byte259 << 35) | (byte260 << 27) | (byte261 << 19) | (byte262 << 11) | (byte263 << 3) | (byte264 >>> 5);
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte264 & 31) << 42) | (byte265 << 34) | (byte266 << 26) | (byte267 << 18) | (byte268 << 10) | (byte269 << 2) | (byte270 >>> 6);
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte270 & 63) << 41) | (byte271 << 33) | (byte272 << 25) | (byte273 << 17) | (byte274 << 9) | (byte275 << 1) | (byte276 >>> 7);
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte276 & 127) << 40) | (byte277 << 32) | (byte278 << 24) | (byte279 << 16) | (byte280 << 8) | byte281;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte282 << 39) | (byte283 << 31) | (byte284 << 23) | (byte285 << 15) | (byte286 << 7) | (byte287 >>> 1);
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte287 & 1) << 46) | (byte288 << 38) | (byte289 << 30) | (byte290 << 22) | (byte291 << 14) | (byte292 << 6) | (byte293 >>> 2);
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte293 & 3) << 45) | (byte294 << 37) | (byte295 << 29) | (byte296 << 21) | (byte297 << 13) | (byte298 << 5) | (byte299 >>> 3);
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte299 & 7) << 44) | (byte300 << 36) | (byte301 << 28) | (byte302 << 20) | (byte303 << 12) | (byte304 << 4) | (byte305 >>> 4);
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte305 & 15) << 43) | (byte306 << 35) | (byte307 << 27) | (byte308 << 19) | (byte309 << 11) | (byte310 << 3) | (byte311 >>> 5);
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte311 & 31) << 42) | (byte312 << 34) | (byte313 << 26) | (byte314 << 18) | (byte315 << 10) | (byte316 << 2) | (byte317 >>> 6);
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte317 & 63) << 41) | (byte318 << 33) | (byte319 << 25) | (byte320 << 17) | (byte321 << 9) | (byte322 << 1) | (byte323 >>> 7);
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte323 & 127) << 40) | (byte324 << 32) | (byte325 << 24) | (byte326 << 16) | (byte327 << 8) | byte328;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte329 << 39) | (byte330 << 31) | (byte331 << 23) | (byte332 << 15) | (byte333 << 7) | (byte334 >>> 1);
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte334 & 1) << 46) | (byte335 << 38) | (byte336 << 30) | (byte337 << 22) | (byte338 << 14) | (byte339 << 6) | (byte340 >>> 2);
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte340 & 3) << 45) | (byte341 << 37) | (byte342 << 29) | (byte343 << 21) | (byte344 << 13) | (byte345 << 5) | (byte346 >>> 3);
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte346 & 7) << 44) | (byte347 << 36) | (byte348 << 28) | (byte349 << 20) | (byte350 << 12) | (byte351 << 4) | (byte352 >>> 4);
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte352 & 15) << 43) | (byte353 << 35) | (byte354 << 27) | (byte355 << 19) | (byte356 << 11) | (byte357 << 3) | (byte358 >>> 5);
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte358 & 31) << 42) | (byte359 << 34) | (byte360 << 26) | (byte361 << 18) | (byte362 << 10) | (byte363 << 2) | (byte364 >>> 6);
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte364 & 63) << 41) | (byte365 << 33) | (byte366 << 25) | (byte367 << 17) | (byte368 << 9) | (byte369 << 1) | (byte370 >>> 7);
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte370 & 127) << 40) | (byte371 << 32) | (byte372 << 24) | (byte373 << 16) | (byte374 << 8) | byte375;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation48 extends BulkOperation {
+ }
+ ,
+ PACKED_48 {
- public int blocks() {
+ public int blockCount() {
return 3;
}
- public int values() {
+ public int valueCount() {
return 4;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 16;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 65535L) << 32) | (block1 >>> 32);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 4294967295L) << 16) | (block2 >>> 48);
- values[vi++] = block2 & 281474976710655L;
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 16;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 65535L) << 32) | (block1 >>> 32);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 4294967295L) << 16) | (block2 >>> 48);
+ values[valuesOffset++] = block2 & 281474976710655L;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | values[vi++];
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 40) | (byte1 << 32) | (byte2 << 24) | (byte3 << 16) | (byte4 << 8) | byte5;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte6 << 40) | (byte7 << 32) | (byte8 << 24) | (byte9 << 16) | (byte10 << 8) | byte11;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte12 << 40) | (byte13 << 32) | (byte14 << 24) | (byte15 << 16) | (byte16 << 8) | byte17;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte18 << 40) | (byte19 << 32) | (byte20 << 24) | (byte21 << 16) | (byte22 << 8) | byte23;
}
}
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | (values[valuesOffset++] & 0xffffffffL);
+ }
}
- static final class Packed64BulkOperation49 extends BulkOperation {
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | values[valuesOffset++];
+ }
+ }
- public int blocks() {
+ }
+ ,
+ PACKED_49 {
+
+ public int blockCount() {
return 49;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 15;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 32767L) << 34) | (block1 >>> 30);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1073741823L) << 19) | (block2 >>> 45);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 35184372088831L) << 4) | (block3 >>> 60);
- values[vi++] = (block3 >>> 11) & 562949953421311L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 2047L) << 38) | (block4 >>> 26);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 67108863L) << 23) | (block5 >>> 41);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 2199023255551L) << 8) | (block6 >>> 56);
- values[vi++] = (block6 >>> 7) & 562949953421311L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 127L) << 42) | (block7 >>> 22);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4194303L) << 27) | (block8 >>> 37);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 137438953471L) << 12) | (block9 >>> 52);
- values[vi++] = (block9 >>> 3) & 562949953421311L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 7L) << 46) | (block10 >>> 18);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 262143L) << 31) | (block11 >>> 33);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 8589934591L) << 16) | (block12 >>> 48);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 281474976710655L) << 1) | (block13 >>> 63);
- values[vi++] = (block13 >>> 14) & 562949953421311L;
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 16383L) << 35) | (block14 >>> 29);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 536870911L) << 20) | (block15 >>> 44);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 17592186044415L) << 5) | (block16 >>> 59);
- values[vi++] = (block16 >>> 10) & 562949953421311L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 1023L) << 39) | (block17 >>> 25);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 33554431L) << 24) | (block18 >>> 40);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1099511627775L) << 9) | (block19 >>> 55);
- values[vi++] = (block19 >>> 6) & 562949953421311L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 63L) << 43) | (block20 >>> 21);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 2097151L) << 28) | (block21 >>> 36);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 68719476735L) << 13) | (block22 >>> 51);
- values[vi++] = (block22 >>> 2) & 562949953421311L;
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 3L) << 47) | (block23 >>> 17);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 131071L) << 32) | (block24 >>> 32);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 4294967295L) << 17) | (block25 >>> 47);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 140737488355327L) << 2) | (block26 >>> 62);
- values[vi++] = (block26 >>> 13) & 562949953421311L;
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 8191L) << 36) | (block27 >>> 28);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 268435455L) << 21) | (block28 >>> 43);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 8796093022207L) << 6) | (block29 >>> 58);
- values[vi++] = (block29 >>> 9) & 562949953421311L;
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 511L) << 40) | (block30 >>> 24);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 16777215L) << 25) | (block31 >>> 39);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 549755813887L) << 10) | (block32 >>> 54);
- values[vi++] = (block32 >>> 5) & 562949953421311L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 31L) << 44) | (block33 >>> 20);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 1048575L) << 29) | (block34 >>> 35);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 34359738367L) << 14) | (block35 >>> 50);
- values[vi++] = (block35 >>> 1) & 562949953421311L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 1L) << 48) | (block36 >>> 16);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 65535L) << 33) | (block37 >>> 31);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 2147483647L) << 18) | (block38 >>> 46);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 70368744177663L) << 3) | (block39 >>> 61);
- values[vi++] = (block39 >>> 12) & 562949953421311L;
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 4095L) << 37) | (block40 >>> 27);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 134217727L) << 22) | (block41 >>> 42);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 4398046511103L) << 7) | (block42 >>> 57);
- values[vi++] = (block42 >>> 8) & 562949953421311L;
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 255L) << 41) | (block43 >>> 23);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 8388607L) << 26) | (block44 >>> 38);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 274877906943L) << 11) | (block45 >>> 53);
- values[vi++] = (block45 >>> 4) & 562949953421311L;
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 15L) << 45) | (block46 >>> 19);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 524287L) << 30) | (block47 >>> 34);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 17179869183L) << 15) | (block48 >>> 49);
- values[vi++] = block48 & 562949953421311L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 11) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 7) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 3) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 14) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 10) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 6) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi++] << 2) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 13) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 9) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 5) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi++] << 1) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 12) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 8) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 4) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 15;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 32767L) << 34) | (block1 >>> 30);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1073741823L) << 19) | (block2 >>> 45);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 35184372088831L) << 4) | (block3 >>> 60);
+ values[valuesOffset++] = (block3 >>> 11) & 562949953421311L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 2047L) << 38) | (block4 >>> 26);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 67108863L) << 23) | (block5 >>> 41);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 2199023255551L) << 8) | (block6 >>> 56);
+ values[valuesOffset++] = (block6 >>> 7) & 562949953421311L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 127L) << 42) | (block7 >>> 22);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4194303L) << 27) | (block8 >>> 37);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 137438953471L) << 12) | (block9 >>> 52);
+ values[valuesOffset++] = (block9 >>> 3) & 562949953421311L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 7L) << 46) | (block10 >>> 18);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 262143L) << 31) | (block11 >>> 33);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 8589934591L) << 16) | (block12 >>> 48);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 281474976710655L) << 1) | (block13 >>> 63);
+ values[valuesOffset++] = (block13 >>> 14) & 562949953421311L;
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 16383L) << 35) | (block14 >>> 29);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 536870911L) << 20) | (block15 >>> 44);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 17592186044415L) << 5) | (block16 >>> 59);
+ values[valuesOffset++] = (block16 >>> 10) & 562949953421311L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 1023L) << 39) | (block17 >>> 25);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 33554431L) << 24) | (block18 >>> 40);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1099511627775L) << 9) | (block19 >>> 55);
+ values[valuesOffset++] = (block19 >>> 6) & 562949953421311L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 63L) << 43) | (block20 >>> 21);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 2097151L) << 28) | (block21 >>> 36);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 68719476735L) << 13) | (block22 >>> 51);
+ values[valuesOffset++] = (block22 >>> 2) & 562949953421311L;
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 3L) << 47) | (block23 >>> 17);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 131071L) << 32) | (block24 >>> 32);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 4294967295L) << 17) | (block25 >>> 47);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 140737488355327L) << 2) | (block26 >>> 62);
+ values[valuesOffset++] = (block26 >>> 13) & 562949953421311L;
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 8191L) << 36) | (block27 >>> 28);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 268435455L) << 21) | (block28 >>> 43);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 8796093022207L) << 6) | (block29 >>> 58);
+ values[valuesOffset++] = (block29 >>> 9) & 562949953421311L;
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 511L) << 40) | (block30 >>> 24);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 16777215L) << 25) | (block31 >>> 39);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 549755813887L) << 10) | (block32 >>> 54);
+ values[valuesOffset++] = (block32 >>> 5) & 562949953421311L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 31L) << 44) | (block33 >>> 20);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 1048575L) << 29) | (block34 >>> 35);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 34359738367L) << 14) | (block35 >>> 50);
+ values[valuesOffset++] = (block35 >>> 1) & 562949953421311L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 1L) << 48) | (block36 >>> 16);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 65535L) << 33) | (block37 >>> 31);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 2147483647L) << 18) | (block38 >>> 46);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 70368744177663L) << 3) | (block39 >>> 61);
+ values[valuesOffset++] = (block39 >>> 12) & 562949953421311L;
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 4095L) << 37) | (block40 >>> 27);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 134217727L) << 22) | (block41 >>> 42);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 4398046511103L) << 7) | (block42 >>> 57);
+ values[valuesOffset++] = (block42 >>> 8) & 562949953421311L;
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 255L) << 41) | (block43 >>> 23);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 8388607L) << 26) | (block44 >>> 38);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 274877906943L) << 11) | (block45 >>> 53);
+ values[valuesOffset++] = (block45 >>> 4) & 562949953421311L;
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 15L) << 45) | (block46 >>> 19);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 524287L) << 30) | (block47 >>> 34);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 17179869183L) << 15) | (block48 >>> 49);
+ values[valuesOffset++] = block48 & 562949953421311L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 41) | (byte1 << 33) | (byte2 << 25) | (byte3 << 17) | (byte4 << 9) | (byte5 << 1) | (byte6 >>> 7);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 127) << 42) | (byte7 << 34) | (byte8 << 26) | (byte9 << 18) | (byte10 << 10) | (byte11 << 2) | (byte12 >>> 6);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 63) << 43) | (byte13 << 35) | (byte14 << 27) | (byte15 << 19) | (byte16 << 11) | (byte17 << 3) | (byte18 >>> 5);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 31) << 44) | (byte19 << 36) | (byte20 << 28) | (byte21 << 20) | (byte22 << 12) | (byte23 << 4) | (byte24 >>> 4);
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte24 & 15) << 45) | (byte25 << 37) | (byte26 << 29) | (byte27 << 21) | (byte28 << 13) | (byte29 << 5) | (byte30 >>> 3);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 7) << 46) | (byte31 << 38) | (byte32 << 30) | (byte33 << 22) | (byte34 << 14) | (byte35 << 6) | (byte36 >>> 2);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 3) << 47) | (byte37 << 39) | (byte38 << 31) | (byte39 << 23) | (byte40 << 15) | (byte41 << 7) | (byte42 >>> 1);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 1) << 48) | (byte43 << 40) | (byte44 << 32) | (byte45 << 24) | (byte46 << 16) | (byte47 << 8) | byte48;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 41) | (byte50 << 33) | (byte51 << 25) | (byte52 << 17) | (byte53 << 9) | (byte54 << 1) | (byte55 >>> 7);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 42) | (byte56 << 34) | (byte57 << 26) | (byte58 << 18) | (byte59 << 10) | (byte60 << 2) | (byte61 >>> 6);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 63) << 43) | (byte62 << 35) | (byte63 << 27) | (byte64 << 19) | (byte65 << 11) | (byte66 << 3) | (byte67 >>> 5);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 31) << 44) | (byte68 << 36) | (byte69 << 28) | (byte70 << 20) | (byte71 << 12) | (byte72 << 4) | (byte73 >>> 4);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 15) << 45) | (byte74 << 37) | (byte75 << 29) | (byte76 << 21) | (byte77 << 13) | (byte78 << 5) | (byte79 >>> 3);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 7) << 46) | (byte80 << 38) | (byte81 << 30) | (byte82 << 22) | (byte83 << 14) | (byte84 << 6) | (byte85 >>> 2);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 3) << 47) | (byte86 << 39) | (byte87 << 31) | (byte88 << 23) | (byte89 << 15) | (byte90 << 7) | (byte91 >>> 1);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 1) << 48) | (byte92 << 40) | (byte93 << 32) | (byte94 << 24) | (byte95 << 16) | (byte96 << 8) | byte97;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte98 << 41) | (byte99 << 33) | (byte100 << 25) | (byte101 << 17) | (byte102 << 9) | (byte103 << 1) | (byte104 >>> 7);
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte104 & 127) << 42) | (byte105 << 34) | (byte106 << 26) | (byte107 << 18) | (byte108 << 10) | (byte109 << 2) | (byte110 >>> 6);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 63) << 43) | (byte111 << 35) | (byte112 << 27) | (byte113 << 19) | (byte114 << 11) | (byte115 << 3) | (byte116 >>> 5);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 31) << 44) | (byte117 << 36) | (byte118 << 28) | (byte119 << 20) | (byte120 << 12) | (byte121 << 4) | (byte122 >>> 4);
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte122 & 15) << 45) | (byte123 << 37) | (byte124 << 29) | (byte125 << 21) | (byte126 << 13) | (byte127 << 5) | (byte128 >>> 3);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 7) << 46) | (byte129 << 38) | (byte130 << 30) | (byte131 << 22) | (byte132 << 14) | (byte133 << 6) | (byte134 >>> 2);
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte134 & 3) << 47) | (byte135 << 39) | (byte136 << 31) | (byte137 << 23) | (byte138 << 15) | (byte139 << 7) | (byte140 >>> 1);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 1) << 48) | (byte141 << 40) | (byte142 << 32) | (byte143 << 24) | (byte144 << 16) | (byte145 << 8) | byte146;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte147 << 41) | (byte148 << 33) | (byte149 << 25) | (byte150 << 17) | (byte151 << 9) | (byte152 << 1) | (byte153 >>> 7);
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte153 & 127) << 42) | (byte154 << 34) | (byte155 << 26) | (byte156 << 18) | (byte157 << 10) | (byte158 << 2) | (byte159 >>> 6);
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 63) << 43) | (byte160 << 35) | (byte161 << 27) | (byte162 << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 44) | (byte166 << 36) | (byte167 << 28) | (byte168 << 20) | (byte169 << 12) | (byte170 << 4) | (byte171 >>> 4);
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte171 & 15) << 45) | (byte172 << 37) | (byte173 << 29) | (byte174 << 21) | (byte175 << 13) | (byte176 << 5) | (byte177 >>> 3);
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte177 & 7) << 46) | (byte178 << 38) | (byte179 << 30) | (byte180 << 22) | (byte181 << 14) | (byte182 << 6) | (byte183 >>> 2);
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte183 & 3) << 47) | (byte184 << 39) | (byte185 << 31) | (byte186 << 23) | (byte187 << 15) | (byte188 << 7) | (byte189 >>> 1);
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte189 & 1) << 48) | (byte190 << 40) | (byte191 << 32) | (byte192 << 24) | (byte193 << 16) | (byte194 << 8) | byte195;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte196 << 41) | (byte197 << 33) | (byte198 << 25) | (byte199 << 17) | (byte200 << 9) | (byte201 << 1) | (byte202 >>> 7);
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 127) << 42) | (byte203 << 34) | (byte204 << 26) | (byte205 << 18) | (byte206 << 10) | (byte207 << 2) | (byte208 >>> 6);
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte208 & 63) << 43) | (byte209 << 35) | (byte210 << 27) | (byte211 << 19) | (byte212 << 11) | (byte213 << 3) | (byte214 >>> 5);
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte214 & 31) << 44) | (byte215 << 36) | (byte216 << 28) | (byte217 << 20) | (byte218 << 12) | (byte219 << 4) | (byte220 >>> 4);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 15) << 45) | (byte221 << 37) | (byte222 << 29) | (byte223 << 21) | (byte224 << 13) | (byte225 << 5) | (byte226 >>> 3);
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte226 & 7) << 46) | (byte227 << 38) | (byte228 << 30) | (byte229 << 22) | (byte230 << 14) | (byte231 << 6) | (byte232 >>> 2);
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte232 & 3) << 47) | (byte233 << 39) | (byte234 << 31) | (byte235 << 23) | (byte236 << 15) | (byte237 << 7) | (byte238 >>> 1);
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte238 & 1) << 48) | (byte239 << 40) | (byte240 << 32) | (byte241 << 24) | (byte242 << 16) | (byte243 << 8) | byte244;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte245 << 41) | (byte246 << 33) | (byte247 << 25) | (byte248 << 17) | (byte249 << 9) | (byte250 << 1) | (byte251 >>> 7);
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte251 & 127) << 42) | (byte252 << 34) | (byte253 << 26) | (byte254 << 18) | (byte255 << 10) | (byte256 << 2) | (byte257 >>> 6);
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte257 & 63) << 43) | (byte258 << 35) | (byte259 << 27) | (byte260 << 19) | (byte261 << 11) | (byte262 << 3) | (byte263 >>> 5);
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte263 & 31) << 44) | (byte264 << 36) | (byte265 << 28) | (byte266 << 20) | (byte267 << 12) | (byte268 << 4) | (byte269 >>> 4);
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte269 & 15) << 45) | (byte270 << 37) | (byte271 << 29) | (byte272 << 21) | (byte273 << 13) | (byte274 << 5) | (byte275 >>> 3);
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte275 & 7) << 46) | (byte276 << 38) | (byte277 << 30) | (byte278 << 22) | (byte279 << 14) | (byte280 << 6) | (byte281 >>> 2);
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte281 & 3) << 47) | (byte282 << 39) | (byte283 << 31) | (byte284 << 23) | (byte285 << 15) | (byte286 << 7) | (byte287 >>> 1);
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte287 & 1) << 48) | (byte288 << 40) | (byte289 << 32) | (byte290 << 24) | (byte291 << 16) | (byte292 << 8) | byte293;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte294 << 41) | (byte295 << 33) | (byte296 << 25) | (byte297 << 17) | (byte298 << 9) | (byte299 << 1) | (byte300 >>> 7);
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte300 & 127) << 42) | (byte301 << 34) | (byte302 << 26) | (byte303 << 18) | (byte304 << 10) | (byte305 << 2) | (byte306 >>> 6);
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte306 & 63) << 43) | (byte307 << 35) | (byte308 << 27) | (byte309 << 19) | (byte310 << 11) | (byte311 << 3) | (byte312 >>> 5);
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte312 & 31) << 44) | (byte313 << 36) | (byte314 << 28) | (byte315 << 20) | (byte316 << 12) | (byte317 << 4) | (byte318 >>> 4);
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte318 & 15) << 45) | (byte319 << 37) | (byte320 << 29) | (byte321 << 21) | (byte322 << 13) | (byte323 << 5) | (byte324 >>> 3);
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte324 & 7) << 46) | (byte325 << 38) | (byte326 << 30) | (byte327 << 22) | (byte328 << 14) | (byte329 << 6) | (byte330 >>> 2);
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte330 & 3) << 47) | (byte331 << 39) | (byte332 << 31) | (byte333 << 23) | (byte334 << 15) | (byte335 << 7) | (byte336 >>> 1);
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte336 & 1) << 48) | (byte337 << 40) | (byte338 << 32) | (byte339 << 24) | (byte340 << 16) | (byte341 << 8) | byte342;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte343 << 41) | (byte344 << 33) | (byte345 << 25) | (byte346 << 17) | (byte347 << 9) | (byte348 << 1) | (byte349 >>> 7);
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte349 & 127) << 42) | (byte350 << 34) | (byte351 << 26) | (byte352 << 18) | (byte353 << 10) | (byte354 << 2) | (byte355 >>> 6);
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte355 & 63) << 43) | (byte356 << 35) | (byte357 << 27) | (byte358 << 19) | (byte359 << 11) | (byte360 << 3) | (byte361 >>> 5);
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte361 & 31) << 44) | (byte362 << 36) | (byte363 << 28) | (byte364 << 20) | (byte365 << 12) | (byte366 << 4) | (byte367 >>> 4);
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte367 & 15) << 45) | (byte368 << 37) | (byte369 << 29) | (byte370 << 21) | (byte371 << 13) | (byte372 << 5) | (byte373 >>> 3);
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte373 & 7) << 46) | (byte374 << 38) | (byte375 << 30) | (byte376 << 22) | (byte377 << 14) | (byte378 << 6) | (byte379 >>> 2);
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte379 & 3) << 47) | (byte380 << 39) | (byte381 << 31) | (byte382 << 23) | (byte383 << 15) | (byte384 << 7) | (byte385 >>> 1);
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte385 & 1) << 48) | (byte386 << 40) | (byte387 << 32) | (byte388 << 24) | (byte389 << 16) | (byte390 << 8) | byte391;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation50 extends BulkOperation {
+ }
+ ,
+ PACKED_50 {
- public int blocks() {
+ public int blockCount() {
return 25;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 14;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 16383L) << 36) | (block1 >>> 28);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 268435455L) << 22) | (block2 >>> 42);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4398046511103L) << 8) | (block3 >>> 56);
- values[vi++] = (block3 >>> 6) & 1125899906842623L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 63L) << 44) | (block4 >>> 20);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1048575L) << 30) | (block5 >>> 34);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 17179869183L) << 16) | (block6 >>> 48);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 281474976710655L) << 2) | (block7 >>> 62);
- values[vi++] = (block7 >>> 12) & 1125899906842623L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4095L) << 38) | (block8 >>> 26);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 67108863L) << 24) | (block9 >>> 40);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1099511627775L) << 10) | (block10 >>> 54);
- values[vi++] = (block10 >>> 4) & 1125899906842623L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 15L) << 46) | (block11 >>> 18);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 262143L) << 32) | (block12 >>> 32);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4294967295L) << 18) | (block13 >>> 46);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 70368744177663L) << 4) | (block14 >>> 60);
- values[vi++] = (block14 >>> 10) & 1125899906842623L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1023L) << 40) | (block15 >>> 24);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 16777215L) << 26) | (block16 >>> 38);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 274877906943L) << 12) | (block17 >>> 52);
- values[vi++] = (block17 >>> 2) & 1125899906842623L;
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 3L) << 48) | (block18 >>> 16);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 65535L) << 34) | (block19 >>> 30);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1073741823L) << 20) | (block20 >>> 44);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 17592186044415L) << 6) | (block21 >>> 58);
- values[vi++] = (block21 >>> 8) & 1125899906842623L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 255L) << 42) | (block22 >>> 22);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4194303L) << 28) | (block23 >>> 36);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 68719476735L) << 14) | (block24 >>> 50);
- values[vi++] = block24 & 1125899906842623L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 6) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 12) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 4) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 10) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 2) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 8) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 14;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 16383L) << 36) | (block1 >>> 28);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 268435455L) << 22) | (block2 >>> 42);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4398046511103L) << 8) | (block3 >>> 56);
+ values[valuesOffset++] = (block3 >>> 6) & 1125899906842623L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 63L) << 44) | (block4 >>> 20);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1048575L) << 30) | (block5 >>> 34);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 17179869183L) << 16) | (block6 >>> 48);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 281474976710655L) << 2) | (block7 >>> 62);
+ values[valuesOffset++] = (block7 >>> 12) & 1125899906842623L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4095L) << 38) | (block8 >>> 26);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 67108863L) << 24) | (block9 >>> 40);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1099511627775L) << 10) | (block10 >>> 54);
+ values[valuesOffset++] = (block10 >>> 4) & 1125899906842623L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 15L) << 46) | (block11 >>> 18);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 262143L) << 32) | (block12 >>> 32);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4294967295L) << 18) | (block13 >>> 46);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 70368744177663L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = (block14 >>> 10) & 1125899906842623L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1023L) << 40) | (block15 >>> 24);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 16777215L) << 26) | (block16 >>> 38);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 274877906943L) << 12) | (block17 >>> 52);
+ values[valuesOffset++] = (block17 >>> 2) & 1125899906842623L;
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 3L) << 48) | (block18 >>> 16);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 65535L) << 34) | (block19 >>> 30);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1073741823L) << 20) | (block20 >>> 44);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 17592186044415L) << 6) | (block21 >>> 58);
+ values[valuesOffset++] = (block21 >>> 8) & 1125899906842623L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 255L) << 42) | (block22 >>> 22);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4194303L) << 28) | (block23 >>> 36);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 68719476735L) << 14) | (block24 >>> 50);
+ values[valuesOffset++] = block24 & 1125899906842623L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 42) | (byte1 << 34) | (byte2 << 26) | (byte3 << 18) | (byte4 << 10) | (byte5 << 2) | (byte6 >>> 6);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 63) << 44) | (byte7 << 36) | (byte8 << 28) | (byte9 << 20) | (byte10 << 12) | (byte11 << 4) | (byte12 >>> 4);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 15) << 46) | (byte13 << 38) | (byte14 << 30) | (byte15 << 22) | (byte16 << 14) | (byte17 << 6) | (byte18 >>> 2);
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte18 & 3) << 48) | (byte19 << 40) | (byte20 << 32) | (byte21 << 24) | (byte22 << 16) | (byte23 << 8) | byte24;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte25 << 42) | (byte26 << 34) | (byte27 << 26) | (byte28 << 18) | (byte29 << 10) | (byte30 << 2) | (byte31 >>> 6);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 63) << 44) | (byte32 << 36) | (byte33 << 28) | (byte34 << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 46) | (byte38 << 38) | (byte39 << 30) | (byte40 << 22) | (byte41 << 14) | (byte42 << 6) | (byte43 >>> 2);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 3) << 48) | (byte44 << 40) | (byte45 << 32) | (byte46 << 24) | (byte47 << 16) | (byte48 << 8) | byte49;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte50 << 42) | (byte51 << 34) | (byte52 << 26) | (byte53 << 18) | (byte54 << 10) | (byte55 << 2) | (byte56 >>> 6);
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte56 & 63) << 44) | (byte57 << 36) | (byte58 << 28) | (byte59 << 20) | (byte60 << 12) | (byte61 << 4) | (byte62 >>> 4);
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte62 & 15) << 46) | (byte63 << 38) | (byte64 << 30) | (byte65 << 22) | (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 48) | (byte69 << 40) | (byte70 << 32) | (byte71 << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 42) | (byte76 << 34) | (byte77 << 26) | (byte78 << 18) | (byte79 << 10) | (byte80 << 2) | (byte81 >>> 6);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 63) << 44) | (byte82 << 36) | (byte83 << 28) | (byte84 << 20) | (byte85 << 12) | (byte86 << 4) | (byte87 >>> 4);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 15) << 46) | (byte88 << 38) | (byte89 << 30) | (byte90 << 22) | (byte91 << 14) | (byte92 << 6) | (byte93 >>> 2);
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte93 & 3) << 48) | (byte94 << 40) | (byte95 << 32) | (byte96 << 24) | (byte97 << 16) | (byte98 << 8) | byte99;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte100 << 42) | (byte101 << 34) | (byte102 << 26) | (byte103 << 18) | (byte104 << 10) | (byte105 << 2) | (byte106 >>> 6);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 63) << 44) | (byte107 << 36) | (byte108 << 28) | (byte109 << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 46) | (byte113 << 38) | (byte114 << 30) | (byte115 << 22) | (byte116 << 14) | (byte117 << 6) | (byte118 >>> 2);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 3) << 48) | (byte119 << 40) | (byte120 << 32) | (byte121 << 24) | (byte122 << 16) | (byte123 << 8) | byte124;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte125 << 42) | (byte126 << 34) | (byte127 << 26) | (byte128 << 18) | (byte129 << 10) | (byte130 << 2) | (byte131 >>> 6);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 63) << 44) | (byte132 << 36) | (byte133 << 28) | (byte134 << 20) | (byte135 << 12) | (byte136 << 4) | (byte137 >>> 4);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 15) << 46) | (byte138 << 38) | (byte139 << 30) | (byte140 << 22) | (byte141 << 14) | (byte142 << 6) | (byte143 >>> 2);
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte143 & 3) << 48) | (byte144 << 40) | (byte145 << 32) | (byte146 << 24) | (byte147 << 16) | (byte148 << 8) | byte149;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte150 << 42) | (byte151 << 34) | (byte152 << 26) | (byte153 << 18) | (byte154 << 10) | (byte155 << 2) | (byte156 >>> 6);
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte156 & 63) << 44) | (byte157 << 36) | (byte158 << 28) | (byte159 << 20) | (byte160 << 12) | (byte161 << 4) | (byte162 >>> 4);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 15) << 46) | (byte163 << 38) | (byte164 << 30) | (byte165 << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 48) | (byte169 << 40) | (byte170 << 32) | (byte171 << 24) | (byte172 << 16) | (byte173 << 8) | byte174;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte175 << 42) | (byte176 << 34) | (byte177 << 26) | (byte178 << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 44) | (byte182 << 36) | (byte183 << 28) | (byte184 << 20) | (byte185 << 12) | (byte186 << 4) | (byte187 >>> 4);
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte187 & 15) << 46) | (byte188 << 38) | (byte189 << 30) | (byte190 << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 48) | (byte194 << 40) | (byte195 << 32) | (byte196 << 24) | (byte197 << 16) | (byte198 << 8) | byte199;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation51 extends BulkOperation {
+ }
+ ,
+ PACKED_51 {
- public int blocks() {
+ public int blockCount() {
return 51;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 13;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 8191L) << 38) | (block1 >>> 26);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 67108863L) << 25) | (block2 >>> 39);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 549755813887L) << 12) | (block3 >>> 52);
- values[vi++] = (block3 >>> 1) & 2251799813685247L;
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1L) << 50) | (block4 >>> 14);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 16383L) << 37) | (block5 >>> 27);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 134217727L) << 24) | (block6 >>> 40);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 1099511627775L) << 11) | (block7 >>> 53);
- values[vi++] = (block7 >>> 2) & 2251799813685247L;
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 3L) << 49) | (block8 >>> 15);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 32767L) << 36) | (block9 >>> 28);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 268435455L) << 23) | (block10 >>> 41);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 2199023255551L) << 10) | (block11 >>> 54);
- values[vi++] = (block11 >>> 3) & 2251799813685247L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 7L) << 48) | (block12 >>> 16);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 65535L) << 35) | (block13 >>> 29);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 536870911L) << 22) | (block14 >>> 42);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 4398046511103L) << 9) | (block15 >>> 55);
- values[vi++] = (block15 >>> 4) & 2251799813685247L;
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 15L) << 47) | (block16 >>> 17);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 131071L) << 34) | (block17 >>> 30);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 1073741823L) << 21) | (block18 >>> 43);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 8796093022207L) << 8) | (block19 >>> 56);
- values[vi++] = (block19 >>> 5) & 2251799813685247L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 31L) << 46) | (block20 >>> 18);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 262143L) << 33) | (block21 >>> 31);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 2147483647L) << 20) | (block22 >>> 44);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 17592186044415L) << 7) | (block23 >>> 57);
- values[vi++] = (block23 >>> 6) & 2251799813685247L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 63L) << 45) | (block24 >>> 19);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 524287L) << 32) | (block25 >>> 32);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 4294967295L) << 19) | (block26 >>> 45);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 35184372088831L) << 6) | (block27 >>> 58);
- values[vi++] = (block27 >>> 7) & 2251799813685247L;
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 127L) << 44) | (block28 >>> 20);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 1048575L) << 31) | (block29 >>> 33);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 8589934591L) << 18) | (block30 >>> 46);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 70368744177663L) << 5) | (block31 >>> 59);
- values[vi++] = (block31 >>> 8) & 2251799813685247L;
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 255L) << 43) | (block32 >>> 21);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 2097151L) << 30) | (block33 >>> 34);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 17179869183L) << 17) | (block34 >>> 47);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 140737488355327L) << 4) | (block35 >>> 60);
- values[vi++] = (block35 >>> 9) & 2251799813685247L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 511L) << 42) | (block36 >>> 22);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 4194303L) << 29) | (block37 >>> 35);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 34359738367L) << 16) | (block38 >>> 48);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 281474976710655L) << 3) | (block39 >>> 61);
- values[vi++] = (block39 >>> 10) & 2251799813685247L;
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 1023L) << 41) | (block40 >>> 23);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 8388607L) << 28) | (block41 >>> 36);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 68719476735L) << 15) | (block42 >>> 49);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 562949953421311L) << 2) | (block43 >>> 62);
- values[vi++] = (block43 >>> 11) & 2251799813685247L;
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 2047L) << 40) | (block44 >>> 24);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 16777215L) << 27) | (block45 >>> 37);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 137438953471L) << 14) | (block46 >>> 50);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 1125899906842623L) << 1) | (block47 >>> 63);
- values[vi++] = (block47 >>> 12) & 2251799813685247L;
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 4095L) << 39) | (block48 >>> 25);
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 33554431L) << 26) | (block49 >>> 38);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 274877906943L) << 13) | (block50 >>> 51);
- values[vi++] = block50 & 2251799813685247L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi++] << 1) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi++] << 2) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 3) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 4) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 5) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 6) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 7) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 8) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 9) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 10) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 11) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 12) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 13;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 8191L) << 38) | (block1 >>> 26);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 67108863L) << 25) | (block2 >>> 39);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 549755813887L) << 12) | (block3 >>> 52);
+ values[valuesOffset++] = (block3 >>> 1) & 2251799813685247L;
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1L) << 50) | (block4 >>> 14);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 16383L) << 37) | (block5 >>> 27);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 134217727L) << 24) | (block6 >>> 40);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 1099511627775L) << 11) | (block7 >>> 53);
+ values[valuesOffset++] = (block7 >>> 2) & 2251799813685247L;
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 3L) << 49) | (block8 >>> 15);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 32767L) << 36) | (block9 >>> 28);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 268435455L) << 23) | (block10 >>> 41);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 2199023255551L) << 10) | (block11 >>> 54);
+ values[valuesOffset++] = (block11 >>> 3) & 2251799813685247L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 7L) << 48) | (block12 >>> 16);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 65535L) << 35) | (block13 >>> 29);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 536870911L) << 22) | (block14 >>> 42);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 4398046511103L) << 9) | (block15 >>> 55);
+ values[valuesOffset++] = (block15 >>> 4) & 2251799813685247L;
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 15L) << 47) | (block16 >>> 17);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 131071L) << 34) | (block17 >>> 30);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 1073741823L) << 21) | (block18 >>> 43);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 8796093022207L) << 8) | (block19 >>> 56);
+ values[valuesOffset++] = (block19 >>> 5) & 2251799813685247L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 31L) << 46) | (block20 >>> 18);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 262143L) << 33) | (block21 >>> 31);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 2147483647L) << 20) | (block22 >>> 44);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 17592186044415L) << 7) | (block23 >>> 57);
+ values[valuesOffset++] = (block23 >>> 6) & 2251799813685247L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 63L) << 45) | (block24 >>> 19);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 524287L) << 32) | (block25 >>> 32);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 4294967295L) << 19) | (block26 >>> 45);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 35184372088831L) << 6) | (block27 >>> 58);
+ values[valuesOffset++] = (block27 >>> 7) & 2251799813685247L;
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 127L) << 44) | (block28 >>> 20);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 1048575L) << 31) | (block29 >>> 33);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 8589934591L) << 18) | (block30 >>> 46);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 70368744177663L) << 5) | (block31 >>> 59);
+ values[valuesOffset++] = (block31 >>> 8) & 2251799813685247L;
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 255L) << 43) | (block32 >>> 21);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 2097151L) << 30) | (block33 >>> 34);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 17179869183L) << 17) | (block34 >>> 47);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 140737488355327L) << 4) | (block35 >>> 60);
+ values[valuesOffset++] = (block35 >>> 9) & 2251799813685247L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 511L) << 42) | (block36 >>> 22);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 4194303L) << 29) | (block37 >>> 35);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 34359738367L) << 16) | (block38 >>> 48);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 281474976710655L) << 3) | (block39 >>> 61);
+ values[valuesOffset++] = (block39 >>> 10) & 2251799813685247L;
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 1023L) << 41) | (block40 >>> 23);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 8388607L) << 28) | (block41 >>> 36);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 68719476735L) << 15) | (block42 >>> 49);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 562949953421311L) << 2) | (block43 >>> 62);
+ values[valuesOffset++] = (block43 >>> 11) & 2251799813685247L;
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 2047L) << 40) | (block44 >>> 24);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 16777215L) << 27) | (block45 >>> 37);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 137438953471L) << 14) | (block46 >>> 50);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 1125899906842623L) << 1) | (block47 >>> 63);
+ values[valuesOffset++] = (block47 >>> 12) & 2251799813685247L;
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 4095L) << 39) | (block48 >>> 25);
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 33554431L) << 26) | (block49 >>> 38);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 274877906943L) << 13) | (block50 >>> 51);
+ values[valuesOffset++] = block50 & 2251799813685247L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 43) | (byte1 << 35) | (byte2 << 27) | (byte3 << 19) | (byte4 << 11) | (byte5 << 3) | (byte6 >>> 5);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 31) << 46) | (byte7 << 38) | (byte8 << 30) | (byte9 << 22) | (byte10 << 14) | (byte11 << 6) | (byte12 >>> 2);
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte12 & 3) << 49) | (byte13 << 41) | (byte14 << 33) | (byte15 << 25) | (byte16 << 17) | (byte17 << 9) | (byte18 << 1) | (byte19 >>> 7);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 127) << 44) | (byte20 << 36) | (byte21 << 28) | (byte22 << 20) | (byte23 << 12) | (byte24 << 4) | (byte25 >>> 4);
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte25 & 15) << 47) | (byte26 << 39) | (byte27 << 31) | (byte28 << 23) | (byte29 << 15) | (byte30 << 7) | (byte31 >>> 1);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 1) << 50) | (byte32 << 42) | (byte33 << 34) | (byte34 << 26) | (byte35 << 18) | (byte36 << 10) | (byte37 << 2) | (byte38 >>> 6);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 63) << 45) | (byte39 << 37) | (byte40 << 29) | (byte41 << 21) | (byte42 << 13) | (byte43 << 5) | (byte44 >>> 3);
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 7) << 48) | (byte45 << 40) | (byte46 << 32) | (byte47 << 24) | (byte48 << 16) | (byte49 << 8) | byte50;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte51 << 43) | (byte52 << 35) | (byte53 << 27) | (byte54 << 19) | (byte55 << 11) | (byte56 << 3) | (byte57 >>> 5);
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte57 & 31) << 46) | (byte58 << 38) | (byte59 << 30) | (byte60 << 22) | (byte61 << 14) | (byte62 << 6) | (byte63 >>> 2);
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte63 & 3) << 49) | (byte64 << 41) | (byte65 << 33) | (byte66 << 25) | (byte67 << 17) | (byte68 << 9) | (byte69 << 1) | (byte70 >>> 7);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 127) << 44) | (byte71 << 36) | (byte72 << 28) | (byte73 << 20) | (byte74 << 12) | (byte75 << 4) | (byte76 >>> 4);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 15) << 47) | (byte77 << 39) | (byte78 << 31) | (byte79 << 23) | (byte80 << 15) | (byte81 << 7) | (byte82 >>> 1);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 1) << 50) | (byte83 << 42) | (byte84 << 34) | (byte85 << 26) | (byte86 << 18) | (byte87 << 10) | (byte88 << 2) | (byte89 >>> 6);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 63) << 45) | (byte90 << 37) | (byte91 << 29) | (byte92 << 21) | (byte93 << 13) | (byte94 << 5) | (byte95 >>> 3);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 7) << 48) | (byte96 << 40) | (byte97 << 32) | (byte98 << 24) | (byte99 << 16) | (byte100 << 8) | byte101;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte102 << 43) | (byte103 << 35) | (byte104 << 27) | (byte105 << 19) | (byte106 << 11) | (byte107 << 3) | (byte108 >>> 5);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 31) << 46) | (byte109 << 38) | (byte110 << 30) | (byte111 << 22) | (byte112 << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 49) | (byte115 << 41) | (byte116 << 33) | (byte117 << 25) | (byte118 << 17) | (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 44) | (byte122 << 36) | (byte123 << 28) | (byte124 << 20) | (byte125 << 12) | (byte126 << 4) | (byte127 >>> 4);
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte127 & 15) << 47) | (byte128 << 39) | (byte129 << 31) | (byte130 << 23) | (byte131 << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 50) | (byte134 << 42) | (byte135 << 34) | (byte136 << 26) | (byte137 << 18) | (byte138 << 10) | (byte139 << 2) | (byte140 >>> 6);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 63) << 45) | (byte141 << 37) | (byte142 << 29) | (byte143 << 21) | (byte144 << 13) | (byte145 << 5) | (byte146 >>> 3);
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte146 & 7) << 48) | (byte147 << 40) | (byte148 << 32) | (byte149 << 24) | (byte150 << 16) | (byte151 << 8) | byte152;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte153 << 43) | (byte154 << 35) | (byte155 << 27) | (byte156 << 19) | (byte157 << 11) | (byte158 << 3) | (byte159 >>> 5);
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 31) << 46) | (byte160 << 38) | (byte161 << 30) | (byte162 << 22) | (byte163 << 14) | (byte164 << 6) | (byte165 >>> 2);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 3) << 49) | (byte166 << 41) | (byte167 << 33) | (byte168 << 25) | (byte169 << 17) | (byte170 << 9) | (byte171 << 1) | (byte172 >>> 7);
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 127) << 44) | (byte173 << 36) | (byte174 << 28) | (byte175 << 20) | (byte176 << 12) | (byte177 << 4) | (byte178 >>> 4);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 15) << 47) | (byte179 << 39) | (byte180 << 31) | (byte181 << 23) | (byte182 << 15) | (byte183 << 7) | (byte184 >>> 1);
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 1) << 50) | (byte185 << 42) | (byte186 << 34) | (byte187 << 26) | (byte188 << 18) | (byte189 << 10) | (byte190 << 2) | (byte191 >>> 6);
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte191 & 63) << 45) | (byte192 << 37) | (byte193 << 29) | (byte194 << 21) | (byte195 << 13) | (byte196 << 5) | (byte197 >>> 3);
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte197 & 7) << 48) | (byte198 << 40) | (byte199 << 32) | (byte200 << 24) | (byte201 << 16) | (byte202 << 8) | byte203;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte204 << 43) | (byte205 << 35) | (byte206 << 27) | (byte207 << 19) | (byte208 << 11) | (byte209 << 3) | (byte210 >>> 5);
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 31) << 46) | (byte211 << 38) | (byte212 << 30) | (byte213 << 22) | (byte214 << 14) | (byte215 << 6) | (byte216 >>> 2);
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte216 & 3) << 49) | (byte217 << 41) | (byte218 << 33) | (byte219 << 25) | (byte220 << 17) | (byte221 << 9) | (byte222 << 1) | (byte223 >>> 7);
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte223 & 127) << 44) | (byte224 << 36) | (byte225 << 28) | (byte226 << 20) | (byte227 << 12) | (byte228 << 4) | (byte229 >>> 4);
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte229 & 15) << 47) | (byte230 << 39) | (byte231 << 31) | (byte232 << 23) | (byte233 << 15) | (byte234 << 7) | (byte235 >>> 1);
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte235 & 1) << 50) | (byte236 << 42) | (byte237 << 34) | (byte238 << 26) | (byte239 << 18) | (byte240 << 10) | (byte241 << 2) | (byte242 >>> 6);
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte242 & 63) << 45) | (byte243 << 37) | (byte244 << 29) | (byte245 << 21) | (byte246 << 13) | (byte247 << 5) | (byte248 >>> 3);
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte248 & 7) << 48) | (byte249 << 40) | (byte250 << 32) | (byte251 << 24) | (byte252 << 16) | (byte253 << 8) | byte254;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte255 << 43) | (byte256 << 35) | (byte257 << 27) | (byte258 << 19) | (byte259 << 11) | (byte260 << 3) | (byte261 >>> 5);
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte261 & 31) << 46) | (byte262 << 38) | (byte263 << 30) | (byte264 << 22) | (byte265 << 14) | (byte266 << 6) | (byte267 >>> 2);
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte267 & 3) << 49) | (byte268 << 41) | (byte269 << 33) | (byte270 << 25) | (byte271 << 17) | (byte272 << 9) | (byte273 << 1) | (byte274 >>> 7);
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte274 & 127) << 44) | (byte275 << 36) | (byte276 << 28) | (byte277 << 20) | (byte278 << 12) | (byte279 << 4) | (byte280 >>> 4);
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte280 & 15) << 47) | (byte281 << 39) | (byte282 << 31) | (byte283 << 23) | (byte284 << 15) | (byte285 << 7) | (byte286 >>> 1);
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte286 & 1) << 50) | (byte287 << 42) | (byte288 << 34) | (byte289 << 26) | (byte290 << 18) | (byte291 << 10) | (byte292 << 2) | (byte293 >>> 6);
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte293 & 63) << 45) | (byte294 << 37) | (byte295 << 29) | (byte296 << 21) | (byte297 << 13) | (byte298 << 5) | (byte299 >>> 3);
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte299 & 7) << 48) | (byte300 << 40) | (byte301 << 32) | (byte302 << 24) | (byte303 << 16) | (byte304 << 8) | byte305;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte306 << 43) | (byte307 << 35) | (byte308 << 27) | (byte309 << 19) | (byte310 << 11) | (byte311 << 3) | (byte312 >>> 5);
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte312 & 31) << 46) | (byte313 << 38) | (byte314 << 30) | (byte315 << 22) | (byte316 << 14) | (byte317 << 6) | (byte318 >>> 2);
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte318 & 3) << 49) | (byte319 << 41) | (byte320 << 33) | (byte321 << 25) | (byte322 << 17) | (byte323 << 9) | (byte324 << 1) | (byte325 >>> 7);
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte325 & 127) << 44) | (byte326 << 36) | (byte327 << 28) | (byte328 << 20) | (byte329 << 12) | (byte330 << 4) | (byte331 >>> 4);
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte331 & 15) << 47) | (byte332 << 39) | (byte333 << 31) | (byte334 << 23) | (byte335 << 15) | (byte336 << 7) | (byte337 >>> 1);
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte337 & 1) << 50) | (byte338 << 42) | (byte339 << 34) | (byte340 << 26) | (byte341 << 18) | (byte342 << 10) | (byte343 << 2) | (byte344 >>> 6);
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte344 & 63) << 45) | (byte345 << 37) | (byte346 << 29) | (byte347 << 21) | (byte348 << 13) | (byte349 << 5) | (byte350 >>> 3);
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte350 & 7) << 48) | (byte351 << 40) | (byte352 << 32) | (byte353 << 24) | (byte354 << 16) | (byte355 << 8) | byte356;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte357 << 43) | (byte358 << 35) | (byte359 << 27) | (byte360 << 19) | (byte361 << 11) | (byte362 << 3) | (byte363 >>> 5);
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte363 & 31) << 46) | (byte364 << 38) | (byte365 << 30) | (byte366 << 22) | (byte367 << 14) | (byte368 << 6) | (byte369 >>> 2);
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte369 & 3) << 49) | (byte370 << 41) | (byte371 << 33) | (byte372 << 25) | (byte373 << 17) | (byte374 << 9) | (byte375 << 1) | (byte376 >>> 7);
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte376 & 127) << 44) | (byte377 << 36) | (byte378 << 28) | (byte379 << 20) | (byte380 << 12) | (byte381 << 4) | (byte382 >>> 4);
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte382 & 15) << 47) | (byte383 << 39) | (byte384 << 31) | (byte385 << 23) | (byte386 << 15) | (byte387 << 7) | (byte388 >>> 1);
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte388 & 1) << 50) | (byte389 << 42) | (byte390 << 34) | (byte391 << 26) | (byte392 << 18) | (byte393 << 10) | (byte394 << 2) | (byte395 >>> 6);
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte395 & 63) << 45) | (byte396 << 37) | (byte397 << 29) | (byte398 << 21) | (byte399 << 13) | (byte400 << 5) | (byte401 >>> 3);
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte401 & 7) << 48) | (byte402 << 40) | (byte403 << 32) | (byte404 << 24) | (byte405 << 16) | (byte406 << 8) | byte407;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation52 extends BulkOperation {
+ }
+ ,
+ PACKED_52 {
- public int blocks() {
+ public int blockCount() {
return 13;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 12;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 4095L) << 40) | (block1 >>> 24);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 16777215L) << 28) | (block2 >>> 36);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 68719476735L) << 16) | (block3 >>> 48);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 281474976710655L) << 4) | (block4 >>> 60);
- values[vi++] = (block4 >>> 8) & 4503599627370495L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 255L) << 44) | (block5 >>> 20);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1048575L) << 32) | (block6 >>> 32);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 4294967295L) << 20) | (block7 >>> 44);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 17592186044415L) << 8) | (block8 >>> 56);
- values[vi++] = (block8 >>> 4) & 4503599627370495L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 15L) << 48) | (block9 >>> 16);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 65535L) << 36) | (block10 >>> 28);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 268435455L) << 24) | (block11 >>> 40);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 1099511627775L) << 12) | (block12 >>> 52);
- values[vi++] = block12 & 4503599627370495L;
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 8) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 4) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 12;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 4095L) << 40) | (block1 >>> 24);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 16777215L) << 28) | (block2 >>> 36);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 68719476735L) << 16) | (block3 >>> 48);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 281474976710655L) << 4) | (block4 >>> 60);
+ values[valuesOffset++] = (block4 >>> 8) & 4503599627370495L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 255L) << 44) | (block5 >>> 20);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1048575L) << 32) | (block6 >>> 32);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 4294967295L) << 20) | (block7 >>> 44);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 17592186044415L) << 8) | (block8 >>> 56);
+ values[valuesOffset++] = (block8 >>> 4) & 4503599627370495L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 15L) << 48) | (block9 >>> 16);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 65535L) << 36) | (block10 >>> 28);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 268435455L) << 24) | (block11 >>> 40);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 1099511627775L) << 12) | (block12 >>> 52);
+ values[valuesOffset++] = block12 & 4503599627370495L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 44) | (byte1 << 36) | (byte2 << 28) | (byte3 << 20) | (byte4 << 12) | (byte5 << 4) | (byte6 >>> 4);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 15) << 48) | (byte7 << 40) | (byte8 << 32) | (byte9 << 24) | (byte10 << 16) | (byte11 << 8) | byte12;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte13 << 44) | (byte14 << 36) | (byte15 << 28) | (byte16 << 20) | (byte17 << 12) | (byte18 << 4) | (byte19 >>> 4);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 15) << 48) | (byte20 << 40) | (byte21 << 32) | (byte22 << 24) | (byte23 << 16) | (byte24 << 8) | byte25;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte26 << 44) | (byte27 << 36) | (byte28 << 28) | (byte29 << 20) | (byte30 << 12) | (byte31 << 4) | (byte32 >>> 4);
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte32 & 15) << 48) | (byte33 << 40) | (byte34 << 32) | (byte35 << 24) | (byte36 << 16) | (byte37 << 8) | byte38;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte39 << 44) | (byte40 << 36) | (byte41 << 28) | (byte42 << 20) | (byte43 << 12) | (byte44 << 4) | (byte45 >>> 4);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 15) << 48) | (byte46 << 40) | (byte47 << 32) | (byte48 << 24) | (byte49 << 16) | (byte50 << 8) | byte51;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte52 << 44) | (byte53 << 36) | (byte54 << 28) | (byte55 << 20) | (byte56 << 12) | (byte57 << 4) | (byte58 >>> 4);
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte58 & 15) << 48) | (byte59 << 40) | (byte60 << 32) | (byte61 << 24) | (byte62 << 16) | (byte63 << 8) | byte64;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte65 << 44) | (byte66 << 36) | (byte67 << 28) | (byte68 << 20) | (byte69 << 12) | (byte70 << 4) | (byte71 >>> 4);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 15) << 48) | (byte72 << 40) | (byte73 << 32) | (byte74 << 24) | (byte75 << 16) | (byte76 << 8) | byte77;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte78 << 44) | (byte79 << 36) | (byte80 << 28) | (byte81 << 20) | (byte82 << 12) | (byte83 << 4) | (byte84 >>> 4);
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte84 & 15) << 48) | (byte85 << 40) | (byte86 << 32) | (byte87 << 24) | (byte88 << 16) | (byte89 << 8) | byte90;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte91 << 44) | (byte92 << 36) | (byte93 << 28) | (byte94 << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 48) | (byte98 << 40) | (byte99 << 32) | (byte100 << 24) | (byte101 << 16) | (byte102 << 8) | byte103;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation53 extends BulkOperation {
+ }
+ ,
+ PACKED_53 {
- public int blocks() {
+ public int blockCount() {
return 53;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 11;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 2047L) << 42) | (block1 >>> 22);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 4194303L) << 31) | (block2 >>> 33);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 8589934591L) << 20) | (block3 >>> 44);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 17592186044415L) << 9) | (block4 >>> 55);
- values[vi++] = (block4 >>> 2) & 9007199254740991L;
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 3L) << 51) | (block5 >>> 13);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 8191L) << 40) | (block6 >>> 24);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 16777215L) << 29) | (block7 >>> 35);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 34359738367L) << 18) | (block8 >>> 46);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 70368744177663L) << 7) | (block9 >>> 57);
- values[vi++] = (block9 >>> 4) & 9007199254740991L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 15L) << 49) | (block10 >>> 15);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 32767L) << 38) | (block11 >>> 26);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 67108863L) << 27) | (block12 >>> 37);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 137438953471L) << 16) | (block13 >>> 48);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 281474976710655L) << 5) | (block14 >>> 59);
- values[vi++] = (block14 >>> 6) & 9007199254740991L;
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 63L) << 47) | (block15 >>> 17);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 131071L) << 36) | (block16 >>> 28);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 268435455L) << 25) | (block17 >>> 39);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 549755813887L) << 14) | (block18 >>> 50);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 1125899906842623L) << 3) | (block19 >>> 61);
- values[vi++] = (block19 >>> 8) & 9007199254740991L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 255L) << 45) | (block20 >>> 19);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 524287L) << 34) | (block21 >>> 30);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 1073741823L) << 23) | (block22 >>> 41);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 2199023255551L) << 12) | (block23 >>> 52);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 4503599627370495L) << 1) | (block24 >>> 63);
- values[vi++] = (block24 >>> 10) & 9007199254740991L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 1023L) << 43) | (block25 >>> 21);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 2097151L) << 32) | (block26 >>> 32);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 4294967295L) << 21) | (block27 >>> 43);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 8796093022207L) << 10) | (block28 >>> 54);
- values[vi++] = (block28 >>> 1) & 9007199254740991L;
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 1L) << 52) | (block29 >>> 12);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 4095L) << 41) | (block30 >>> 23);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 8388607L) << 30) | (block31 >>> 34);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 17179869183L) << 19) | (block32 >>> 45);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 35184372088831L) << 8) | (block33 >>> 56);
- values[vi++] = (block33 >>> 3) & 9007199254740991L;
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 7L) << 50) | (block34 >>> 14);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 16383L) << 39) | (block35 >>> 25);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 33554431L) << 28) | (block36 >>> 36);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 68719476735L) << 17) | (block37 >>> 47);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 140737488355327L) << 6) | (block38 >>> 58);
- values[vi++] = (block38 >>> 5) & 9007199254740991L;
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 31L) << 48) | (block39 >>> 16);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 65535L) << 37) | (block40 >>> 27);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 134217727L) << 26) | (block41 >>> 38);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 274877906943L) << 15) | (block42 >>> 49);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 562949953421311L) << 4) | (block43 >>> 60);
- values[vi++] = (block43 >>> 7) & 9007199254740991L;
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 127L) << 46) | (block44 >>> 18);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 262143L) << 35) | (block45 >>> 29);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 536870911L) << 24) | (block46 >>> 40);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 1099511627775L) << 13) | (block47 >>> 51);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 2251799813685247L) << 2) | (block48 >>> 62);
- values[vi++] = (block48 >>> 9) & 9007199254740991L;
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 511L) << 44) | (block49 >>> 20);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 1048575L) << 33) | (block50 >>> 31);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 2147483647L) << 22) | (block51 >>> 42);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 4398046511103L) << 11) | (block52 >>> 53);
- values[vi++] = block52 & 9007199254740991L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi++] << 2) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 4) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 6) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 8) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 10) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi++] << 1) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 3) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 5) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 7) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 9) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 11;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 2047L) << 42) | (block1 >>> 22);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 4194303L) << 31) | (block2 >>> 33);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 8589934591L) << 20) | (block3 >>> 44);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 17592186044415L) << 9) | (block4 >>> 55);
+ values[valuesOffset++] = (block4 >>> 2) & 9007199254740991L;
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 3L) << 51) | (block5 >>> 13);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 8191L) << 40) | (block6 >>> 24);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 16777215L) << 29) | (block7 >>> 35);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 34359738367L) << 18) | (block8 >>> 46);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 70368744177663L) << 7) | (block9 >>> 57);
+ values[valuesOffset++] = (block9 >>> 4) & 9007199254740991L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 15L) << 49) | (block10 >>> 15);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 32767L) << 38) | (block11 >>> 26);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 67108863L) << 27) | (block12 >>> 37);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 137438953471L) << 16) | (block13 >>> 48);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 281474976710655L) << 5) | (block14 >>> 59);
+ values[valuesOffset++] = (block14 >>> 6) & 9007199254740991L;
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 63L) << 47) | (block15 >>> 17);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 131071L) << 36) | (block16 >>> 28);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 268435455L) << 25) | (block17 >>> 39);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 549755813887L) << 14) | (block18 >>> 50);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 1125899906842623L) << 3) | (block19 >>> 61);
+ values[valuesOffset++] = (block19 >>> 8) & 9007199254740991L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 255L) << 45) | (block20 >>> 19);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 524287L) << 34) | (block21 >>> 30);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 1073741823L) << 23) | (block22 >>> 41);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 2199023255551L) << 12) | (block23 >>> 52);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 4503599627370495L) << 1) | (block24 >>> 63);
+ values[valuesOffset++] = (block24 >>> 10) & 9007199254740991L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 1023L) << 43) | (block25 >>> 21);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 2097151L) << 32) | (block26 >>> 32);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 4294967295L) << 21) | (block27 >>> 43);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 8796093022207L) << 10) | (block28 >>> 54);
+ values[valuesOffset++] = (block28 >>> 1) & 9007199254740991L;
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 1L) << 52) | (block29 >>> 12);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 4095L) << 41) | (block30 >>> 23);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 8388607L) << 30) | (block31 >>> 34);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 17179869183L) << 19) | (block32 >>> 45);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 35184372088831L) << 8) | (block33 >>> 56);
+ values[valuesOffset++] = (block33 >>> 3) & 9007199254740991L;
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 7L) << 50) | (block34 >>> 14);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 16383L) << 39) | (block35 >>> 25);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 33554431L) << 28) | (block36 >>> 36);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 68719476735L) << 17) | (block37 >>> 47);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 140737488355327L) << 6) | (block38 >>> 58);
+ values[valuesOffset++] = (block38 >>> 5) & 9007199254740991L;
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 31L) << 48) | (block39 >>> 16);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 65535L) << 37) | (block40 >>> 27);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 134217727L) << 26) | (block41 >>> 38);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 274877906943L) << 15) | (block42 >>> 49);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 562949953421311L) << 4) | (block43 >>> 60);
+ values[valuesOffset++] = (block43 >>> 7) & 9007199254740991L;
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 127L) << 46) | (block44 >>> 18);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 262143L) << 35) | (block45 >>> 29);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 536870911L) << 24) | (block46 >>> 40);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 1099511627775L) << 13) | (block47 >>> 51);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 2251799813685247L) << 2) | (block48 >>> 62);
+ values[valuesOffset++] = (block48 >>> 9) & 9007199254740991L;
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 511L) << 44) | (block49 >>> 20);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 1048575L) << 33) | (block50 >>> 31);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 2147483647L) << 22) | (block51 >>> 42);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 4398046511103L) << 11) | (block52 >>> 53);
+ values[valuesOffset++] = block52 & 9007199254740991L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 45) | (byte1 << 37) | (byte2 << 29) | (byte3 << 21) | (byte4 << 13) | (byte5 << 5) | (byte6 >>> 3);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 7) << 50) | (byte7 << 42) | (byte8 << 34) | (byte9 << 26) | (byte10 << 18) | (byte11 << 10) | (byte12 << 2) | (byte13 >>> 6);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 63) << 47) | (byte14 << 39) | (byte15 << 31) | (byte16 << 23) | (byte17 << 15) | (byte18 << 7) | (byte19 >>> 1);
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte19 & 1) << 52) | (byte20 << 44) | (byte21 << 36) | (byte22 << 28) | (byte23 << 20) | (byte24 << 12) | (byte25 << 4) | (byte26 >>> 4);
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte26 & 15) << 49) | (byte27 << 41) | (byte28 << 33) | (byte29 << 25) | (byte30 << 17) | (byte31 << 9) | (byte32 << 1) | (byte33 >>> 7);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 127) << 46) | (byte34 << 38) | (byte35 << 30) | (byte36 << 22) | (byte37 << 14) | (byte38 << 6) | (byte39 >>> 2);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 3) << 51) | (byte40 << 43) | (byte41 << 35) | (byte42 << 27) | (byte43 << 19) | (byte44 << 11) | (byte45 << 3) | (byte46 >>> 5);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 31) << 48) | (byte47 << 40) | (byte48 << 32) | (byte49 << 24) | (byte50 << 16) | (byte51 << 8) | byte52;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte53 << 45) | (byte54 << 37) | (byte55 << 29) | (byte56 << 21) | (byte57 << 13) | (byte58 << 5) | (byte59 >>> 3);
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte59 & 7) << 50) | (byte60 << 42) | (byte61 << 34) | (byte62 << 26) | (byte63 << 18) | (byte64 << 10) | (byte65 << 2) | (byte66 >>> 6);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 63) << 47) | (byte67 << 39) | (byte68 << 31) | (byte69 << 23) | (byte70 << 15) | (byte71 << 7) | (byte72 >>> 1);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 1) << 52) | (byte73 << 44) | (byte74 << 36) | (byte75 << 28) | (byte76 << 20) | (byte77 << 12) | (byte78 << 4) | (byte79 >>> 4);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 15) << 49) | (byte80 << 41) | (byte81 << 33) | (byte82 << 25) | (byte83 << 17) | (byte84 << 9) | (byte85 << 1) | (byte86 >>> 7);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 127) << 46) | (byte87 << 38) | (byte88 << 30) | (byte89 << 22) | (byte90 << 14) | (byte91 << 6) | (byte92 >>> 2);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 3) << 51) | (byte93 << 43) | (byte94 << 35) | (byte95 << 27) | (byte96 << 19) | (byte97 << 11) | (byte98 << 3) | (byte99 >>> 5);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 31) << 48) | (byte100 << 40) | (byte101 << 32) | (byte102 << 24) | (byte103 << 16) | (byte104 << 8) | byte105;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte106 << 45) | (byte107 << 37) | (byte108 << 29) | (byte109 << 21) | (byte110 << 13) | (byte111 << 5) | (byte112 >>> 3);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 7) << 50) | (byte113 << 42) | (byte114 << 34) | (byte115 << 26) | (byte116 << 18) | (byte117 << 10) | (byte118 << 2) | (byte119 >>> 6);
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte119 & 63) << 47) | (byte120 << 39) | (byte121 << 31) | (byte122 << 23) | (byte123 << 15) | (byte124 << 7) | (byte125 >>> 1);
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 1) << 52) | (byte126 << 44) | (byte127 << 36) | (byte128 << 28) | (byte129 << 20) | (byte130 << 12) | (byte131 << 4) | (byte132 >>> 4);
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte132 & 15) << 49) | (byte133 << 41) | (byte134 << 33) | (byte135 << 25) | (byte136 << 17) | (byte137 << 9) | (byte138 << 1) | (byte139 >>> 7);
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 127) << 46) | (byte140 << 38) | (byte141 << 30) | (byte142 << 22) | (byte143 << 14) | (byte144 << 6) | (byte145 >>> 2);
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte145 & 3) << 51) | (byte146 << 43) | (byte147 << 35) | (byte148 << 27) | (byte149 << 19) | (byte150 << 11) | (byte151 << 3) | (byte152 >>> 5);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 31) << 48) | (byte153 << 40) | (byte154 << 32) | (byte155 << 24) | (byte156 << 16) | (byte157 << 8) | byte158;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte159 << 45) | (byte160 << 37) | (byte161 << 29) | (byte162 << 21) | (byte163 << 13) | (byte164 << 5) | (byte165 >>> 3);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 7) << 50) | (byte166 << 42) | (byte167 << 34) | (byte168 << 26) | (byte169 << 18) | (byte170 << 10) | (byte171 << 2) | (byte172 >>> 6);
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte172 & 63) << 47) | (byte173 << 39) | (byte174 << 31) | (byte175 << 23) | (byte176 << 15) | (byte177 << 7) | (byte178 >>> 1);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 1) << 52) | (byte179 << 44) | (byte180 << 36) | (byte181 << 28) | (byte182 << 20) | (byte183 << 12) | (byte184 << 4) | (byte185 >>> 4);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 15) << 49) | (byte186 << 41) | (byte187 << 33) | (byte188 << 25) | (byte189 << 17) | (byte190 << 9) | (byte191 << 1) | (byte192 >>> 7);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 127) << 46) | (byte193 << 38) | (byte194 << 30) | (byte195 << 22) | (byte196 << 14) | (byte197 << 6) | (byte198 >>> 2);
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte198 & 3) << 51) | (byte199 << 43) | (byte200 << 35) | (byte201 << 27) | (byte202 << 19) | (byte203 << 11) | (byte204 << 3) | (byte205 >>> 5);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 31) << 48) | (byte206 << 40) | (byte207 << 32) | (byte208 << 24) | (byte209 << 16) | (byte210 << 8) | byte211;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte212 << 45) | (byte213 << 37) | (byte214 << 29) | (byte215 << 21) | (byte216 << 13) | (byte217 << 5) | (byte218 >>> 3);
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte218 & 7) << 50) | (byte219 << 42) | (byte220 << 34) | (byte221 << 26) | (byte222 << 18) | (byte223 << 10) | (byte224 << 2) | (byte225 >>> 6);
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte225 & 63) << 47) | (byte226 << 39) | (byte227 << 31) | (byte228 << 23) | (byte229 << 15) | (byte230 << 7) | (byte231 >>> 1);
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte231 & 1) << 52) | (byte232 << 44) | (byte233 << 36) | (byte234 << 28) | (byte235 << 20) | (byte236 << 12) | (byte237 << 4) | (byte238 >>> 4);
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte238 & 15) << 49) | (byte239 << 41) | (byte240 << 33) | (byte241 << 25) | (byte242 << 17) | (byte243 << 9) | (byte244 << 1) | (byte245 >>> 7);
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte245 & 127) << 46) | (byte246 << 38) | (byte247 << 30) | (byte248 << 22) | (byte249 << 14) | (byte250 << 6) | (byte251 >>> 2);
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte251 & 3) << 51) | (byte252 << 43) | (byte253 << 35) | (byte254 << 27) | (byte255 << 19) | (byte256 << 11) | (byte257 << 3) | (byte258 >>> 5);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 31) << 48) | (byte259 << 40) | (byte260 << 32) | (byte261 << 24) | (byte262 << 16) | (byte263 << 8) | byte264;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte265 << 45) | (byte266 << 37) | (byte267 << 29) | (byte268 << 21) | (byte269 << 13) | (byte270 << 5) | (byte271 >>> 3);
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte271 & 7) << 50) | (byte272 << 42) | (byte273 << 34) | (byte274 << 26) | (byte275 << 18) | (byte276 << 10) | (byte277 << 2) | (byte278 >>> 6);
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte278 & 63) << 47) | (byte279 << 39) | (byte280 << 31) | (byte281 << 23) | (byte282 << 15) | (byte283 << 7) | (byte284 >>> 1);
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte284 & 1) << 52) | (byte285 << 44) | (byte286 << 36) | (byte287 << 28) | (byte288 << 20) | (byte289 << 12) | (byte290 << 4) | (byte291 >>> 4);
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte291 & 15) << 49) | (byte292 << 41) | (byte293 << 33) | (byte294 << 25) | (byte295 << 17) | (byte296 << 9) | (byte297 << 1) | (byte298 >>> 7);
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte298 & 127) << 46) | (byte299 << 38) | (byte300 << 30) | (byte301 << 22) | (byte302 << 14) | (byte303 << 6) | (byte304 >>> 2);
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte304 & 3) << 51) | (byte305 << 43) | (byte306 << 35) | (byte307 << 27) | (byte308 << 19) | (byte309 << 11) | (byte310 << 3) | (byte311 >>> 5);
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte311 & 31) << 48) | (byte312 << 40) | (byte313 << 32) | (byte314 << 24) | (byte315 << 16) | (byte316 << 8) | byte317;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte318 << 45) | (byte319 << 37) | (byte320 << 29) | (byte321 << 21) | (byte322 << 13) | (byte323 << 5) | (byte324 >>> 3);
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte324 & 7) << 50) | (byte325 << 42) | (byte326 << 34) | (byte327 << 26) | (byte328 << 18) | (byte329 << 10) | (byte330 << 2) | (byte331 >>> 6);
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte331 & 63) << 47) | (byte332 << 39) | (byte333 << 31) | (byte334 << 23) | (byte335 << 15) | (byte336 << 7) | (byte337 >>> 1);
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte337 & 1) << 52) | (byte338 << 44) | (byte339 << 36) | (byte340 << 28) | (byte341 << 20) | (byte342 << 12) | (byte343 << 4) | (byte344 >>> 4);
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte344 & 15) << 49) | (byte345 << 41) | (byte346 << 33) | (byte347 << 25) | (byte348 << 17) | (byte349 << 9) | (byte350 << 1) | (byte351 >>> 7);
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte351 & 127) << 46) | (byte352 << 38) | (byte353 << 30) | (byte354 << 22) | (byte355 << 14) | (byte356 << 6) | (byte357 >>> 2);
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte357 & 3) << 51) | (byte358 << 43) | (byte359 << 35) | (byte360 << 27) | (byte361 << 19) | (byte362 << 11) | (byte363 << 3) | (byte364 >>> 5);
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte364 & 31) << 48) | (byte365 << 40) | (byte366 << 32) | (byte367 << 24) | (byte368 << 16) | (byte369 << 8) | byte370;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte371 << 45) | (byte372 << 37) | (byte373 << 29) | (byte374 << 21) | (byte375 << 13) | (byte376 << 5) | (byte377 >>> 3);
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte377 & 7) << 50) | (byte378 << 42) | (byte379 << 34) | (byte380 << 26) | (byte381 << 18) | (byte382 << 10) | (byte383 << 2) | (byte384 >>> 6);
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte384 & 63) << 47) | (byte385 << 39) | (byte386 << 31) | (byte387 << 23) | (byte388 << 15) | (byte389 << 7) | (byte390 >>> 1);
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte390 & 1) << 52) | (byte391 << 44) | (byte392 << 36) | (byte393 << 28) | (byte394 << 20) | (byte395 << 12) | (byte396 << 4) | (byte397 >>> 4);
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte397 & 15) << 49) | (byte398 << 41) | (byte399 << 33) | (byte400 << 25) | (byte401 << 17) | (byte402 << 9) | (byte403 << 1) | (byte404 >>> 7);
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte404 & 127) << 46) | (byte405 << 38) | (byte406 << 30) | (byte407 << 22) | (byte408 << 14) | (byte409 << 6) | (byte410 >>> 2);
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte410 & 3) << 51) | (byte411 << 43) | (byte412 << 35) | (byte413 << 27) | (byte414 << 19) | (byte415 << 11) | (byte416 << 3) | (byte417 >>> 5);
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte417 & 31) << 48) | (byte418 << 40) | (byte419 << 32) | (byte420 << 24) | (byte421 << 16) | (byte422 << 8) | byte423;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation54 extends BulkOperation {
+ }
+ ,
+ PACKED_54 {
- public int blocks() {
+ public int blockCount() {
return 27;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 10;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1023L) << 44) | (block1 >>> 20);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1048575L) << 34) | (block2 >>> 30);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 1073741823L) << 24) | (block3 >>> 40);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1099511627775L) << 14) | (block4 >>> 50);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1125899906842623L) << 4) | (block5 >>> 60);
- values[vi++] = (block5 >>> 6) & 18014398509481983L;
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 48) | (block6 >>> 16);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 65535L) << 38) | (block7 >>> 26);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 67108863L) << 28) | (block8 >>> 36);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 68719476735L) << 18) | (block9 >>> 46);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 70368744177663L) << 8) | (block10 >>> 56);
- values[vi++] = (block10 >>> 2) & 18014398509481983L;
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 3L) << 52) | (block11 >>> 12);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4095L) << 42) | (block12 >>> 22);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4194303L) << 32) | (block13 >>> 32);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4294967295L) << 22) | (block14 >>> 42);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 4398046511103L) << 12) | (block15 >>> 52);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 4503599627370495L) << 2) | (block16 >>> 62);
- values[vi++] = (block16 >>> 8) & 18014398509481983L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 255L) << 46) | (block17 >>> 18);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 262143L) << 36) | (block18 >>> 28);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 268435455L) << 26) | (block19 >>> 38);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 274877906943L) << 16) | (block20 >>> 48);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 281474976710655L) << 6) | (block21 >>> 58);
- values[vi++] = (block21 >>> 4) & 18014398509481983L;
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 15L) << 50) | (block22 >>> 14);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 16383L) << 40) | (block23 >>> 24);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 16777215L) << 30) | (block24 >>> 34);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 17179869183L) << 20) | (block25 >>> 44);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 17592186044415L) << 10) | (block26 >>> 54);
- values[vi++] = block26 & 18014398509481983L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 6) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 2) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 8) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 4) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 10;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1023L) << 44) | (block1 >>> 20);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1048575L) << 34) | (block2 >>> 30);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 1073741823L) << 24) | (block3 >>> 40);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1099511627775L) << 14) | (block4 >>> 50);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1125899906842623L) << 4) | (block5 >>> 60);
+ values[valuesOffset++] = (block5 >>> 6) & 18014398509481983L;
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 48) | (block6 >>> 16);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 65535L) << 38) | (block7 >>> 26);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 67108863L) << 28) | (block8 >>> 36);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 68719476735L) << 18) | (block9 >>> 46);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 70368744177663L) << 8) | (block10 >>> 56);
+ values[valuesOffset++] = (block10 >>> 2) & 18014398509481983L;
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 3L) << 52) | (block11 >>> 12);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4095L) << 42) | (block12 >>> 22);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4194303L) << 32) | (block13 >>> 32);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4294967295L) << 22) | (block14 >>> 42);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 4398046511103L) << 12) | (block15 >>> 52);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 4503599627370495L) << 2) | (block16 >>> 62);
+ values[valuesOffset++] = (block16 >>> 8) & 18014398509481983L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 255L) << 46) | (block17 >>> 18);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 262143L) << 36) | (block18 >>> 28);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 268435455L) << 26) | (block19 >>> 38);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 274877906943L) << 16) | (block20 >>> 48);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 281474976710655L) << 6) | (block21 >>> 58);
+ values[valuesOffset++] = (block21 >>> 4) & 18014398509481983L;
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 15L) << 50) | (block22 >>> 14);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 16383L) << 40) | (block23 >>> 24);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 16777215L) << 30) | (block24 >>> 34);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 17179869183L) << 20) | (block25 >>> 44);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 17592186044415L) << 10) | (block26 >>> 54);
+ values[valuesOffset++] = block26 & 18014398509481983L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 46) | (byte1 << 38) | (byte2 << 30) | (byte3 << 22) | (byte4 << 14) | (byte5 << 6) | (byte6 >>> 2);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 3) << 52) | (byte7 << 44) | (byte8 << 36) | (byte9 << 28) | (byte10 << 20) | (byte11 << 12) | (byte12 << 4) | (byte13 >>> 4);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 15) << 50) | (byte14 << 42) | (byte15 << 34) | (byte16 << 26) | (byte17 << 18) | (byte18 << 10) | (byte19 << 2) | (byte20 >>> 6);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 63) << 48) | (byte21 << 40) | (byte22 << 32) | (byte23 << 24) | (byte24 << 16) | (byte25 << 8) | byte26;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte27 << 46) | (byte28 << 38) | (byte29 << 30) | (byte30 << 22) | (byte31 << 14) | (byte32 << 6) | (byte33 >>> 2);
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte33 & 3) << 52) | (byte34 << 44) | (byte35 << 36) | (byte36 << 28) | (byte37 << 20) | (byte38 << 12) | (byte39 << 4) | (byte40 >>> 4);
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte40 & 15) << 50) | (byte41 << 42) | (byte42 << 34) | (byte43 << 26) | (byte44 << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 48) | (byte48 << 40) | (byte49 << 32) | (byte50 << 24) | (byte51 << 16) | (byte52 << 8) | byte53;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte54 << 46) | (byte55 << 38) | (byte56 << 30) | (byte57 << 22) | (byte58 << 14) | (byte59 << 6) | (byte60 >>> 2);
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte60 & 3) << 52) | (byte61 << 44) | (byte62 << 36) | (byte63 << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 50) | (byte68 << 42) | (byte69 << 34) | (byte70 << 26) | (byte71 << 18) | (byte72 << 10) | (byte73 << 2) | (byte74 >>> 6);
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte74 & 63) << 48) | (byte75 << 40) | (byte76 << 32) | (byte77 << 24) | (byte78 << 16) | (byte79 << 8) | byte80;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte81 << 46) | (byte82 << 38) | (byte83 << 30) | (byte84 << 22) | (byte85 << 14) | (byte86 << 6) | (byte87 >>> 2);
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte87 & 3) << 52) | (byte88 << 44) | (byte89 << 36) | (byte90 << 28) | (byte91 << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 50) | (byte95 << 42) | (byte96 << 34) | (byte97 << 26) | (byte98 << 18) | (byte99 << 10) | (byte100 << 2) | (byte101 >>> 6);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 63) << 48) | (byte102 << 40) | (byte103 << 32) | (byte104 << 24) | (byte105 << 16) | (byte106 << 8) | byte107;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte108 << 46) | (byte109 << 38) | (byte110 << 30) | (byte111 << 22) | (byte112 << 14) | (byte113 << 6) | (byte114 >>> 2);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 3) << 52) | (byte115 << 44) | (byte116 << 36) | (byte117 << 28) | (byte118 << 20) | (byte119 << 12) | (byte120 << 4) | (byte121 >>> 4);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 15) << 50) | (byte122 << 42) | (byte123 << 34) | (byte124 << 26) | (byte125 << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 48) | (byte129 << 40) | (byte130 << 32) | (byte131 << 24) | (byte132 << 16) | (byte133 << 8) | byte134;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte135 << 46) | (byte136 << 38) | (byte137 << 30) | (byte138 << 22) | (byte139 << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 52) | (byte142 << 44) | (byte143 << 36) | (byte144 << 28) | (byte145 << 20) | (byte146 << 12) | (byte147 << 4) | (byte148 >>> 4);
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte148 & 15) << 50) | (byte149 << 42) | (byte150 << 34) | (byte151 << 26) | (byte152 << 18) | (byte153 << 10) | (byte154 << 2) | (byte155 >>> 6);
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte155 & 63) << 48) | (byte156 << 40) | (byte157 << 32) | (byte158 << 24) | (byte159 << 16) | (byte160 << 8) | byte161;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte162 << 46) | (byte163 << 38) | (byte164 << 30) | (byte165 << 22) | (byte166 << 14) | (byte167 << 6) | (byte168 >>> 2);
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte168 & 3) << 52) | (byte169 << 44) | (byte170 << 36) | (byte171 << 28) | (byte172 << 20) | (byte173 << 12) | (byte174 << 4) | (byte175 >>> 4);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 15) << 50) | (byte176 << 42) | (byte177 << 34) | (byte178 << 26) | (byte179 << 18) | (byte180 << 10) | (byte181 << 2) | (byte182 >>> 6);
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte182 & 63) << 48) | (byte183 << 40) | (byte184 << 32) | (byte185 << 24) | (byte186 << 16) | (byte187 << 8) | byte188;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte189 << 46) | (byte190 << 38) | (byte191 << 30) | (byte192 << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 52) | (byte196 << 44) | (byte197 << 36) | (byte198 << 28) | (byte199 << 20) | (byte200 << 12) | (byte201 << 4) | (byte202 >>> 4);
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte202 & 15) << 50) | (byte203 << 42) | (byte204 << 34) | (byte205 << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 48) | (byte210 << 40) | (byte211 << 32) | (byte212 << 24) | (byte213 << 16) | (byte214 << 8) | byte215;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation55 extends BulkOperation {
+ }
+ ,
+ PACKED_55 {
- public int blocks() {
+ public int blockCount() {
return 55;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 9;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 511L) << 46) | (block1 >>> 18);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 262143L) << 37) | (block2 >>> 27);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 134217727L) << 28) | (block3 >>> 36);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 68719476735L) << 19) | (block4 >>> 45);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 35184372088831L) << 10) | (block5 >>> 54);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 18014398509481983L) << 1) | (block6 >>> 63);
- values[vi++] = (block6 >>> 8) & 36028797018963967L;
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 255L) << 47) | (block7 >>> 17);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 131071L) << 38) | (block8 >>> 26);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 67108863L) << 29) | (block9 >>> 35);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 34359738367L) << 20) | (block10 >>> 44);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 17592186044415L) << 11) | (block11 >>> 53);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 9007199254740991L) << 2) | (block12 >>> 62);
- values[vi++] = (block12 >>> 7) & 36028797018963967L;
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 127L) << 48) | (block13 >>> 16);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 65535L) << 39) | (block14 >>> 25);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 33554431L) << 30) | (block15 >>> 34);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 17179869183L) << 21) | (block16 >>> 43);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 8796093022207L) << 12) | (block17 >>> 52);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 4503599627370495L) << 3) | (block18 >>> 61);
- values[vi++] = (block18 >>> 6) & 36028797018963967L;
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 63L) << 49) | (block19 >>> 15);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 32767L) << 40) | (block20 >>> 24);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 16777215L) << 31) | (block21 >>> 33);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 8589934591L) << 22) | (block22 >>> 42);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4398046511103L) << 13) | (block23 >>> 51);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 2251799813685247L) << 4) | (block24 >>> 60);
- values[vi++] = (block24 >>> 5) & 36028797018963967L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 31L) << 50) | (block25 >>> 14);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 16383L) << 41) | (block26 >>> 23);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 8388607L) << 32) | (block27 >>> 32);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 4294967295L) << 23) | (block28 >>> 41);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 2199023255551L) << 14) | (block29 >>> 50);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1125899906842623L) << 5) | (block30 >>> 59);
- values[vi++] = (block30 >>> 4) & 36028797018963967L;
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 15L) << 51) | (block31 >>> 13);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 8191L) << 42) | (block32 >>> 22);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 4194303L) << 33) | (block33 >>> 31);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 2147483647L) << 24) | (block34 >>> 40);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 1099511627775L) << 15) | (block35 >>> 49);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 562949953421311L) << 6) | (block36 >>> 58);
- values[vi++] = (block36 >>> 3) & 36028797018963967L;
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 7L) << 52) | (block37 >>> 12);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 4095L) << 43) | (block38 >>> 21);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 2097151L) << 34) | (block39 >>> 30);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 1073741823L) << 25) | (block40 >>> 39);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 549755813887L) << 16) | (block41 >>> 48);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 281474976710655L) << 7) | (block42 >>> 57);
- values[vi++] = (block42 >>> 2) & 36028797018963967L;
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 3L) << 53) | (block43 >>> 11);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 2047L) << 44) | (block44 >>> 20);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 1048575L) << 35) | (block45 >>> 29);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 536870911L) << 26) | (block46 >>> 38);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 274877906943L) << 17) | (block47 >>> 47);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 140737488355327L) << 8) | (block48 >>> 56);
- values[vi++] = (block48 >>> 1) & 36028797018963967L;
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 1L) << 54) | (block49 >>> 10);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 1023L) << 45) | (block50 >>> 19);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 524287L) << 36) | (block51 >>> 28);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 268435455L) << 27) | (block52 >>> 37);
- final long block53 = blocks[bi++];
- values[vi++] = ((block52 & 137438953471L) << 18) | (block53 >>> 46);
- final long block54 = blocks[bi++];
- values[vi++] = ((block53 & 70368744177663L) << 9) | (block54 >>> 55);
- values[vi++] = block54 & 36028797018963967L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 9) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 8) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 7) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 6) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 5) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 4) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 3) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi++] << 2) | (values[vi] >>> 53);
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi++] << 1) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 9;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 511L) << 46) | (block1 >>> 18);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 262143L) << 37) | (block2 >>> 27);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 134217727L) << 28) | (block3 >>> 36);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 68719476735L) << 19) | (block4 >>> 45);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 35184372088831L) << 10) | (block5 >>> 54);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 18014398509481983L) << 1) | (block6 >>> 63);
+ values[valuesOffset++] = (block6 >>> 8) & 36028797018963967L;
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 255L) << 47) | (block7 >>> 17);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 131071L) << 38) | (block8 >>> 26);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 67108863L) << 29) | (block9 >>> 35);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 34359738367L) << 20) | (block10 >>> 44);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 17592186044415L) << 11) | (block11 >>> 53);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 9007199254740991L) << 2) | (block12 >>> 62);
+ values[valuesOffset++] = (block12 >>> 7) & 36028797018963967L;
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 127L) << 48) | (block13 >>> 16);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 65535L) << 39) | (block14 >>> 25);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 33554431L) << 30) | (block15 >>> 34);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 17179869183L) << 21) | (block16 >>> 43);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 8796093022207L) << 12) | (block17 >>> 52);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 4503599627370495L) << 3) | (block18 >>> 61);
+ values[valuesOffset++] = (block18 >>> 6) & 36028797018963967L;
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 63L) << 49) | (block19 >>> 15);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 32767L) << 40) | (block20 >>> 24);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 16777215L) << 31) | (block21 >>> 33);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 8589934591L) << 22) | (block22 >>> 42);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4398046511103L) << 13) | (block23 >>> 51);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 2251799813685247L) << 4) | (block24 >>> 60);
+ values[valuesOffset++] = (block24 >>> 5) & 36028797018963967L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 31L) << 50) | (block25 >>> 14);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 16383L) << 41) | (block26 >>> 23);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 8388607L) << 32) | (block27 >>> 32);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 4294967295L) << 23) | (block28 >>> 41);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 2199023255551L) << 14) | (block29 >>> 50);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1125899906842623L) << 5) | (block30 >>> 59);
+ values[valuesOffset++] = (block30 >>> 4) & 36028797018963967L;
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 15L) << 51) | (block31 >>> 13);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 8191L) << 42) | (block32 >>> 22);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 4194303L) << 33) | (block33 >>> 31);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 2147483647L) << 24) | (block34 >>> 40);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 1099511627775L) << 15) | (block35 >>> 49);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 562949953421311L) << 6) | (block36 >>> 58);
+ values[valuesOffset++] = (block36 >>> 3) & 36028797018963967L;
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 7L) << 52) | (block37 >>> 12);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 4095L) << 43) | (block38 >>> 21);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 2097151L) << 34) | (block39 >>> 30);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 1073741823L) << 25) | (block40 >>> 39);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 549755813887L) << 16) | (block41 >>> 48);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 281474976710655L) << 7) | (block42 >>> 57);
+ values[valuesOffset++] = (block42 >>> 2) & 36028797018963967L;
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 3L) << 53) | (block43 >>> 11);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 2047L) << 44) | (block44 >>> 20);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 1048575L) << 35) | (block45 >>> 29);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 536870911L) << 26) | (block46 >>> 38);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 274877906943L) << 17) | (block47 >>> 47);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 140737488355327L) << 8) | (block48 >>> 56);
+ values[valuesOffset++] = (block48 >>> 1) & 36028797018963967L;
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 1L) << 54) | (block49 >>> 10);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 1023L) << 45) | (block50 >>> 19);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 524287L) << 36) | (block51 >>> 28);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 268435455L) << 27) | (block52 >>> 37);
+ final long block53 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block52 & 137438953471L) << 18) | (block53 >>> 46);
+ final long block54 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block53 & 70368744177663L) << 9) | (block54 >>> 55);
+ values[valuesOffset++] = block54 & 36028797018963967L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 47) | (byte1 << 39) | (byte2 << 31) | (byte3 << 23) | (byte4 << 15) | (byte5 << 7) | (byte6 >>> 1);
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte6 & 1) << 54) | (byte7 << 46) | (byte8 << 38) | (byte9 << 30) | (byte10 << 22) | (byte11 << 14) | (byte12 << 6) | (byte13 >>> 2);
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte13 & 3) << 53) | (byte14 << 45) | (byte15 << 37) | (byte16 << 29) | (byte17 << 21) | (byte18 << 13) | (byte19 << 5) | (byte20 >>> 3);
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte20 & 7) << 52) | (byte21 << 44) | (byte22 << 36) | (byte23 << 28) | (byte24 << 20) | (byte25 << 12) | (byte26 << 4) | (byte27 >>> 4);
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte27 & 15) << 51) | (byte28 << 43) | (byte29 << 35) | (byte30 << 27) | (byte31 << 19) | (byte32 << 11) | (byte33 << 3) | (byte34 >>> 5);
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte34 & 31) << 50) | (byte35 << 42) | (byte36 << 34) | (byte37 << 26) | (byte38 << 18) | (byte39 << 10) | (byte40 << 2) | (byte41 >>> 6);
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte41 & 63) << 49) | (byte42 << 41) | (byte43 << 33) | (byte44 << 25) | (byte45 << 17) | (byte46 << 9) | (byte47 << 1) | (byte48 >>> 7);
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte48 & 127) << 48) | (byte49 << 40) | (byte50 << 32) | (byte51 << 24) | (byte52 << 16) | (byte53 << 8) | byte54;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte55 << 47) | (byte56 << 39) | (byte57 << 31) | (byte58 << 23) | (byte59 << 15) | (byte60 << 7) | (byte61 >>> 1);
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte61 & 1) << 54) | (byte62 << 46) | (byte63 << 38) | (byte64 << 30) | (byte65 << 22) | (byte66 << 14) | (byte67 << 6) | (byte68 >>> 2);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 3) << 53) | (byte69 << 45) | (byte70 << 37) | (byte71 << 29) | (byte72 << 21) | (byte73 << 13) | (byte74 << 5) | (byte75 >>> 3);
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte75 & 7) << 52) | (byte76 << 44) | (byte77 << 36) | (byte78 << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 51) | (byte83 << 43) | (byte84 << 35) | (byte85 << 27) | (byte86 << 19) | (byte87 << 11) | (byte88 << 3) | (byte89 >>> 5);
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte89 & 31) << 50) | (byte90 << 42) | (byte91 << 34) | (byte92 << 26) | (byte93 << 18) | (byte94 << 10) | (byte95 << 2) | (byte96 >>> 6);
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte96 & 63) << 49) | (byte97 << 41) | (byte98 << 33) | (byte99 << 25) | (byte100 << 17) | (byte101 << 9) | (byte102 << 1) | (byte103 >>> 7);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 127) << 48) | (byte104 << 40) | (byte105 << 32) | (byte106 << 24) | (byte107 << 16) | (byte108 << 8) | byte109;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte110 << 47) | (byte111 << 39) | (byte112 << 31) | (byte113 << 23) | (byte114 << 15) | (byte115 << 7) | (byte116 >>> 1);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 1) << 54) | (byte117 << 46) | (byte118 << 38) | (byte119 << 30) | (byte120 << 22) | (byte121 << 14) | (byte122 << 6) | (byte123 >>> 2);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 3) << 53) | (byte124 << 45) | (byte125 << 37) | (byte126 << 29) | (byte127 << 21) | (byte128 << 13) | (byte129 << 5) | (byte130 >>> 3);
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 7) << 52) | (byte131 << 44) | (byte132 << 36) | (byte133 << 28) | (byte134 << 20) | (byte135 << 12) | (byte136 << 4) | (byte137 >>> 4);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 15) << 51) | (byte138 << 43) | (byte139 << 35) | (byte140 << 27) | (byte141 << 19) | (byte142 << 11) | (byte143 << 3) | (byte144 >>> 5);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 31) << 50) | (byte145 << 42) | (byte146 << 34) | (byte147 << 26) | (byte148 << 18) | (byte149 << 10) | (byte150 << 2) | (byte151 >>> 6);
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte151 & 63) << 49) | (byte152 << 41) | (byte153 << 33) | (byte154 << 25) | (byte155 << 17) | (byte156 << 9) | (byte157 << 1) | (byte158 >>> 7);
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte158 & 127) << 48) | (byte159 << 40) | (byte160 << 32) | (byte161 << 24) | (byte162 << 16) | (byte163 << 8) | byte164;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte165 << 47) | (byte166 << 39) | (byte167 << 31) | (byte168 << 23) | (byte169 << 15) | (byte170 << 7) | (byte171 >>> 1);
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte171 & 1) << 54) | (byte172 << 46) | (byte173 << 38) | (byte174 << 30) | (byte175 << 22) | (byte176 << 14) | (byte177 << 6) | (byte178 >>> 2);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 3) << 53) | (byte179 << 45) | (byte180 << 37) | (byte181 << 29) | (byte182 << 21) | (byte183 << 13) | (byte184 << 5) | (byte185 >>> 3);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 7) << 52) | (byte186 << 44) | (byte187 << 36) | (byte188 << 28) | (byte189 << 20) | (byte190 << 12) | (byte191 << 4) | (byte192 >>> 4);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 15) << 51) | (byte193 << 43) | (byte194 << 35) | (byte195 << 27) | (byte196 << 19) | (byte197 << 11) | (byte198 << 3) | (byte199 >>> 5);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 31) << 50) | (byte200 << 42) | (byte201 << 34) | (byte202 << 26) | (byte203 << 18) | (byte204 << 10) | (byte205 << 2) | (byte206 >>> 6);
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 63) << 49) | (byte207 << 41) | (byte208 << 33) | (byte209 << 25) | (byte210 << 17) | (byte211 << 9) | (byte212 << 1) | (byte213 >>> 7);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 127) << 48) | (byte214 << 40) | (byte215 << 32) | (byte216 << 24) | (byte217 << 16) | (byte218 << 8) | byte219;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte220 << 47) | (byte221 << 39) | (byte222 << 31) | (byte223 << 23) | (byte224 << 15) | (byte225 << 7) | (byte226 >>> 1);
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte226 & 1) << 54) | (byte227 << 46) | (byte228 << 38) | (byte229 << 30) | (byte230 << 22) | (byte231 << 14) | (byte232 << 6) | (byte233 >>> 2);
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte233 & 3) << 53) | (byte234 << 45) | (byte235 << 37) | (byte236 << 29) | (byte237 << 21) | (byte238 << 13) | (byte239 << 5) | (byte240 >>> 3);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 7) << 52) | (byte241 << 44) | (byte242 << 36) | (byte243 << 28) | (byte244 << 20) | (byte245 << 12) | (byte246 << 4) | (byte247 >>> 4);
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte247 & 15) << 51) | (byte248 << 43) | (byte249 << 35) | (byte250 << 27) | (byte251 << 19) | (byte252 << 11) | (byte253 << 3) | (byte254 >>> 5);
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte254 & 31) << 50) | (byte255 << 42) | (byte256 << 34) | (byte257 << 26) | (byte258 << 18) | (byte259 << 10) | (byte260 << 2) | (byte261 >>> 6);
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte261 & 63) << 49) | (byte262 << 41) | (byte263 << 33) | (byte264 << 25) | (byte265 << 17) | (byte266 << 9) | (byte267 << 1) | (byte268 >>> 7);
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte268 & 127) << 48) | (byte269 << 40) | (byte270 << 32) | (byte271 << 24) | (byte272 << 16) | (byte273 << 8) | byte274;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte275 << 47) | (byte276 << 39) | (byte277 << 31) | (byte278 << 23) | (byte279 << 15) | (byte280 << 7) | (byte281 >>> 1);
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte281 & 1) << 54) | (byte282 << 46) | (byte283 << 38) | (byte284 << 30) | (byte285 << 22) | (byte286 << 14) | (byte287 << 6) | (byte288 >>> 2);
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte288 & 3) << 53) | (byte289 << 45) | (byte290 << 37) | (byte291 << 29) | (byte292 << 21) | (byte293 << 13) | (byte294 << 5) | (byte295 >>> 3);
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte295 & 7) << 52) | (byte296 << 44) | (byte297 << 36) | (byte298 << 28) | (byte299 << 20) | (byte300 << 12) | (byte301 << 4) | (byte302 >>> 4);
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte302 & 15) << 51) | (byte303 << 43) | (byte304 << 35) | (byte305 << 27) | (byte306 << 19) | (byte307 << 11) | (byte308 << 3) | (byte309 >>> 5);
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte309 & 31) << 50) | (byte310 << 42) | (byte311 << 34) | (byte312 << 26) | (byte313 << 18) | (byte314 << 10) | (byte315 << 2) | (byte316 >>> 6);
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte316 & 63) << 49) | (byte317 << 41) | (byte318 << 33) | (byte319 << 25) | (byte320 << 17) | (byte321 << 9) | (byte322 << 1) | (byte323 >>> 7);
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte323 & 127) << 48) | (byte324 << 40) | (byte325 << 32) | (byte326 << 24) | (byte327 << 16) | (byte328 << 8) | byte329;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte330 << 47) | (byte331 << 39) | (byte332 << 31) | (byte333 << 23) | (byte334 << 15) | (byte335 << 7) | (byte336 >>> 1);
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte336 & 1) << 54) | (byte337 << 46) | (byte338 << 38) | (byte339 << 30) | (byte340 << 22) | (byte341 << 14) | (byte342 << 6) | (byte343 >>> 2);
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte343 & 3) << 53) | (byte344 << 45) | (byte345 << 37) | (byte346 << 29) | (byte347 << 21) | (byte348 << 13) | (byte349 << 5) | (byte350 >>> 3);
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte350 & 7) << 52) | (byte351 << 44) | (byte352 << 36) | (byte353 << 28) | (byte354 << 20) | (byte355 << 12) | (byte356 << 4) | (byte357 >>> 4);
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte357 & 15) << 51) | (byte358 << 43) | (byte359 << 35) | (byte360 << 27) | (byte361 << 19) | (byte362 << 11) | (byte363 << 3) | (byte364 >>> 5);
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte364 & 31) << 50) | (byte365 << 42) | (byte366 << 34) | (byte367 << 26) | (byte368 << 18) | (byte369 << 10) | (byte370 << 2) | (byte371 >>> 6);
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte371 & 63) << 49) | (byte372 << 41) | (byte373 << 33) | (byte374 << 25) | (byte375 << 17) | (byte376 << 9) | (byte377 << 1) | (byte378 >>> 7);
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte378 & 127) << 48) | (byte379 << 40) | (byte380 << 32) | (byte381 << 24) | (byte382 << 16) | (byte383 << 8) | byte384;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte385 << 47) | (byte386 << 39) | (byte387 << 31) | (byte388 << 23) | (byte389 << 15) | (byte390 << 7) | (byte391 >>> 1);
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte391 & 1) << 54) | (byte392 << 46) | (byte393 << 38) | (byte394 << 30) | (byte395 << 22) | (byte396 << 14) | (byte397 << 6) | (byte398 >>> 2);
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte398 & 3) << 53) | (byte399 << 45) | (byte400 << 37) | (byte401 << 29) | (byte402 << 21) | (byte403 << 13) | (byte404 << 5) | (byte405 >>> 3);
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte405 & 7) << 52) | (byte406 << 44) | (byte407 << 36) | (byte408 << 28) | (byte409 << 20) | (byte410 << 12) | (byte411 << 4) | (byte412 >>> 4);
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte412 & 15) << 51) | (byte413 << 43) | (byte414 << 35) | (byte415 << 27) | (byte416 << 19) | (byte417 << 11) | (byte418 << 3) | (byte419 >>> 5);
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ final long byte424 = blocks[blocksOffset++] & 0xFF;
+ final long byte425 = blocks[blocksOffset++] & 0xFF;
+ final long byte426 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte419 & 31) << 50) | (byte420 << 42) | (byte421 << 34) | (byte422 << 26) | (byte423 << 18) | (byte424 << 10) | (byte425 << 2) | (byte426 >>> 6);
+ final long byte427 = blocks[blocksOffset++] & 0xFF;
+ final long byte428 = blocks[blocksOffset++] & 0xFF;
+ final long byte429 = blocks[blocksOffset++] & 0xFF;
+ final long byte430 = blocks[blocksOffset++] & 0xFF;
+ final long byte431 = blocks[blocksOffset++] & 0xFF;
+ final long byte432 = blocks[blocksOffset++] & 0xFF;
+ final long byte433 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte426 & 63) << 49) | (byte427 << 41) | (byte428 << 33) | (byte429 << 25) | (byte430 << 17) | (byte431 << 9) | (byte432 << 1) | (byte433 >>> 7);
+ final long byte434 = blocks[blocksOffset++] & 0xFF;
+ final long byte435 = blocks[blocksOffset++] & 0xFF;
+ final long byte436 = blocks[blocksOffset++] & 0xFF;
+ final long byte437 = blocks[blocksOffset++] & 0xFF;
+ final long byte438 = blocks[blocksOffset++] & 0xFF;
+ final long byte439 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte433 & 127) << 48) | (byte434 << 40) | (byte435 << 32) | (byte436 << 24) | (byte437 << 16) | (byte438 << 8) | byte439;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 53);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 53);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation56 extends BulkOperation {
+ }
+ ,
+ PACKED_56 {
- public int blocks() {
+ public int blockCount() {
return 7;
}
- public int values() {
+ public int valueCount() {
return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 8;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 255L) << 48) | (block1 >>> 16);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 65535L) << 40) | (block2 >>> 24);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 16777215L) << 32) | (block3 >>> 32);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 4294967295L) << 24) | (block4 >>> 40);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1099511627775L) << 16) | (block5 >>> 48);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 281474976710655L) << 8) | (block6 >>> 56);
- values[vi++] = block6 & 72057594037927935L;
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | values[vi++];
- }
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 8;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 255L) << 48) | (block1 >>> 16);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 65535L) << 40) | (block2 >>> 24);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 16777215L) << 32) | (block3 >>> 32);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 4294967295L) << 24) | (block4 >>> 40);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1099511627775L) << 16) | (block5 >>> 48);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 281474976710655L) << 8) | (block6 >>> 56);
+ values[valuesOffset++] = block6 & 72057594037927935L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 48) | (byte1 << 40) | (byte2 << 32) | (byte3 << 24) | (byte4 << 16) | (byte5 << 8) | byte6;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte7 << 48) | (byte8 << 40) | (byte9 << 32) | (byte10 << 24) | (byte11 << 16) | (byte12 << 8) | byte13;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte14 << 48) | (byte15 << 40) | (byte16 << 32) | (byte17 << 24) | (byte18 << 16) | (byte19 << 8) | byte20;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte21 << 48) | (byte22 << 40) | (byte23 << 32) | (byte24 << 24) | (byte25 << 16) | (byte26 << 8) | byte27;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte28 << 48) | (byte29 << 40) | (byte30 << 32) | (byte31 << 24) | (byte32 << 16) | (byte33 << 8) | byte34;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte35 << 48) | (byte36 << 40) | (byte37 << 32) | (byte38 << 24) | (byte39 << 16) | (byte40 << 8) | byte41;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte42 << 48) | (byte43 << 40) | (byte44 << 32) | (byte45 << 24) | (byte46 << 16) | (byte47 << 8) | byte48;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte49 << 48) | (byte50 << 40) | (byte51 << 32) | (byte52 << 24) | (byte53 << 16) | (byte54 << 8) | byte55;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation57 extends BulkOperation {
+ }
+ ,
+ PACKED_57 {
- public int blocks() {
+ public int blockCount() {
return 57;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 7;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 127L) << 50) | (block1 >>> 14);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 16383L) << 43) | (block2 >>> 21);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 2097151L) << 36) | (block3 >>> 28);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 268435455L) << 29) | (block4 >>> 35);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 34359738367L) << 22) | (block5 >>> 42);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 4398046511103L) << 15) | (block6 >>> 49);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 562949953421311L) << 8) | (block7 >>> 56);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 72057594037927935L) << 1) | (block8 >>> 63);
- values[vi++] = (block8 >>> 6) & 144115188075855871L;
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 63L) << 51) | (block9 >>> 13);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 8191L) << 44) | (block10 >>> 20);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 1048575L) << 37) | (block11 >>> 27);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 134217727L) << 30) | (block12 >>> 34);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 17179869183L) << 23) | (block13 >>> 41);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2199023255551L) << 16) | (block14 >>> 48);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 281474976710655L) << 9) | (block15 >>> 55);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 36028797018963967L) << 2) | (block16 >>> 62);
- values[vi++] = (block16 >>> 5) & 144115188075855871L;
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 31L) << 52) | (block17 >>> 12);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 4095L) << 45) | (block18 >>> 19);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 524287L) << 38) | (block19 >>> 26);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 67108863L) << 31) | (block20 >>> 33);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 8589934591L) << 24) | (block21 >>> 40);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 1099511627775L) << 17) | (block22 >>> 47);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 140737488355327L) << 10) | (block23 >>> 54);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 18014398509481983L) << 3) | (block24 >>> 61);
- values[vi++] = (block24 >>> 4) & 144115188075855871L;
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 15L) << 53) | (block25 >>> 11);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 2047L) << 46) | (block26 >>> 18);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 262143L) << 39) | (block27 >>> 25);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 33554431L) << 32) | (block28 >>> 32);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 4294967295L) << 25) | (block29 >>> 39);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 549755813887L) << 18) | (block30 >>> 46);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 70368744177663L) << 11) | (block31 >>> 53);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 9007199254740991L) << 4) | (block32 >>> 60);
- values[vi++] = (block32 >>> 3) & 144115188075855871L;
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 7L) << 54) | (block33 >>> 10);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 1023L) << 47) | (block34 >>> 17);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 131071L) << 40) | (block35 >>> 24);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 16777215L) << 33) | (block36 >>> 31);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 2147483647L) << 26) | (block37 >>> 38);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 274877906943L) << 19) | (block38 >>> 45);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 35184372088831L) << 12) | (block39 >>> 52);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 4503599627370495L) << 5) | (block40 >>> 59);
- values[vi++] = (block40 >>> 2) & 144115188075855871L;
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 3L) << 55) | (block41 >>> 9);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 511L) << 48) | (block42 >>> 16);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 65535L) << 41) | (block43 >>> 23);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 8388607L) << 34) | (block44 >>> 30);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 1073741823L) << 27) | (block45 >>> 37);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 137438953471L) << 20) | (block46 >>> 44);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 17592186044415L) << 13) | (block47 >>> 51);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 2251799813685247L) << 6) | (block48 >>> 58);
- values[vi++] = (block48 >>> 1) & 144115188075855871L;
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 1L) << 56) | (block49 >>> 8);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 255L) << 49) | (block50 >>> 15);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 32767L) << 42) | (block51 >>> 22);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 4194303L) << 35) | (block52 >>> 29);
- final long block53 = blocks[bi++];
- values[vi++] = ((block52 & 536870911L) << 28) | (block53 >>> 36);
- final long block54 = blocks[bi++];
- values[vi++] = ((block53 & 68719476735L) << 21) | (block54 >>> 43);
- final long block55 = blocks[bi++];
- values[vi++] = ((block54 & 8796093022207L) << 14) | (block55 >>> 50);
- final long block56 = blocks[bi++];
- values[vi++] = ((block55 & 1125899906842623L) << 7) | (block56 >>> 57);
- values[vi++] = block56 & 144115188075855871L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 7) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 6) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 5) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 4) | (values[vi] >>> 53);
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 3) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi++] << 2) | (values[vi] >>> 55);
- blocks[bi++] = (values[vi++] << 9) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi++] << 1) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 7;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 127L) << 50) | (block1 >>> 14);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 16383L) << 43) | (block2 >>> 21);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 2097151L) << 36) | (block3 >>> 28);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 268435455L) << 29) | (block4 >>> 35);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 34359738367L) << 22) | (block5 >>> 42);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 4398046511103L) << 15) | (block6 >>> 49);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 562949953421311L) << 8) | (block7 >>> 56);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 72057594037927935L) << 1) | (block8 >>> 63);
+ values[valuesOffset++] = (block8 >>> 6) & 144115188075855871L;
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 63L) << 51) | (block9 >>> 13);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 8191L) << 44) | (block10 >>> 20);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 1048575L) << 37) | (block11 >>> 27);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 134217727L) << 30) | (block12 >>> 34);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 17179869183L) << 23) | (block13 >>> 41);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2199023255551L) << 16) | (block14 >>> 48);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 281474976710655L) << 9) | (block15 >>> 55);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 36028797018963967L) << 2) | (block16 >>> 62);
+ values[valuesOffset++] = (block16 >>> 5) & 144115188075855871L;
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 31L) << 52) | (block17 >>> 12);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 4095L) << 45) | (block18 >>> 19);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 524287L) << 38) | (block19 >>> 26);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 67108863L) << 31) | (block20 >>> 33);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 8589934591L) << 24) | (block21 >>> 40);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 1099511627775L) << 17) | (block22 >>> 47);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 140737488355327L) << 10) | (block23 >>> 54);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 18014398509481983L) << 3) | (block24 >>> 61);
+ values[valuesOffset++] = (block24 >>> 4) & 144115188075855871L;
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 15L) << 53) | (block25 >>> 11);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 2047L) << 46) | (block26 >>> 18);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 262143L) << 39) | (block27 >>> 25);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 33554431L) << 32) | (block28 >>> 32);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 4294967295L) << 25) | (block29 >>> 39);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 549755813887L) << 18) | (block30 >>> 46);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 70368744177663L) << 11) | (block31 >>> 53);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 9007199254740991L) << 4) | (block32 >>> 60);
+ values[valuesOffset++] = (block32 >>> 3) & 144115188075855871L;
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 7L) << 54) | (block33 >>> 10);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 1023L) << 47) | (block34 >>> 17);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 131071L) << 40) | (block35 >>> 24);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 16777215L) << 33) | (block36 >>> 31);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 2147483647L) << 26) | (block37 >>> 38);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 274877906943L) << 19) | (block38 >>> 45);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 35184372088831L) << 12) | (block39 >>> 52);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 4503599627370495L) << 5) | (block40 >>> 59);
+ values[valuesOffset++] = (block40 >>> 2) & 144115188075855871L;
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 3L) << 55) | (block41 >>> 9);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 511L) << 48) | (block42 >>> 16);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 65535L) << 41) | (block43 >>> 23);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 8388607L) << 34) | (block44 >>> 30);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 1073741823L) << 27) | (block45 >>> 37);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 137438953471L) << 20) | (block46 >>> 44);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 17592186044415L) << 13) | (block47 >>> 51);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 2251799813685247L) << 6) | (block48 >>> 58);
+ values[valuesOffset++] = (block48 >>> 1) & 144115188075855871L;
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 1L) << 56) | (block49 >>> 8);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 255L) << 49) | (block50 >>> 15);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 32767L) << 42) | (block51 >>> 22);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 4194303L) << 35) | (block52 >>> 29);
+ final long block53 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block52 & 536870911L) << 28) | (block53 >>> 36);
+ final long block54 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block53 & 68719476735L) << 21) | (block54 >>> 43);
+ final long block55 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block54 & 8796093022207L) << 14) | (block55 >>> 50);
+ final long block56 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block55 & 1125899906842623L) << 7) | (block56 >>> 57);
+ values[valuesOffset++] = block56 & 144115188075855871L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 49) | (byte1 << 41) | (byte2 << 33) | (byte3 << 25) | (byte4 << 17) | (byte5 << 9) | (byte6 << 1) | (byte7 >>> 7);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 127) << 50) | (byte8 << 42) | (byte9 << 34) | (byte10 << 26) | (byte11 << 18) | (byte12 << 10) | (byte13 << 2) | (byte14 >>> 6);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 63) << 51) | (byte15 << 43) | (byte16 << 35) | (byte17 << 27) | (byte18 << 19) | (byte19 << 11) | (byte20 << 3) | (byte21 >>> 5);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 31) << 52) | (byte22 << 44) | (byte23 << 36) | (byte24 << 28) | (byte25 << 20) | (byte26 << 12) | (byte27 << 4) | (byte28 >>> 4);
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte28 & 15) << 53) | (byte29 << 45) | (byte30 << 37) | (byte31 << 29) | (byte32 << 21) | (byte33 << 13) | (byte34 << 5) | (byte35 >>> 3);
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte35 & 7) << 54) | (byte36 << 46) | (byte37 << 38) | (byte38 << 30) | (byte39 << 22) | (byte40 << 14) | (byte41 << 6) | (byte42 >>> 2);
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte42 & 3) << 55) | (byte43 << 47) | (byte44 << 39) | (byte45 << 31) | (byte46 << 23) | (byte47 << 15) | (byte48 << 7) | (byte49 >>> 1);
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte49 & 1) << 56) | (byte50 << 48) | (byte51 << 40) | (byte52 << 32) | (byte53 << 24) | (byte54 << 16) | (byte55 << 8) | byte56;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte57 << 49) | (byte58 << 41) | (byte59 << 33) | (byte60 << 25) | (byte61 << 17) | (byte62 << 9) | (byte63 << 1) | (byte64 >>> 7);
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte64 & 127) << 50) | (byte65 << 42) | (byte66 << 34) | (byte67 << 26) | (byte68 << 18) | (byte69 << 10) | (byte70 << 2) | (byte71 >>> 6);
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte71 & 63) << 51) | (byte72 << 43) | (byte73 << 35) | (byte74 << 27) | (byte75 << 19) | (byte76 << 11) | (byte77 << 3) | (byte78 >>> 5);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 31) << 52) | (byte79 << 44) | (byte80 << 36) | (byte81 << 28) | (byte82 << 20) | (byte83 << 12) | (byte84 << 4) | (byte85 >>> 4);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 15) << 53) | (byte86 << 45) | (byte87 << 37) | (byte88 << 29) | (byte89 << 21) | (byte90 << 13) | (byte91 << 5) | (byte92 >>> 3);
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte92 & 7) << 54) | (byte93 << 46) | (byte94 << 38) | (byte95 << 30) | (byte96 << 22) | (byte97 << 14) | (byte98 << 6) | (byte99 >>> 2);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 3) << 55) | (byte100 << 47) | (byte101 << 39) | (byte102 << 31) | (byte103 << 23) | (byte104 << 15) | (byte105 << 7) | (byte106 >>> 1);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 1) << 56) | (byte107 << 48) | (byte108 << 40) | (byte109 << 32) | (byte110 << 24) | (byte111 << 16) | (byte112 << 8) | byte113;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte114 << 49) | (byte115 << 41) | (byte116 << 33) | (byte117 << 25) | (byte118 << 17) | (byte119 << 9) | (byte120 << 1) | (byte121 >>> 7);
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte121 & 127) << 50) | (byte122 << 42) | (byte123 << 34) | (byte124 << 26) | (byte125 << 18) | (byte126 << 10) | (byte127 << 2) | (byte128 >>> 6);
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte128 & 63) << 51) | (byte129 << 43) | (byte130 << 35) | (byte131 << 27) | (byte132 << 19) | (byte133 << 11) | (byte134 << 3) | (byte135 >>> 5);
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte135 & 31) << 52) | (byte136 << 44) | (byte137 << 36) | (byte138 << 28) | (byte139 << 20) | (byte140 << 12) | (byte141 << 4) | (byte142 >>> 4);
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte142 & 15) << 53) | (byte143 << 45) | (byte144 << 37) | (byte145 << 29) | (byte146 << 21) | (byte147 << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 54) | (byte150 << 46) | (byte151 << 38) | (byte152 << 30) | (byte153 << 22) | (byte154 << 14) | (byte155 << 6) | (byte156 >>> 2);
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte156 & 3) << 55) | (byte157 << 47) | (byte158 << 39) | (byte159 << 31) | (byte160 << 23) | (byte161 << 15) | (byte162 << 7) | (byte163 >>> 1);
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte163 & 1) << 56) | (byte164 << 48) | (byte165 << 40) | (byte166 << 32) | (byte167 << 24) | (byte168 << 16) | (byte169 << 8) | byte170;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte171 << 49) | (byte172 << 41) | (byte173 << 33) | (byte174 << 25) | (byte175 << 17) | (byte176 << 9) | (byte177 << 1) | (byte178 >>> 7);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 127) << 50) | (byte179 << 42) | (byte180 << 34) | (byte181 << 26) | (byte182 << 18) | (byte183 << 10) | (byte184 << 2) | (byte185 >>> 6);
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte185 & 63) << 51) | (byte186 << 43) | (byte187 << 35) | (byte188 << 27) | (byte189 << 19) | (byte190 << 11) | (byte191 << 3) | (byte192 >>> 5);
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte192 & 31) << 52) | (byte193 << 44) | (byte194 << 36) | (byte195 << 28) | (byte196 << 20) | (byte197 << 12) | (byte198 << 4) | (byte199 >>> 4);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 15) << 53) | (byte200 << 45) | (byte201 << 37) | (byte202 << 29) | (byte203 << 21) | (byte204 << 13) | (byte205 << 5) | (byte206 >>> 3);
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 7) << 54) | (byte207 << 46) | (byte208 << 38) | (byte209 << 30) | (byte210 << 22) | (byte211 << 14) | (byte212 << 6) | (byte213 >>> 2);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 3) << 55) | (byte214 << 47) | (byte215 << 39) | (byte216 << 31) | (byte217 << 23) | (byte218 << 15) | (byte219 << 7) | (byte220 >>> 1);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 1) << 56) | (byte221 << 48) | (byte222 << 40) | (byte223 << 32) | (byte224 << 24) | (byte225 << 16) | (byte226 << 8) | byte227;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte228 << 49) | (byte229 << 41) | (byte230 << 33) | (byte231 << 25) | (byte232 << 17) | (byte233 << 9) | (byte234 << 1) | (byte235 >>> 7);
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte235 & 127) << 50) | (byte236 << 42) | (byte237 << 34) | (byte238 << 26) | (byte239 << 18) | (byte240 << 10) | (byte241 << 2) | (byte242 >>> 6);
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte242 & 63) << 51) | (byte243 << 43) | (byte244 << 35) | (byte245 << 27) | (byte246 << 19) | (byte247 << 11) | (byte248 << 3) | (byte249 >>> 5);
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte249 & 31) << 52) | (byte250 << 44) | (byte251 << 36) | (byte252 << 28) | (byte253 << 20) | (byte254 << 12) | (byte255 << 4) | (byte256 >>> 4);
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte256 & 15) << 53) | (byte257 << 45) | (byte258 << 37) | (byte259 << 29) | (byte260 << 21) | (byte261 << 13) | (byte262 << 5) | (byte263 >>> 3);
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte263 & 7) << 54) | (byte264 << 46) | (byte265 << 38) | (byte266 << 30) | (byte267 << 22) | (byte268 << 14) | (byte269 << 6) | (byte270 >>> 2);
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte270 & 3) << 55) | (byte271 << 47) | (byte272 << 39) | (byte273 << 31) | (byte274 << 23) | (byte275 << 15) | (byte276 << 7) | (byte277 >>> 1);
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte277 & 1) << 56) | (byte278 << 48) | (byte279 << 40) | (byte280 << 32) | (byte281 << 24) | (byte282 << 16) | (byte283 << 8) | byte284;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte285 << 49) | (byte286 << 41) | (byte287 << 33) | (byte288 << 25) | (byte289 << 17) | (byte290 << 9) | (byte291 << 1) | (byte292 >>> 7);
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte292 & 127) << 50) | (byte293 << 42) | (byte294 << 34) | (byte295 << 26) | (byte296 << 18) | (byte297 << 10) | (byte298 << 2) | (byte299 >>> 6);
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte299 & 63) << 51) | (byte300 << 43) | (byte301 << 35) | (byte302 << 27) | (byte303 << 19) | (byte304 << 11) | (byte305 << 3) | (byte306 >>> 5);
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte306 & 31) << 52) | (byte307 << 44) | (byte308 << 36) | (byte309 << 28) | (byte310 << 20) | (byte311 << 12) | (byte312 << 4) | (byte313 >>> 4);
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte313 & 15) << 53) | (byte314 << 45) | (byte315 << 37) | (byte316 << 29) | (byte317 << 21) | (byte318 << 13) | (byte319 << 5) | (byte320 >>> 3);
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte320 & 7) << 54) | (byte321 << 46) | (byte322 << 38) | (byte323 << 30) | (byte324 << 22) | (byte325 << 14) | (byte326 << 6) | (byte327 >>> 2);
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte327 & 3) << 55) | (byte328 << 47) | (byte329 << 39) | (byte330 << 31) | (byte331 << 23) | (byte332 << 15) | (byte333 << 7) | (byte334 >>> 1);
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte334 & 1) << 56) | (byte335 << 48) | (byte336 << 40) | (byte337 << 32) | (byte338 << 24) | (byte339 << 16) | (byte340 << 8) | byte341;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte342 << 49) | (byte343 << 41) | (byte344 << 33) | (byte345 << 25) | (byte346 << 17) | (byte347 << 9) | (byte348 << 1) | (byte349 >>> 7);
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte349 & 127) << 50) | (byte350 << 42) | (byte351 << 34) | (byte352 << 26) | (byte353 << 18) | (byte354 << 10) | (byte355 << 2) | (byte356 >>> 6);
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte356 & 63) << 51) | (byte357 << 43) | (byte358 << 35) | (byte359 << 27) | (byte360 << 19) | (byte361 << 11) | (byte362 << 3) | (byte363 >>> 5);
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte363 & 31) << 52) | (byte364 << 44) | (byte365 << 36) | (byte366 << 28) | (byte367 << 20) | (byte368 << 12) | (byte369 << 4) | (byte370 >>> 4);
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte370 & 15) << 53) | (byte371 << 45) | (byte372 << 37) | (byte373 << 29) | (byte374 << 21) | (byte375 << 13) | (byte376 << 5) | (byte377 >>> 3);
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte377 & 7) << 54) | (byte378 << 46) | (byte379 << 38) | (byte380 << 30) | (byte381 << 22) | (byte382 << 14) | (byte383 << 6) | (byte384 >>> 2);
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte384 & 3) << 55) | (byte385 << 47) | (byte386 << 39) | (byte387 << 31) | (byte388 << 23) | (byte389 << 15) | (byte390 << 7) | (byte391 >>> 1);
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte391 & 1) << 56) | (byte392 << 48) | (byte393 << 40) | (byte394 << 32) | (byte395 << 24) | (byte396 << 16) | (byte397 << 8) | byte398;
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte399 << 49) | (byte400 << 41) | (byte401 << 33) | (byte402 << 25) | (byte403 << 17) | (byte404 << 9) | (byte405 << 1) | (byte406 >>> 7);
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte406 & 127) << 50) | (byte407 << 42) | (byte408 << 34) | (byte409 << 26) | (byte410 << 18) | (byte411 << 10) | (byte412 << 2) | (byte413 >>> 6);
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte413 & 63) << 51) | (byte414 << 43) | (byte415 << 35) | (byte416 << 27) | (byte417 << 19) | (byte418 << 11) | (byte419 << 3) | (byte420 >>> 5);
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ final long byte424 = blocks[blocksOffset++] & 0xFF;
+ final long byte425 = blocks[blocksOffset++] & 0xFF;
+ final long byte426 = blocks[blocksOffset++] & 0xFF;
+ final long byte427 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte420 & 31) << 52) | (byte421 << 44) | (byte422 << 36) | (byte423 << 28) | (byte424 << 20) | (byte425 << 12) | (byte426 << 4) | (byte427 >>> 4);
+ final long byte428 = blocks[blocksOffset++] & 0xFF;
+ final long byte429 = blocks[blocksOffset++] & 0xFF;
+ final long byte430 = blocks[blocksOffset++] & 0xFF;
+ final long byte431 = blocks[blocksOffset++] & 0xFF;
+ final long byte432 = blocks[blocksOffset++] & 0xFF;
+ final long byte433 = blocks[blocksOffset++] & 0xFF;
+ final long byte434 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte427 & 15) << 53) | (byte428 << 45) | (byte429 << 37) | (byte430 << 29) | (byte431 << 21) | (byte432 << 13) | (byte433 << 5) | (byte434 >>> 3);
+ final long byte435 = blocks[blocksOffset++] & 0xFF;
+ final long byte436 = blocks[blocksOffset++] & 0xFF;
+ final long byte437 = blocks[blocksOffset++] & 0xFF;
+ final long byte438 = blocks[blocksOffset++] & 0xFF;
+ final long byte439 = blocks[blocksOffset++] & 0xFF;
+ final long byte440 = blocks[blocksOffset++] & 0xFF;
+ final long byte441 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte434 & 7) << 54) | (byte435 << 46) | (byte436 << 38) | (byte437 << 30) | (byte438 << 22) | (byte439 << 14) | (byte440 << 6) | (byte441 >>> 2);
+ final long byte442 = blocks[blocksOffset++] & 0xFF;
+ final long byte443 = blocks[blocksOffset++] & 0xFF;
+ final long byte444 = blocks[blocksOffset++] & 0xFF;
+ final long byte445 = blocks[blocksOffset++] & 0xFF;
+ final long byte446 = blocks[blocksOffset++] & 0xFF;
+ final long byte447 = blocks[blocksOffset++] & 0xFF;
+ final long byte448 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte441 & 3) << 55) | (byte442 << 47) | (byte443 << 39) | (byte444 << 31) | (byte445 << 23) | (byte446 << 15) | (byte447 << 7) | (byte448 >>> 1);
+ final long byte449 = blocks[blocksOffset++] & 0xFF;
+ final long byte450 = blocks[blocksOffset++] & 0xFF;
+ final long byte451 = blocks[blocksOffset++] & 0xFF;
+ final long byte452 = blocks[blocksOffset++] & 0xFF;
+ final long byte453 = blocks[blocksOffset++] & 0xFF;
+ final long byte454 = blocks[blocksOffset++] & 0xFF;
+ final long byte455 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte448 & 1) << 56) | (byte449 << 48) | (byte450 << 40) | (byte451 << 32) | (byte452 << 24) | (byte453 << 16) | (byte454 << 8) | byte455;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 53);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 55);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 53);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 55);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation58 extends BulkOperation {
+ }
+ ,
+ PACKED_58 {
- public int blocks() {
+ public int blockCount() {
return 29;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 6;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 63L) << 52) | (block1 >>> 12);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 4095L) << 46) | (block2 >>> 18);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 262143L) << 40) | (block3 >>> 24);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 16777215L) << 34) | (block4 >>> 30);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1073741823L) << 28) | (block5 >>> 36);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 68719476735L) << 22) | (block6 >>> 42);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 4398046511103L) << 16) | (block7 >>> 48);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 281474976710655L) << 10) | (block8 >>> 54);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 18014398509481983L) << 4) | (block9 >>> 60);
- values[vi++] = (block9 >>> 2) & 288230376151711743L;
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 3L) << 56) | (block10 >>> 8);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 255L) << 50) | (block11 >>> 14);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 16383L) << 44) | (block12 >>> 20);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 1048575L) << 38) | (block13 >>> 26);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 67108863L) << 32) | (block14 >>> 32);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 4294967295L) << 26) | (block15 >>> 38);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 274877906943L) << 20) | (block16 >>> 44);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 17592186044415L) << 14) | (block17 >>> 50);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 1125899906842623L) << 8) | (block18 >>> 56);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 72057594037927935L) << 2) | (block19 >>> 62);
- values[vi++] = (block19 >>> 4) & 288230376151711743L;
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 15L) << 54) | (block20 >>> 10);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 1023L) << 48) | (block21 >>> 16);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 65535L) << 42) | (block22 >>> 22);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 4194303L) << 36) | (block23 >>> 28);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 268435455L) << 30) | (block24 >>> 34);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 17179869183L) << 24) | (block25 >>> 40);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 1099511627775L) << 18) | (block26 >>> 46);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 70368744177663L) << 12) | (block27 >>> 52);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 4503599627370495L) << 6) | (block28 >>> 58);
- values[vi++] = block28 & 288230376151711743L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 6) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 2) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 4) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 6;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 63L) << 52) | (block1 >>> 12);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 4095L) << 46) | (block2 >>> 18);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 262143L) << 40) | (block3 >>> 24);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 16777215L) << 34) | (block4 >>> 30);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1073741823L) << 28) | (block5 >>> 36);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 68719476735L) << 22) | (block6 >>> 42);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 4398046511103L) << 16) | (block7 >>> 48);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 281474976710655L) << 10) | (block8 >>> 54);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 18014398509481983L) << 4) | (block9 >>> 60);
+ values[valuesOffset++] = (block9 >>> 2) & 288230376151711743L;
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 3L) << 56) | (block10 >>> 8);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 255L) << 50) | (block11 >>> 14);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 16383L) << 44) | (block12 >>> 20);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 1048575L) << 38) | (block13 >>> 26);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 67108863L) << 32) | (block14 >>> 32);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 4294967295L) << 26) | (block15 >>> 38);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 274877906943L) << 20) | (block16 >>> 44);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 17592186044415L) << 14) | (block17 >>> 50);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 1125899906842623L) << 8) | (block18 >>> 56);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 72057594037927935L) << 2) | (block19 >>> 62);
+ values[valuesOffset++] = (block19 >>> 4) & 288230376151711743L;
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 15L) << 54) | (block20 >>> 10);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 1023L) << 48) | (block21 >>> 16);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 65535L) << 42) | (block22 >>> 22);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 4194303L) << 36) | (block23 >>> 28);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 268435455L) << 30) | (block24 >>> 34);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 17179869183L) << 24) | (block25 >>> 40);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 1099511627775L) << 18) | (block26 >>> 46);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 70368744177663L) << 12) | (block27 >>> 52);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 4503599627370495L) << 6) | (block28 >>> 58);
+ values[valuesOffset++] = block28 & 288230376151711743L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 50) | (byte1 << 42) | (byte2 << 34) | (byte3 << 26) | (byte4 << 18) | (byte5 << 10) | (byte6 << 2) | (byte7 >>> 6);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 63) << 52) | (byte8 << 44) | (byte9 << 36) | (byte10 << 28) | (byte11 << 20) | (byte12 << 12) | (byte13 << 4) | (byte14 >>> 4);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 15) << 54) | (byte15 << 46) | (byte16 << 38) | (byte17 << 30) | (byte18 << 22) | (byte19 << 14) | (byte20 << 6) | (byte21 >>> 2);
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte21 & 3) << 56) | (byte22 << 48) | (byte23 << 40) | (byte24 << 32) | (byte25 << 24) | (byte26 << 16) | (byte27 << 8) | byte28;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte29 << 50) | (byte30 << 42) | (byte31 << 34) | (byte32 << 26) | (byte33 << 18) | (byte34 << 10) | (byte35 << 2) | (byte36 >>> 6);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 63) << 52) | (byte37 << 44) | (byte38 << 36) | (byte39 << 28) | (byte40 << 20) | (byte41 << 12) | (byte42 << 4) | (byte43 >>> 4);
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte43 & 15) << 54) | (byte44 << 46) | (byte45 << 38) | (byte46 << 30) | (byte47 << 22) | (byte48 << 14) | (byte49 << 6) | (byte50 >>> 2);
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte50 & 3) << 56) | (byte51 << 48) | (byte52 << 40) | (byte53 << 32) | (byte54 << 24) | (byte55 << 16) | (byte56 << 8) | byte57;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte58 << 50) | (byte59 << 42) | (byte60 << 34) | (byte61 << 26) | (byte62 << 18) | (byte63 << 10) | (byte64 << 2) | (byte65 >>> 6);
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte65 & 63) << 52) | (byte66 << 44) | (byte67 << 36) | (byte68 << 28) | (byte69 << 20) | (byte70 << 12) | (byte71 << 4) | (byte72 >>> 4);
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte72 & 15) << 54) | (byte73 << 46) | (byte74 << 38) | (byte75 << 30) | (byte76 << 22) | (byte77 << 14) | (byte78 << 6) | (byte79 >>> 2);
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte79 & 3) << 56) | (byte80 << 48) | (byte81 << 40) | (byte82 << 32) | (byte83 << 24) | (byte84 << 16) | (byte85 << 8) | byte86;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte87 << 50) | (byte88 << 42) | (byte89 << 34) | (byte90 << 26) | (byte91 << 18) | (byte92 << 10) | (byte93 << 2) | (byte94 >>> 6);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 63) << 52) | (byte95 << 44) | (byte96 << 36) | (byte97 << 28) | (byte98 << 20) | (byte99 << 12) | (byte100 << 4) | (byte101 >>> 4);
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte101 & 15) << 54) | (byte102 << 46) | (byte103 << 38) | (byte104 << 30) | (byte105 << 22) | (byte106 << 14) | (byte107 << 6) | (byte108 >>> 2);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 3) << 56) | (byte109 << 48) | (byte110 << 40) | (byte111 << 32) | (byte112 << 24) | (byte113 << 16) | (byte114 << 8) | byte115;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte116 << 50) | (byte117 << 42) | (byte118 << 34) | (byte119 << 26) | (byte120 << 18) | (byte121 << 10) | (byte122 << 2) | (byte123 >>> 6);
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte123 & 63) << 52) | (byte124 << 44) | (byte125 << 36) | (byte126 << 28) | (byte127 << 20) | (byte128 << 12) | (byte129 << 4) | (byte130 >>> 4);
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte130 & 15) << 54) | (byte131 << 46) | (byte132 << 38) | (byte133 << 30) | (byte134 << 22) | (byte135 << 14) | (byte136 << 6) | (byte137 >>> 2);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 3) << 56) | (byte138 << 48) | (byte139 << 40) | (byte140 << 32) | (byte141 << 24) | (byte142 << 16) | (byte143 << 8) | byte144;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte145 << 50) | (byte146 << 42) | (byte147 << 34) | (byte148 << 26) | (byte149 << 18) | (byte150 << 10) | (byte151 << 2) | (byte152 >>> 6);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 63) << 52) | (byte153 << 44) | (byte154 << 36) | (byte155 << 28) | (byte156 << 20) | (byte157 << 12) | (byte158 << 4) | (byte159 >>> 4);
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte159 & 15) << 54) | (byte160 << 46) | (byte161 << 38) | (byte162 << 30) | (byte163 << 22) | (byte164 << 14) | (byte165 << 6) | (byte166 >>> 2);
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte166 & 3) << 56) | (byte167 << 48) | (byte168 << 40) | (byte169 << 32) | (byte170 << 24) | (byte171 << 16) | (byte172 << 8) | byte173;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte174 << 50) | (byte175 << 42) | (byte176 << 34) | (byte177 << 26) | (byte178 << 18) | (byte179 << 10) | (byte180 << 2) | (byte181 >>> 6);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 63) << 52) | (byte182 << 44) | (byte183 << 36) | (byte184 << 28) | (byte185 << 20) | (byte186 << 12) | (byte187 << 4) | (byte188 >>> 4);
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte188 & 15) << 54) | (byte189 << 46) | (byte190 << 38) | (byte191 << 30) | (byte192 << 22) | (byte193 << 14) | (byte194 << 6) | (byte195 >>> 2);
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte195 & 3) << 56) | (byte196 << 48) | (byte197 << 40) | (byte198 << 32) | (byte199 << 24) | (byte200 << 16) | (byte201 << 8) | byte202;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte203 << 50) | (byte204 << 42) | (byte205 << 34) | (byte206 << 26) | (byte207 << 18) | (byte208 << 10) | (byte209 << 2) | (byte210 >>> 6);
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte210 & 63) << 52) | (byte211 << 44) | (byte212 << 36) | (byte213 << 28) | (byte214 << 20) | (byte215 << 12) | (byte216 << 4) | (byte217 >>> 4);
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte217 & 15) << 54) | (byte218 << 46) | (byte219 << 38) | (byte220 << 30) | (byte221 << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 56) | (byte225 << 48) | (byte226 << 40) | (byte227 << 32) | (byte228 << 24) | (byte229 << 16) | (byte230 << 8) | byte231;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation59 extends BulkOperation {
+ }
+ ,
+ PACKED_59 {
- public int blocks() {
+ public int blockCount() {
return 59;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 5;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 31L) << 54) | (block1 >>> 10);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 1023L) << 49) | (block2 >>> 15);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 32767L) << 44) | (block3 >>> 20);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 1048575L) << 39) | (block4 >>> 25);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 33554431L) << 34) | (block5 >>> 30);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 1073741823L) << 29) | (block6 >>> 35);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 34359738367L) << 24) | (block7 >>> 40);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 1099511627775L) << 19) | (block8 >>> 45);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 35184372088831L) << 14) | (block9 >>> 50);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1125899906842623L) << 9) | (block10 >>> 55);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 36028797018963967L) << 4) | (block11 >>> 60);
- values[vi++] = (block11 >>> 1) & 576460752303423487L;
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 1L) << 58) | (block12 >>> 6);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 63L) << 53) | (block13 >>> 11);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 2047L) << 48) | (block14 >>> 16);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 65535L) << 43) | (block15 >>> 21);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 2097151L) << 38) | (block16 >>> 26);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 67108863L) << 33) | (block17 >>> 31);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 2147483647L) << 28) | (block18 >>> 36);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 68719476735L) << 23) | (block19 >>> 41);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 2199023255551L) << 18) | (block20 >>> 46);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 70368744177663L) << 13) | (block21 >>> 51);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 2251799813685247L) << 8) | (block22 >>> 56);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 72057594037927935L) << 3) | (block23 >>> 61);
- values[vi++] = (block23 >>> 2) & 576460752303423487L;
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 3L) << 57) | (block24 >>> 7);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 127L) << 52) | (block25 >>> 12);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 4095L) << 47) | (block26 >>> 17);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 131071L) << 42) | (block27 >>> 22);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 4194303L) << 37) | (block28 >>> 27);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 134217727L) << 32) | (block29 >>> 32);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 4294967295L) << 27) | (block30 >>> 37);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 137438953471L) << 22) | (block31 >>> 42);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 4398046511103L) << 17) | (block32 >>> 47);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 140737488355327L) << 12) | (block33 >>> 52);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 4503599627370495L) << 7) | (block34 >>> 57);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 144115188075855871L) << 2) | (block35 >>> 62);
- values[vi++] = (block35 >>> 3) & 576460752303423487L;
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 7L) << 56) | (block36 >>> 8);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 255L) << 51) | (block37 >>> 13);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 8191L) << 46) | (block38 >>> 18);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 262143L) << 41) | (block39 >>> 23);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 8388607L) << 36) | (block40 >>> 28);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 268435455L) << 31) | (block41 >>> 33);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 8589934591L) << 26) | (block42 >>> 38);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 274877906943L) << 21) | (block43 >>> 43);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 8796093022207L) << 16) | (block44 >>> 48);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 281474976710655L) << 11) | (block45 >>> 53);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 9007199254740991L) << 6) | (block46 >>> 58);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 288230376151711743L) << 1) | (block47 >>> 63);
- values[vi++] = (block47 >>> 4) & 576460752303423487L;
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 15L) << 55) | (block48 >>> 9);
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 511L) << 50) | (block49 >>> 14);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 16383L) << 45) | (block50 >>> 19);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 524287L) << 40) | (block51 >>> 24);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 16777215L) << 35) | (block52 >>> 29);
- final long block53 = blocks[bi++];
- values[vi++] = ((block52 & 536870911L) << 30) | (block53 >>> 34);
- final long block54 = blocks[bi++];
- values[vi++] = ((block53 & 17179869183L) << 25) | (block54 >>> 39);
- final long block55 = blocks[bi++];
- values[vi++] = ((block54 & 549755813887L) << 20) | (block55 >>> 44);
- final long block56 = blocks[bi++];
- values[vi++] = ((block55 & 17592186044415L) << 15) | (block56 >>> 49);
- final long block57 = blocks[bi++];
- values[vi++] = ((block56 & 562949953421311L) << 10) | (block57 >>> 54);
- final long block58 = blocks[bi++];
- values[vi++] = ((block57 & 18014398509481983L) << 5) | (block58 >>> 59);
- values[vi++] = block58 & 576460752303423487L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 5) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi++] << 1) | (values[vi] >>> 58);
- blocks[bi++] = (values[vi++] << 6) | (values[vi] >>> 53);
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi++] << 2) | (values[vi] >>> 57);
- blocks[bi++] = (values[vi++] << 7) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 3) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 4) | (values[vi] >>> 55);
- blocks[bi++] = (values[vi++] << 9) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 5;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 31L) << 54) | (block1 >>> 10);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 1023L) << 49) | (block2 >>> 15);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 32767L) << 44) | (block3 >>> 20);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 1048575L) << 39) | (block4 >>> 25);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 33554431L) << 34) | (block5 >>> 30);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 1073741823L) << 29) | (block6 >>> 35);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 34359738367L) << 24) | (block7 >>> 40);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 1099511627775L) << 19) | (block8 >>> 45);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 35184372088831L) << 14) | (block9 >>> 50);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1125899906842623L) << 9) | (block10 >>> 55);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 36028797018963967L) << 4) | (block11 >>> 60);
+ values[valuesOffset++] = (block11 >>> 1) & 576460752303423487L;
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 1L) << 58) | (block12 >>> 6);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 63L) << 53) | (block13 >>> 11);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 2047L) << 48) | (block14 >>> 16);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 65535L) << 43) | (block15 >>> 21);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 2097151L) << 38) | (block16 >>> 26);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 67108863L) << 33) | (block17 >>> 31);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 2147483647L) << 28) | (block18 >>> 36);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 68719476735L) << 23) | (block19 >>> 41);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 2199023255551L) << 18) | (block20 >>> 46);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 70368744177663L) << 13) | (block21 >>> 51);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 2251799813685247L) << 8) | (block22 >>> 56);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 72057594037927935L) << 3) | (block23 >>> 61);
+ values[valuesOffset++] = (block23 >>> 2) & 576460752303423487L;
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 3L) << 57) | (block24 >>> 7);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 127L) << 52) | (block25 >>> 12);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 4095L) << 47) | (block26 >>> 17);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 131071L) << 42) | (block27 >>> 22);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 4194303L) << 37) | (block28 >>> 27);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 134217727L) << 32) | (block29 >>> 32);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 4294967295L) << 27) | (block30 >>> 37);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 137438953471L) << 22) | (block31 >>> 42);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 4398046511103L) << 17) | (block32 >>> 47);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 140737488355327L) << 12) | (block33 >>> 52);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 4503599627370495L) << 7) | (block34 >>> 57);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 144115188075855871L) << 2) | (block35 >>> 62);
+ values[valuesOffset++] = (block35 >>> 3) & 576460752303423487L;
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 7L) << 56) | (block36 >>> 8);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 255L) << 51) | (block37 >>> 13);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 8191L) << 46) | (block38 >>> 18);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 262143L) << 41) | (block39 >>> 23);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 8388607L) << 36) | (block40 >>> 28);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 268435455L) << 31) | (block41 >>> 33);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 8589934591L) << 26) | (block42 >>> 38);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 274877906943L) << 21) | (block43 >>> 43);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 8796093022207L) << 16) | (block44 >>> 48);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 281474976710655L) << 11) | (block45 >>> 53);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 9007199254740991L) << 6) | (block46 >>> 58);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 288230376151711743L) << 1) | (block47 >>> 63);
+ values[valuesOffset++] = (block47 >>> 4) & 576460752303423487L;
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 15L) << 55) | (block48 >>> 9);
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 511L) << 50) | (block49 >>> 14);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 16383L) << 45) | (block50 >>> 19);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 524287L) << 40) | (block51 >>> 24);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 16777215L) << 35) | (block52 >>> 29);
+ final long block53 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block52 & 536870911L) << 30) | (block53 >>> 34);
+ final long block54 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block53 & 17179869183L) << 25) | (block54 >>> 39);
+ final long block55 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block54 & 549755813887L) << 20) | (block55 >>> 44);
+ final long block56 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block55 & 17592186044415L) << 15) | (block56 >>> 49);
+ final long block57 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block56 & 562949953421311L) << 10) | (block57 >>> 54);
+ final long block58 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block57 & 18014398509481983L) << 5) | (block58 >>> 59);
+ values[valuesOffset++] = block58 & 576460752303423487L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 51) | (byte1 << 43) | (byte2 << 35) | (byte3 << 27) | (byte4 << 19) | (byte5 << 11) | (byte6 << 3) | (byte7 >>> 5);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 31) << 54) | (byte8 << 46) | (byte9 << 38) | (byte10 << 30) | (byte11 << 22) | (byte12 << 14) | (byte13 << 6) | (byte14 >>> 2);
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte14 & 3) << 57) | (byte15 << 49) | (byte16 << 41) | (byte17 << 33) | (byte18 << 25) | (byte19 << 17) | (byte20 << 9) | (byte21 << 1) | (byte22 >>> 7);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 127) << 52) | (byte23 << 44) | (byte24 << 36) | (byte25 << 28) | (byte26 << 20) | (byte27 << 12) | (byte28 << 4) | (byte29 >>> 4);
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte29 & 15) << 55) | (byte30 << 47) | (byte31 << 39) | (byte32 << 31) | (byte33 << 23) | (byte34 << 15) | (byte35 << 7) | (byte36 >>> 1);
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte36 & 1) << 58) | (byte37 << 50) | (byte38 << 42) | (byte39 << 34) | (byte40 << 26) | (byte41 << 18) | (byte42 << 10) | (byte43 << 2) | (byte44 >>> 6);
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte44 & 63) << 53) | (byte45 << 45) | (byte46 << 37) | (byte47 << 29) | (byte48 << 21) | (byte49 << 13) | (byte50 << 5) | (byte51 >>> 3);
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte51 & 7) << 56) | (byte52 << 48) | (byte53 << 40) | (byte54 << 32) | (byte55 << 24) | (byte56 << 16) | (byte57 << 8) | byte58;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte59 << 51) | (byte60 << 43) | (byte61 << 35) | (byte62 << 27) | (byte63 << 19) | (byte64 << 11) | (byte65 << 3) | (byte66 >>> 5);
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte66 & 31) << 54) | (byte67 << 46) | (byte68 << 38) | (byte69 << 30) | (byte70 << 22) | (byte71 << 14) | (byte72 << 6) | (byte73 >>> 2);
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte73 & 3) << 57) | (byte74 << 49) | (byte75 << 41) | (byte76 << 33) | (byte77 << 25) | (byte78 << 17) | (byte79 << 9) | (byte80 << 1) | (byte81 >>> 7);
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte81 & 127) << 52) | (byte82 << 44) | (byte83 << 36) | (byte84 << 28) | (byte85 << 20) | (byte86 << 12) | (byte87 << 4) | (byte88 >>> 4);
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte88 & 15) << 55) | (byte89 << 47) | (byte90 << 39) | (byte91 << 31) | (byte92 << 23) | (byte93 << 15) | (byte94 << 7) | (byte95 >>> 1);
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte95 & 1) << 58) | (byte96 << 50) | (byte97 << 42) | (byte98 << 34) | (byte99 << 26) | (byte100 << 18) | (byte101 << 10) | (byte102 << 2) | (byte103 >>> 6);
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte103 & 63) << 53) | (byte104 << 45) | (byte105 << 37) | (byte106 << 29) | (byte107 << 21) | (byte108 << 13) | (byte109 << 5) | (byte110 >>> 3);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 7) << 56) | (byte111 << 48) | (byte112 << 40) | (byte113 << 32) | (byte114 << 24) | (byte115 << 16) | (byte116 << 8) | byte117;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte118 << 51) | (byte119 << 43) | (byte120 << 35) | (byte121 << 27) | (byte122 << 19) | (byte123 << 11) | (byte124 << 3) | (byte125 >>> 5);
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte125 & 31) << 54) | (byte126 << 46) | (byte127 << 38) | (byte128 << 30) | (byte129 << 22) | (byte130 << 14) | (byte131 << 6) | (byte132 >>> 2);
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte132 & 3) << 57) | (byte133 << 49) | (byte134 << 41) | (byte135 << 33) | (byte136 << 25) | (byte137 << 17) | (byte138 << 9) | (byte139 << 1) | (byte140 >>> 7);
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte140 & 127) << 52) | (byte141 << 44) | (byte142 << 36) | (byte143 << 28) | (byte144 << 20) | (byte145 << 12) | (byte146 << 4) | (byte147 >>> 4);
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 15) << 55) | (byte148 << 47) | (byte149 << 39) | (byte150 << 31) | (byte151 << 23) | (byte152 << 15) | (byte153 << 7) | (byte154 >>> 1);
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte154 & 1) << 58) | (byte155 << 50) | (byte156 << 42) | (byte157 << 34) | (byte158 << 26) | (byte159 << 18) | (byte160 << 10) | (byte161 << 2) | (byte162 >>> 6);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 63) << 53) | (byte163 << 45) | (byte164 << 37) | (byte165 << 29) | (byte166 << 21) | (byte167 << 13) | (byte168 << 5) | (byte169 >>> 3);
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte169 & 7) << 56) | (byte170 << 48) | (byte171 << 40) | (byte172 << 32) | (byte173 << 24) | (byte174 << 16) | (byte175 << 8) | byte176;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte177 << 51) | (byte178 << 43) | (byte179 << 35) | (byte180 << 27) | (byte181 << 19) | (byte182 << 11) | (byte183 << 3) | (byte184 >>> 5);
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte184 & 31) << 54) | (byte185 << 46) | (byte186 << 38) | (byte187 << 30) | (byte188 << 22) | (byte189 << 14) | (byte190 << 6) | (byte191 >>> 2);
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte191 & 3) << 57) | (byte192 << 49) | (byte193 << 41) | (byte194 << 33) | (byte195 << 25) | (byte196 << 17) | (byte197 << 9) | (byte198 << 1) | (byte199 >>> 7);
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte199 & 127) << 52) | (byte200 << 44) | (byte201 << 36) | (byte202 << 28) | (byte203 << 20) | (byte204 << 12) | (byte205 << 4) | (byte206 >>> 4);
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte206 & 15) << 55) | (byte207 << 47) | (byte208 << 39) | (byte209 << 31) | (byte210 << 23) | (byte211 << 15) | (byte212 << 7) | (byte213 >>> 1);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 1) << 58) | (byte214 << 50) | (byte215 << 42) | (byte216 << 34) | (byte217 << 26) | (byte218 << 18) | (byte219 << 10) | (byte220 << 2) | (byte221 >>> 6);
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte221 & 63) << 53) | (byte222 << 45) | (byte223 << 37) | (byte224 << 29) | (byte225 << 21) | (byte226 << 13) | (byte227 << 5) | (byte228 >>> 3);
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 7) << 56) | (byte229 << 48) | (byte230 << 40) | (byte231 << 32) | (byte232 << 24) | (byte233 << 16) | (byte234 << 8) | byte235;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte236 << 51) | (byte237 << 43) | (byte238 << 35) | (byte239 << 27) | (byte240 << 19) | (byte241 << 11) | (byte242 << 3) | (byte243 >>> 5);
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte243 & 31) << 54) | (byte244 << 46) | (byte245 << 38) | (byte246 << 30) | (byte247 << 22) | (byte248 << 14) | (byte249 << 6) | (byte250 >>> 2);
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte250 & 3) << 57) | (byte251 << 49) | (byte252 << 41) | (byte253 << 33) | (byte254 << 25) | (byte255 << 17) | (byte256 << 9) | (byte257 << 1) | (byte258 >>> 7);
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte258 & 127) << 52) | (byte259 << 44) | (byte260 << 36) | (byte261 << 28) | (byte262 << 20) | (byte263 << 12) | (byte264 << 4) | (byte265 >>> 4);
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte265 & 15) << 55) | (byte266 << 47) | (byte267 << 39) | (byte268 << 31) | (byte269 << 23) | (byte270 << 15) | (byte271 << 7) | (byte272 >>> 1);
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte272 & 1) << 58) | (byte273 << 50) | (byte274 << 42) | (byte275 << 34) | (byte276 << 26) | (byte277 << 18) | (byte278 << 10) | (byte279 << 2) | (byte280 >>> 6);
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte280 & 63) << 53) | (byte281 << 45) | (byte282 << 37) | (byte283 << 29) | (byte284 << 21) | (byte285 << 13) | (byte286 << 5) | (byte287 >>> 3);
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte287 & 7) << 56) | (byte288 << 48) | (byte289 << 40) | (byte290 << 32) | (byte291 << 24) | (byte292 << 16) | (byte293 << 8) | byte294;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte295 << 51) | (byte296 << 43) | (byte297 << 35) | (byte298 << 27) | (byte299 << 19) | (byte300 << 11) | (byte301 << 3) | (byte302 >>> 5);
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte302 & 31) << 54) | (byte303 << 46) | (byte304 << 38) | (byte305 << 30) | (byte306 << 22) | (byte307 << 14) | (byte308 << 6) | (byte309 >>> 2);
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte309 & 3) << 57) | (byte310 << 49) | (byte311 << 41) | (byte312 << 33) | (byte313 << 25) | (byte314 << 17) | (byte315 << 9) | (byte316 << 1) | (byte317 >>> 7);
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte317 & 127) << 52) | (byte318 << 44) | (byte319 << 36) | (byte320 << 28) | (byte321 << 20) | (byte322 << 12) | (byte323 << 4) | (byte324 >>> 4);
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte324 & 15) << 55) | (byte325 << 47) | (byte326 << 39) | (byte327 << 31) | (byte328 << 23) | (byte329 << 15) | (byte330 << 7) | (byte331 >>> 1);
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte331 & 1) << 58) | (byte332 << 50) | (byte333 << 42) | (byte334 << 34) | (byte335 << 26) | (byte336 << 18) | (byte337 << 10) | (byte338 << 2) | (byte339 >>> 6);
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte339 & 63) << 53) | (byte340 << 45) | (byte341 << 37) | (byte342 << 29) | (byte343 << 21) | (byte344 << 13) | (byte345 << 5) | (byte346 >>> 3);
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte346 & 7) << 56) | (byte347 << 48) | (byte348 << 40) | (byte349 << 32) | (byte350 << 24) | (byte351 << 16) | (byte352 << 8) | byte353;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte354 << 51) | (byte355 << 43) | (byte356 << 35) | (byte357 << 27) | (byte358 << 19) | (byte359 << 11) | (byte360 << 3) | (byte361 >>> 5);
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte361 & 31) << 54) | (byte362 << 46) | (byte363 << 38) | (byte364 << 30) | (byte365 << 22) | (byte366 << 14) | (byte367 << 6) | (byte368 >>> 2);
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte368 & 3) << 57) | (byte369 << 49) | (byte370 << 41) | (byte371 << 33) | (byte372 << 25) | (byte373 << 17) | (byte374 << 9) | (byte375 << 1) | (byte376 >>> 7);
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte376 & 127) << 52) | (byte377 << 44) | (byte378 << 36) | (byte379 << 28) | (byte380 << 20) | (byte381 << 12) | (byte382 << 4) | (byte383 >>> 4);
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte383 & 15) << 55) | (byte384 << 47) | (byte385 << 39) | (byte386 << 31) | (byte387 << 23) | (byte388 << 15) | (byte389 << 7) | (byte390 >>> 1);
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte390 & 1) << 58) | (byte391 << 50) | (byte392 << 42) | (byte393 << 34) | (byte394 << 26) | (byte395 << 18) | (byte396 << 10) | (byte397 << 2) | (byte398 >>> 6);
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte398 & 63) << 53) | (byte399 << 45) | (byte400 << 37) | (byte401 << 29) | (byte402 << 21) | (byte403 << 13) | (byte404 << 5) | (byte405 >>> 3);
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte405 & 7) << 56) | (byte406 << 48) | (byte407 << 40) | (byte408 << 32) | (byte409 << 24) | (byte410 << 16) | (byte411 << 8) | byte412;
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte413 << 51) | (byte414 << 43) | (byte415 << 35) | (byte416 << 27) | (byte417 << 19) | (byte418 << 11) | (byte419 << 3) | (byte420 >>> 5);
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ final long byte424 = blocks[blocksOffset++] & 0xFF;
+ final long byte425 = blocks[blocksOffset++] & 0xFF;
+ final long byte426 = blocks[blocksOffset++] & 0xFF;
+ final long byte427 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte420 & 31) << 54) | (byte421 << 46) | (byte422 << 38) | (byte423 << 30) | (byte424 << 22) | (byte425 << 14) | (byte426 << 6) | (byte427 >>> 2);
+ final long byte428 = blocks[blocksOffset++] & 0xFF;
+ final long byte429 = blocks[blocksOffset++] & 0xFF;
+ final long byte430 = blocks[blocksOffset++] & 0xFF;
+ final long byte431 = blocks[blocksOffset++] & 0xFF;
+ final long byte432 = blocks[blocksOffset++] & 0xFF;
+ final long byte433 = blocks[blocksOffset++] & 0xFF;
+ final long byte434 = blocks[blocksOffset++] & 0xFF;
+ final long byte435 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte427 & 3) << 57) | (byte428 << 49) | (byte429 << 41) | (byte430 << 33) | (byte431 << 25) | (byte432 << 17) | (byte433 << 9) | (byte434 << 1) | (byte435 >>> 7);
+ final long byte436 = blocks[blocksOffset++] & 0xFF;
+ final long byte437 = blocks[blocksOffset++] & 0xFF;
+ final long byte438 = blocks[blocksOffset++] & 0xFF;
+ final long byte439 = blocks[blocksOffset++] & 0xFF;
+ final long byte440 = blocks[blocksOffset++] & 0xFF;
+ final long byte441 = blocks[blocksOffset++] & 0xFF;
+ final long byte442 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte435 & 127) << 52) | (byte436 << 44) | (byte437 << 36) | (byte438 << 28) | (byte439 << 20) | (byte440 << 12) | (byte441 << 4) | (byte442 >>> 4);
+ final long byte443 = blocks[blocksOffset++] & 0xFF;
+ final long byte444 = blocks[blocksOffset++] & 0xFF;
+ final long byte445 = blocks[blocksOffset++] & 0xFF;
+ final long byte446 = blocks[blocksOffset++] & 0xFF;
+ final long byte447 = blocks[blocksOffset++] & 0xFF;
+ final long byte448 = blocks[blocksOffset++] & 0xFF;
+ final long byte449 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte442 & 15) << 55) | (byte443 << 47) | (byte444 << 39) | (byte445 << 31) | (byte446 << 23) | (byte447 << 15) | (byte448 << 7) | (byte449 >>> 1);
+ final long byte450 = blocks[blocksOffset++] & 0xFF;
+ final long byte451 = blocks[blocksOffset++] & 0xFF;
+ final long byte452 = blocks[blocksOffset++] & 0xFF;
+ final long byte453 = blocks[blocksOffset++] & 0xFF;
+ final long byte454 = blocks[blocksOffset++] & 0xFF;
+ final long byte455 = blocks[blocksOffset++] & 0xFF;
+ final long byte456 = blocks[blocksOffset++] & 0xFF;
+ final long byte457 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte449 & 1) << 58) | (byte450 << 50) | (byte451 << 42) | (byte452 << 34) | (byte453 << 26) | (byte454 << 18) | (byte455 << 10) | (byte456 << 2) | (byte457 >>> 6);
+ final long byte458 = blocks[blocksOffset++] & 0xFF;
+ final long byte459 = blocks[blocksOffset++] & 0xFF;
+ final long byte460 = blocks[blocksOffset++] & 0xFF;
+ final long byte461 = blocks[blocksOffset++] & 0xFF;
+ final long byte462 = blocks[blocksOffset++] & 0xFF;
+ final long byte463 = blocks[blocksOffset++] & 0xFF;
+ final long byte464 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte457 & 63) << 53) | (byte458 << 45) | (byte459 << 37) | (byte460 << 29) | (byte461 << 21) | (byte462 << 13) | (byte463 << 5) | (byte464 >>> 3);
+ final long byte465 = blocks[blocksOffset++] & 0xFF;
+ final long byte466 = blocks[blocksOffset++] & 0xFF;
+ final long byte467 = blocks[blocksOffset++] & 0xFF;
+ final long byte468 = blocks[blocksOffset++] & 0xFF;
+ final long byte469 = blocks[blocksOffset++] & 0xFF;
+ final long byte470 = blocks[blocksOffset++] & 0xFF;
+ final long byte471 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte464 & 7) << 56) | (byte465 << 48) | (byte466 << 40) | (byte467 << 32) | (byte468 << 24) | (byte469 << 16) | (byte470 << 8) | byte471;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 58);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 53);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 57);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 55);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 58);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 53);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 57);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 55);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation60 extends BulkOperation {
+ }
+ ,
+ PACKED_60 {
- public int blocks() {
+ public int blockCount() {
return 15;
}
- public int values() {
+ public int valueCount() {
return 16;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 4;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 15L) << 56) | (block1 >>> 8);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 255L) << 52) | (block2 >>> 12);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 4095L) << 48) | (block3 >>> 16);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 65535L) << 44) | (block4 >>> 20);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1048575L) << 40) | (block5 >>> 24);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 16777215L) << 36) | (block6 >>> 28);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 268435455L) << 32) | (block7 >>> 32);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 4294967295L) << 28) | (block8 >>> 36);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 68719476735L) << 24) | (block9 >>> 40);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1099511627775L) << 20) | (block10 >>> 44);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 17592186044415L) << 16) | (block11 >>> 48);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 281474976710655L) << 12) | (block12 >>> 52);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 4503599627370495L) << 8) | (block13 >>> 56);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 72057594037927935L) << 4) | (block14 >>> 60);
- values[vi++] = block14 & 1152921504606846975L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 4) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 4;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 15L) << 56) | (block1 >>> 8);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 255L) << 52) | (block2 >>> 12);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 4095L) << 48) | (block3 >>> 16);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 65535L) << 44) | (block4 >>> 20);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1048575L) << 40) | (block5 >>> 24);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 16777215L) << 36) | (block6 >>> 28);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 268435455L) << 32) | (block7 >>> 32);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 4294967295L) << 28) | (block8 >>> 36);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 68719476735L) << 24) | (block9 >>> 40);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1099511627775L) << 20) | (block10 >>> 44);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 17592186044415L) << 16) | (block11 >>> 48);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 281474976710655L) << 12) | (block12 >>> 52);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 4503599627370495L) << 8) | (block13 >>> 56);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 72057594037927935L) << 4) | (block14 >>> 60);
+ values[valuesOffset++] = block14 & 1152921504606846975L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 52) | (byte1 << 44) | (byte2 << 36) | (byte3 << 28) | (byte4 << 20) | (byte5 << 12) | (byte6 << 4) | (byte7 >>> 4);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 15) << 56) | (byte8 << 48) | (byte9 << 40) | (byte10 << 32) | (byte11 << 24) | (byte12 << 16) | (byte13 << 8) | byte14;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte15 << 52) | (byte16 << 44) | (byte17 << 36) | (byte18 << 28) | (byte19 << 20) | (byte20 << 12) | (byte21 << 4) | (byte22 >>> 4);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 15) << 56) | (byte23 << 48) | (byte24 << 40) | (byte25 << 32) | (byte26 << 24) | (byte27 << 16) | (byte28 << 8) | byte29;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte30 << 52) | (byte31 << 44) | (byte32 << 36) | (byte33 << 28) | (byte34 << 20) | (byte35 << 12) | (byte36 << 4) | (byte37 >>> 4);
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte37 & 15) << 56) | (byte38 << 48) | (byte39 << 40) | (byte40 << 32) | (byte41 << 24) | (byte42 << 16) | (byte43 << 8) | byte44;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte45 << 52) | (byte46 << 44) | (byte47 << 36) | (byte48 << 28) | (byte49 << 20) | (byte50 << 12) | (byte51 << 4) | (byte52 >>> 4);
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte52 & 15) << 56) | (byte53 << 48) | (byte54 << 40) | (byte55 << 32) | (byte56 << 24) | (byte57 << 16) | (byte58 << 8) | byte59;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte60 << 52) | (byte61 << 44) | (byte62 << 36) | (byte63 << 28) | (byte64 << 20) | (byte65 << 12) | (byte66 << 4) | (byte67 >>> 4);
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte67 & 15) << 56) | (byte68 << 48) | (byte69 << 40) | (byte70 << 32) | (byte71 << 24) | (byte72 << 16) | (byte73 << 8) | byte74;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte75 << 52) | (byte76 << 44) | (byte77 << 36) | (byte78 << 28) | (byte79 << 20) | (byte80 << 12) | (byte81 << 4) | (byte82 >>> 4);
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte82 & 15) << 56) | (byte83 << 48) | (byte84 << 40) | (byte85 << 32) | (byte86 << 24) | (byte87 << 16) | (byte88 << 8) | byte89;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte90 << 52) | (byte91 << 44) | (byte92 << 36) | (byte93 << 28) | (byte94 << 20) | (byte95 << 12) | (byte96 << 4) | (byte97 >>> 4);
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte97 & 15) << 56) | (byte98 << 48) | (byte99 << 40) | (byte100 << 32) | (byte101 << 24) | (byte102 << 16) | (byte103 << 8) | byte104;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte105 << 52) | (byte106 << 44) | (byte107 << 36) | (byte108 << 28) | (byte109 << 20) | (byte110 << 12) | (byte111 << 4) | (byte112 >>> 4);
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte112 & 15) << 56) | (byte113 << 48) | (byte114 << 40) | (byte115 << 32) | (byte116 << 24) | (byte117 << 16) | (byte118 << 8) | byte119;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation61 extends BulkOperation {
+ }
+ ,
+ PACKED_61 {
- public int blocks() {
+ public int blockCount() {
return 61;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 3;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 7L) << 58) | (block1 >>> 6);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 63L) << 55) | (block2 >>> 9);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 511L) << 52) | (block3 >>> 12);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 4095L) << 49) | (block4 >>> 15);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 32767L) << 46) | (block5 >>> 18);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 262143L) << 43) | (block6 >>> 21);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 2097151L) << 40) | (block7 >>> 24);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 16777215L) << 37) | (block8 >>> 27);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 134217727L) << 34) | (block9 >>> 30);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1073741823L) << 31) | (block10 >>> 33);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 8589934591L) << 28) | (block11 >>> 36);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 68719476735L) << 25) | (block12 >>> 39);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 549755813887L) << 22) | (block13 >>> 42);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 4398046511103L) << 19) | (block14 >>> 45);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 35184372088831L) << 16) | (block15 >>> 48);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 281474976710655L) << 13) | (block16 >>> 51);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 2251799813685247L) << 10) | (block17 >>> 54);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 18014398509481983L) << 7) | (block18 >>> 57);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 144115188075855871L) << 4) | (block19 >>> 60);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1152921504606846975L) << 1) | (block20 >>> 63);
- values[vi++] = (block20 >>> 2) & 2305843009213693951L;
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 3L) << 59) | (block21 >>> 5);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 31L) << 56) | (block22 >>> 8);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 255L) << 53) | (block23 >>> 11);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 2047L) << 50) | (block24 >>> 14);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 16383L) << 47) | (block25 >>> 17);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 131071L) << 44) | (block26 >>> 20);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 1048575L) << 41) | (block27 >>> 23);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 8388607L) << 38) | (block28 >>> 26);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 67108863L) << 35) | (block29 >>> 29);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 536870911L) << 32) | (block30 >>> 32);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 4294967295L) << 29) | (block31 >>> 35);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 34359738367L) << 26) | (block32 >>> 38);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 274877906943L) << 23) | (block33 >>> 41);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 2199023255551L) << 20) | (block34 >>> 44);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 17592186044415L) << 17) | (block35 >>> 47);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 140737488355327L) << 14) | (block36 >>> 50);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 1125899906842623L) << 11) | (block37 >>> 53);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 9007199254740991L) << 8) | (block38 >>> 56);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 72057594037927935L) << 5) | (block39 >>> 59);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 576460752303423487L) << 2) | (block40 >>> 62);
- values[vi++] = (block40 >>> 1) & 2305843009213693951L;
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 1L) << 60) | (block41 >>> 4);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 15L) << 57) | (block42 >>> 7);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 127L) << 54) | (block43 >>> 10);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 1023L) << 51) | (block44 >>> 13);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 8191L) << 48) | (block45 >>> 16);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 65535L) << 45) | (block46 >>> 19);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 524287L) << 42) | (block47 >>> 22);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 4194303L) << 39) | (block48 >>> 25);
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 33554431L) << 36) | (block49 >>> 28);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 268435455L) << 33) | (block50 >>> 31);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 2147483647L) << 30) | (block51 >>> 34);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 17179869183L) << 27) | (block52 >>> 37);
- final long block53 = blocks[bi++];
- values[vi++] = ((block52 & 137438953471L) << 24) | (block53 >>> 40);
- final long block54 = blocks[bi++];
- values[vi++] = ((block53 & 1099511627775L) << 21) | (block54 >>> 43);
- final long block55 = blocks[bi++];
- values[vi++] = ((block54 & 8796093022207L) << 18) | (block55 >>> 46);
- final long block56 = blocks[bi++];
- values[vi++] = ((block55 & 70368744177663L) << 15) | (block56 >>> 49);
- final long block57 = blocks[bi++];
- values[vi++] = ((block56 & 562949953421311L) << 12) | (block57 >>> 52);
- final long block58 = blocks[bi++];
- values[vi++] = ((block57 & 4503599627370495L) << 9) | (block58 >>> 55);
- final long block59 = blocks[bi++];
- values[vi++] = ((block58 & 36028797018963967L) << 6) | (block59 >>> 58);
- final long block60 = blocks[bi++];
- values[vi++] = ((block59 & 288230376151711743L) << 3) | (block60 >>> 61);
- values[vi++] = block60 & 2305843009213693951L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 3) | (values[vi] >>> 58);
- blocks[bi++] = (values[vi++] << 6) | (values[vi] >>> 55);
- blocks[bi++] = (values[vi++] << 9) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | (values[vi++] << 2) | (values[vi] >>> 59);
- blocks[bi++] = (values[vi++] << 5) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 53);
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi++] << 1) | (values[vi] >>> 60);
- blocks[bi++] = (values[vi++] << 4) | (values[vi] >>> 57);
- blocks[bi++] = (values[vi++] << 7) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 3;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 7L) << 58) | (block1 >>> 6);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 63L) << 55) | (block2 >>> 9);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 511L) << 52) | (block3 >>> 12);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 4095L) << 49) | (block4 >>> 15);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 32767L) << 46) | (block5 >>> 18);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 262143L) << 43) | (block6 >>> 21);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 2097151L) << 40) | (block7 >>> 24);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 16777215L) << 37) | (block8 >>> 27);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 134217727L) << 34) | (block9 >>> 30);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1073741823L) << 31) | (block10 >>> 33);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 8589934591L) << 28) | (block11 >>> 36);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 68719476735L) << 25) | (block12 >>> 39);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 549755813887L) << 22) | (block13 >>> 42);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 4398046511103L) << 19) | (block14 >>> 45);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 35184372088831L) << 16) | (block15 >>> 48);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 281474976710655L) << 13) | (block16 >>> 51);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 2251799813685247L) << 10) | (block17 >>> 54);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 18014398509481983L) << 7) | (block18 >>> 57);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 144115188075855871L) << 4) | (block19 >>> 60);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1152921504606846975L) << 1) | (block20 >>> 63);
+ values[valuesOffset++] = (block20 >>> 2) & 2305843009213693951L;
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 3L) << 59) | (block21 >>> 5);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 31L) << 56) | (block22 >>> 8);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 255L) << 53) | (block23 >>> 11);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 2047L) << 50) | (block24 >>> 14);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 16383L) << 47) | (block25 >>> 17);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 131071L) << 44) | (block26 >>> 20);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 1048575L) << 41) | (block27 >>> 23);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 8388607L) << 38) | (block28 >>> 26);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 67108863L) << 35) | (block29 >>> 29);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 536870911L) << 32) | (block30 >>> 32);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 4294967295L) << 29) | (block31 >>> 35);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 34359738367L) << 26) | (block32 >>> 38);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 274877906943L) << 23) | (block33 >>> 41);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 2199023255551L) << 20) | (block34 >>> 44);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 17592186044415L) << 17) | (block35 >>> 47);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 140737488355327L) << 14) | (block36 >>> 50);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 1125899906842623L) << 11) | (block37 >>> 53);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 9007199254740991L) << 8) | (block38 >>> 56);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 72057594037927935L) << 5) | (block39 >>> 59);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 576460752303423487L) << 2) | (block40 >>> 62);
+ values[valuesOffset++] = (block40 >>> 1) & 2305843009213693951L;
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 1L) << 60) | (block41 >>> 4);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 15L) << 57) | (block42 >>> 7);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 127L) << 54) | (block43 >>> 10);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 1023L) << 51) | (block44 >>> 13);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 8191L) << 48) | (block45 >>> 16);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 65535L) << 45) | (block46 >>> 19);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 524287L) << 42) | (block47 >>> 22);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 4194303L) << 39) | (block48 >>> 25);
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 33554431L) << 36) | (block49 >>> 28);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 268435455L) << 33) | (block50 >>> 31);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 2147483647L) << 30) | (block51 >>> 34);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 17179869183L) << 27) | (block52 >>> 37);
+ final long block53 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block52 & 137438953471L) << 24) | (block53 >>> 40);
+ final long block54 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block53 & 1099511627775L) << 21) | (block54 >>> 43);
+ final long block55 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block54 & 8796093022207L) << 18) | (block55 >>> 46);
+ final long block56 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block55 & 70368744177663L) << 15) | (block56 >>> 49);
+ final long block57 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block56 & 562949953421311L) << 12) | (block57 >>> 52);
+ final long block58 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block57 & 4503599627370495L) << 9) | (block58 >>> 55);
+ final long block59 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block58 & 36028797018963967L) << 6) | (block59 >>> 58);
+ final long block60 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block59 & 288230376151711743L) << 3) | (block60 >>> 61);
+ values[valuesOffset++] = block60 & 2305843009213693951L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 53) | (byte1 << 45) | (byte2 << 37) | (byte3 << 29) | (byte4 << 21) | (byte5 << 13) | (byte6 << 5) | (byte7 >>> 3);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 7) << 58) | (byte8 << 50) | (byte9 << 42) | (byte10 << 34) | (byte11 << 26) | (byte12 << 18) | (byte13 << 10) | (byte14 << 2) | (byte15 >>> 6);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 63) << 55) | (byte16 << 47) | (byte17 << 39) | (byte18 << 31) | (byte19 << 23) | (byte20 << 15) | (byte21 << 7) | (byte22 >>> 1);
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte22 & 1) << 60) | (byte23 << 52) | (byte24 << 44) | (byte25 << 36) | (byte26 << 28) | (byte27 << 20) | (byte28 << 12) | (byte29 << 4) | (byte30 >>> 4);
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte30 & 15) << 57) | (byte31 << 49) | (byte32 << 41) | (byte33 << 33) | (byte34 << 25) | (byte35 << 17) | (byte36 << 9) | (byte37 << 1) | (byte38 >>> 7);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 127) << 54) | (byte39 << 46) | (byte40 << 38) | (byte41 << 30) | (byte42 << 22) | (byte43 << 14) | (byte44 << 6) | (byte45 >>> 2);
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte45 & 3) << 59) | (byte46 << 51) | (byte47 << 43) | (byte48 << 35) | (byte49 << 27) | (byte50 << 19) | (byte51 << 11) | (byte52 << 3) | (byte53 >>> 5);
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte53 & 31) << 56) | (byte54 << 48) | (byte55 << 40) | (byte56 << 32) | (byte57 << 24) | (byte58 << 16) | (byte59 << 8) | byte60;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte61 << 53) | (byte62 << 45) | (byte63 << 37) | (byte64 << 29) | (byte65 << 21) | (byte66 << 13) | (byte67 << 5) | (byte68 >>> 3);
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte68 & 7) << 58) | (byte69 << 50) | (byte70 << 42) | (byte71 << 34) | (byte72 << 26) | (byte73 << 18) | (byte74 << 10) | (byte75 << 2) | (byte76 >>> 6);
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte76 & 63) << 55) | (byte77 << 47) | (byte78 << 39) | (byte79 << 31) | (byte80 << 23) | (byte81 << 15) | (byte82 << 7) | (byte83 >>> 1);
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte83 & 1) << 60) | (byte84 << 52) | (byte85 << 44) | (byte86 << 36) | (byte87 << 28) | (byte88 << 20) | (byte89 << 12) | (byte90 << 4) | (byte91 >>> 4);
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte91 & 15) << 57) | (byte92 << 49) | (byte93 << 41) | (byte94 << 33) | (byte95 << 25) | (byte96 << 17) | (byte97 << 9) | (byte98 << 1) | (byte99 >>> 7);
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte99 & 127) << 54) | (byte100 << 46) | (byte101 << 38) | (byte102 << 30) | (byte103 << 22) | (byte104 << 14) | (byte105 << 6) | (byte106 >>> 2);
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte106 & 3) << 59) | (byte107 << 51) | (byte108 << 43) | (byte109 << 35) | (byte110 << 27) | (byte111 << 19) | (byte112 << 11) | (byte113 << 3) | (byte114 >>> 5);
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte114 & 31) << 56) | (byte115 << 48) | (byte116 << 40) | (byte117 << 32) | (byte118 << 24) | (byte119 << 16) | (byte120 << 8) | byte121;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte122 << 53) | (byte123 << 45) | (byte124 << 37) | (byte125 << 29) | (byte126 << 21) | (byte127 << 13) | (byte128 << 5) | (byte129 >>> 3);
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte129 & 7) << 58) | (byte130 << 50) | (byte131 << 42) | (byte132 << 34) | (byte133 << 26) | (byte134 << 18) | (byte135 << 10) | (byte136 << 2) | (byte137 >>> 6);
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte137 & 63) << 55) | (byte138 << 47) | (byte139 << 39) | (byte140 << 31) | (byte141 << 23) | (byte142 << 15) | (byte143 << 7) | (byte144 >>> 1);
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte144 & 1) << 60) | (byte145 << 52) | (byte146 << 44) | (byte147 << 36) | (byte148 << 28) | (byte149 << 20) | (byte150 << 12) | (byte151 << 4) | (byte152 >>> 4);
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte152 & 15) << 57) | (byte153 << 49) | (byte154 << 41) | (byte155 << 33) | (byte156 << 25) | (byte157 << 17) | (byte158 << 9) | (byte159 << 1) | (byte160 >>> 7);
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte160 & 127) << 54) | (byte161 << 46) | (byte162 << 38) | (byte163 << 30) | (byte164 << 22) | (byte165 << 14) | (byte166 << 6) | (byte167 >>> 2);
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte167 & 3) << 59) | (byte168 << 51) | (byte169 << 43) | (byte170 << 35) | (byte171 << 27) | (byte172 << 19) | (byte173 << 11) | (byte174 << 3) | (byte175 >>> 5);
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte175 & 31) << 56) | (byte176 << 48) | (byte177 << 40) | (byte178 << 32) | (byte179 << 24) | (byte180 << 16) | (byte181 << 8) | byte182;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte183 << 53) | (byte184 << 45) | (byte185 << 37) | (byte186 << 29) | (byte187 << 21) | (byte188 << 13) | (byte189 << 5) | (byte190 >>> 3);
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte190 & 7) << 58) | (byte191 << 50) | (byte192 << 42) | (byte193 << 34) | (byte194 << 26) | (byte195 << 18) | (byte196 << 10) | (byte197 << 2) | (byte198 >>> 6);
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte198 & 63) << 55) | (byte199 << 47) | (byte200 << 39) | (byte201 << 31) | (byte202 << 23) | (byte203 << 15) | (byte204 << 7) | (byte205 >>> 1);
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte205 & 1) << 60) | (byte206 << 52) | (byte207 << 44) | (byte208 << 36) | (byte209 << 28) | (byte210 << 20) | (byte211 << 12) | (byte212 << 4) | (byte213 >>> 4);
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte213 & 15) << 57) | (byte214 << 49) | (byte215 << 41) | (byte216 << 33) | (byte217 << 25) | (byte218 << 17) | (byte219 << 9) | (byte220 << 1) | (byte221 >>> 7);
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte221 & 127) << 54) | (byte222 << 46) | (byte223 << 38) | (byte224 << 30) | (byte225 << 22) | (byte226 << 14) | (byte227 << 6) | (byte228 >>> 2);
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 3) << 59) | (byte229 << 51) | (byte230 << 43) | (byte231 << 35) | (byte232 << 27) | (byte233 << 19) | (byte234 << 11) | (byte235 << 3) | (byte236 >>> 5);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 31) << 56) | (byte237 << 48) | (byte238 << 40) | (byte239 << 32) | (byte240 << 24) | (byte241 << 16) | (byte242 << 8) | byte243;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte244 << 53) | (byte245 << 45) | (byte246 << 37) | (byte247 << 29) | (byte248 << 21) | (byte249 << 13) | (byte250 << 5) | (byte251 >>> 3);
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte251 & 7) << 58) | (byte252 << 50) | (byte253 << 42) | (byte254 << 34) | (byte255 << 26) | (byte256 << 18) | (byte257 << 10) | (byte258 << 2) | (byte259 >>> 6);
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte259 & 63) << 55) | (byte260 << 47) | (byte261 << 39) | (byte262 << 31) | (byte263 << 23) | (byte264 << 15) | (byte265 << 7) | (byte266 >>> 1);
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte266 & 1) << 60) | (byte267 << 52) | (byte268 << 44) | (byte269 << 36) | (byte270 << 28) | (byte271 << 20) | (byte272 << 12) | (byte273 << 4) | (byte274 >>> 4);
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte274 & 15) << 57) | (byte275 << 49) | (byte276 << 41) | (byte277 << 33) | (byte278 << 25) | (byte279 << 17) | (byte280 << 9) | (byte281 << 1) | (byte282 >>> 7);
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte282 & 127) << 54) | (byte283 << 46) | (byte284 << 38) | (byte285 << 30) | (byte286 << 22) | (byte287 << 14) | (byte288 << 6) | (byte289 >>> 2);
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte289 & 3) << 59) | (byte290 << 51) | (byte291 << 43) | (byte292 << 35) | (byte293 << 27) | (byte294 << 19) | (byte295 << 11) | (byte296 << 3) | (byte297 >>> 5);
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte297 & 31) << 56) | (byte298 << 48) | (byte299 << 40) | (byte300 << 32) | (byte301 << 24) | (byte302 << 16) | (byte303 << 8) | byte304;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte305 << 53) | (byte306 << 45) | (byte307 << 37) | (byte308 << 29) | (byte309 << 21) | (byte310 << 13) | (byte311 << 5) | (byte312 >>> 3);
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte312 & 7) << 58) | (byte313 << 50) | (byte314 << 42) | (byte315 << 34) | (byte316 << 26) | (byte317 << 18) | (byte318 << 10) | (byte319 << 2) | (byte320 >>> 6);
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte320 & 63) << 55) | (byte321 << 47) | (byte322 << 39) | (byte323 << 31) | (byte324 << 23) | (byte325 << 15) | (byte326 << 7) | (byte327 >>> 1);
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte327 & 1) << 60) | (byte328 << 52) | (byte329 << 44) | (byte330 << 36) | (byte331 << 28) | (byte332 << 20) | (byte333 << 12) | (byte334 << 4) | (byte335 >>> 4);
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte335 & 15) << 57) | (byte336 << 49) | (byte337 << 41) | (byte338 << 33) | (byte339 << 25) | (byte340 << 17) | (byte341 << 9) | (byte342 << 1) | (byte343 >>> 7);
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte343 & 127) << 54) | (byte344 << 46) | (byte345 << 38) | (byte346 << 30) | (byte347 << 22) | (byte348 << 14) | (byte349 << 6) | (byte350 >>> 2);
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte350 & 3) << 59) | (byte351 << 51) | (byte352 << 43) | (byte353 << 35) | (byte354 << 27) | (byte355 << 19) | (byte356 << 11) | (byte357 << 3) | (byte358 >>> 5);
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte358 & 31) << 56) | (byte359 << 48) | (byte360 << 40) | (byte361 << 32) | (byte362 << 24) | (byte363 << 16) | (byte364 << 8) | byte365;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte366 << 53) | (byte367 << 45) | (byte368 << 37) | (byte369 << 29) | (byte370 << 21) | (byte371 << 13) | (byte372 << 5) | (byte373 >>> 3);
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte373 & 7) << 58) | (byte374 << 50) | (byte375 << 42) | (byte376 << 34) | (byte377 << 26) | (byte378 << 18) | (byte379 << 10) | (byte380 << 2) | (byte381 >>> 6);
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte381 & 63) << 55) | (byte382 << 47) | (byte383 << 39) | (byte384 << 31) | (byte385 << 23) | (byte386 << 15) | (byte387 << 7) | (byte388 >>> 1);
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte388 & 1) << 60) | (byte389 << 52) | (byte390 << 44) | (byte391 << 36) | (byte392 << 28) | (byte393 << 20) | (byte394 << 12) | (byte395 << 4) | (byte396 >>> 4);
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte396 & 15) << 57) | (byte397 << 49) | (byte398 << 41) | (byte399 << 33) | (byte400 << 25) | (byte401 << 17) | (byte402 << 9) | (byte403 << 1) | (byte404 >>> 7);
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte404 & 127) << 54) | (byte405 << 46) | (byte406 << 38) | (byte407 << 30) | (byte408 << 22) | (byte409 << 14) | (byte410 << 6) | (byte411 >>> 2);
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte411 & 3) << 59) | (byte412 << 51) | (byte413 << 43) | (byte414 << 35) | (byte415 << 27) | (byte416 << 19) | (byte417 << 11) | (byte418 << 3) | (byte419 >>> 5);
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ final long byte424 = blocks[blocksOffset++] & 0xFF;
+ final long byte425 = blocks[blocksOffset++] & 0xFF;
+ final long byte426 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte419 & 31) << 56) | (byte420 << 48) | (byte421 << 40) | (byte422 << 32) | (byte423 << 24) | (byte424 << 16) | (byte425 << 8) | byte426;
+ final long byte427 = blocks[blocksOffset++] & 0xFF;
+ final long byte428 = blocks[blocksOffset++] & 0xFF;
+ final long byte429 = blocks[blocksOffset++] & 0xFF;
+ final long byte430 = blocks[blocksOffset++] & 0xFF;
+ final long byte431 = blocks[blocksOffset++] & 0xFF;
+ final long byte432 = blocks[blocksOffset++] & 0xFF;
+ final long byte433 = blocks[blocksOffset++] & 0xFF;
+ final long byte434 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte427 << 53) | (byte428 << 45) | (byte429 << 37) | (byte430 << 29) | (byte431 << 21) | (byte432 << 13) | (byte433 << 5) | (byte434 >>> 3);
+ final long byte435 = blocks[blocksOffset++] & 0xFF;
+ final long byte436 = blocks[blocksOffset++] & 0xFF;
+ final long byte437 = blocks[blocksOffset++] & 0xFF;
+ final long byte438 = blocks[blocksOffset++] & 0xFF;
+ final long byte439 = blocks[blocksOffset++] & 0xFF;
+ final long byte440 = blocks[blocksOffset++] & 0xFF;
+ final long byte441 = blocks[blocksOffset++] & 0xFF;
+ final long byte442 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte434 & 7) << 58) | (byte435 << 50) | (byte436 << 42) | (byte437 << 34) | (byte438 << 26) | (byte439 << 18) | (byte440 << 10) | (byte441 << 2) | (byte442 >>> 6);
+ final long byte443 = blocks[blocksOffset++] & 0xFF;
+ final long byte444 = blocks[blocksOffset++] & 0xFF;
+ final long byte445 = blocks[blocksOffset++] & 0xFF;
+ final long byte446 = blocks[blocksOffset++] & 0xFF;
+ final long byte447 = blocks[blocksOffset++] & 0xFF;
+ final long byte448 = blocks[blocksOffset++] & 0xFF;
+ final long byte449 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte442 & 63) << 55) | (byte443 << 47) | (byte444 << 39) | (byte445 << 31) | (byte446 << 23) | (byte447 << 15) | (byte448 << 7) | (byte449 >>> 1);
+ final long byte450 = blocks[blocksOffset++] & 0xFF;
+ final long byte451 = blocks[blocksOffset++] & 0xFF;
+ final long byte452 = blocks[blocksOffset++] & 0xFF;
+ final long byte453 = blocks[blocksOffset++] & 0xFF;
+ final long byte454 = blocks[blocksOffset++] & 0xFF;
+ final long byte455 = blocks[blocksOffset++] & 0xFF;
+ final long byte456 = blocks[blocksOffset++] & 0xFF;
+ final long byte457 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte449 & 1) << 60) | (byte450 << 52) | (byte451 << 44) | (byte452 << 36) | (byte453 << 28) | (byte454 << 20) | (byte455 << 12) | (byte456 << 4) | (byte457 >>> 4);
+ final long byte458 = blocks[blocksOffset++] & 0xFF;
+ final long byte459 = blocks[blocksOffset++] & 0xFF;
+ final long byte460 = blocks[blocksOffset++] & 0xFF;
+ final long byte461 = blocks[blocksOffset++] & 0xFF;
+ final long byte462 = blocks[blocksOffset++] & 0xFF;
+ final long byte463 = blocks[blocksOffset++] & 0xFF;
+ final long byte464 = blocks[blocksOffset++] & 0xFF;
+ final long byte465 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte457 & 15) << 57) | (byte458 << 49) | (byte459 << 41) | (byte460 << 33) | (byte461 << 25) | (byte462 << 17) | (byte463 << 9) | (byte464 << 1) | (byte465 >>> 7);
+ final long byte466 = blocks[blocksOffset++] & 0xFF;
+ final long byte467 = blocks[blocksOffset++] & 0xFF;
+ final long byte468 = blocks[blocksOffset++] & 0xFF;
+ final long byte469 = blocks[blocksOffset++] & 0xFF;
+ final long byte470 = blocks[blocksOffset++] & 0xFF;
+ final long byte471 = blocks[blocksOffset++] & 0xFF;
+ final long byte472 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte465 & 127) << 54) | (byte466 << 46) | (byte467 << 38) | (byte468 << 30) | (byte469 << 22) | (byte470 << 14) | (byte471 << 6) | (byte472 >>> 2);
+ final long byte473 = blocks[blocksOffset++] & 0xFF;
+ final long byte474 = blocks[blocksOffset++] & 0xFF;
+ final long byte475 = blocks[blocksOffset++] & 0xFF;
+ final long byte476 = blocks[blocksOffset++] & 0xFF;
+ final long byte477 = blocks[blocksOffset++] & 0xFF;
+ final long byte478 = blocks[blocksOffset++] & 0xFF;
+ final long byte479 = blocks[blocksOffset++] & 0xFF;
+ final long byte480 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte472 & 3) << 59) | (byte473 << 51) | (byte474 << 43) | (byte475 << 35) | (byte476 << 27) | (byte477 << 19) | (byte478 << 11) | (byte479 << 3) | (byte480 >>> 5);
+ final long byte481 = blocks[blocksOffset++] & 0xFF;
+ final long byte482 = blocks[blocksOffset++] & 0xFF;
+ final long byte483 = blocks[blocksOffset++] & 0xFF;
+ final long byte484 = blocks[blocksOffset++] & 0xFF;
+ final long byte485 = blocks[blocksOffset++] & 0xFF;
+ final long byte486 = blocks[blocksOffset++] & 0xFF;
+ final long byte487 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte480 & 31) << 56) | (byte481 << 48) | (byte482 << 40) | (byte483 << 32) | (byte484 << 24) | (byte485 << 16) | (byte486 << 8) | byte487;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 58);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 55);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 59);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 53);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 60);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 57);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 58);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 55);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 59);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 53);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 60);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 57);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation62 extends BulkOperation {
+ }
+ ,
+ PACKED_62 {
- public int blocks() {
+ public int blockCount() {
return 31;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 2;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 3L) << 60) | (block1 >>> 4);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 15L) << 58) | (block2 >>> 6);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 63L) << 56) | (block3 >>> 8);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 255L) << 54) | (block4 >>> 10);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 1023L) << 52) | (block5 >>> 12);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 4095L) << 50) | (block6 >>> 14);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 16383L) << 48) | (block7 >>> 16);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 65535L) << 46) | (block8 >>> 18);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 262143L) << 44) | (block9 >>> 20);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1048575L) << 42) | (block10 >>> 22);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 4194303L) << 40) | (block11 >>> 24);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 16777215L) << 38) | (block12 >>> 26);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 67108863L) << 36) | (block13 >>> 28);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 268435455L) << 34) | (block14 >>> 30);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 1073741823L) << 32) | (block15 >>> 32);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 4294967295L) << 30) | (block16 >>> 34);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 17179869183L) << 28) | (block17 >>> 36);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 68719476735L) << 26) | (block18 >>> 38);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 274877906943L) << 24) | (block19 >>> 40);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1099511627775L) << 22) | (block20 >>> 42);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 4398046511103L) << 20) | (block21 >>> 44);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 17592186044415L) << 18) | (block22 >>> 46);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 70368744177663L) << 16) | (block23 >>> 48);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 281474976710655L) << 14) | (block24 >>> 50);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 1125899906842623L) << 12) | (block25 >>> 52);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 4503599627370495L) << 10) | (block26 >>> 54);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 18014398509481983L) << 8) | (block27 >>> 56);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 72057594037927935L) << 6) | (block28 >>> 58);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 288230376151711743L) << 4) | (block29 >>> 60);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1152921504606846975L) << 2) | (block30 >>> 62);
- values[vi++] = block30 & 4611686018427387903L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 2) | (values[vi] >>> 60);
- blocks[bi++] = (values[vi++] << 4) | (values[vi] >>> 58);
- blocks[bi++] = (values[vi++] << 6) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 2;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 3L) << 60) | (block1 >>> 4);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 15L) << 58) | (block2 >>> 6);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 63L) << 56) | (block3 >>> 8);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 255L) << 54) | (block4 >>> 10);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 1023L) << 52) | (block5 >>> 12);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 4095L) << 50) | (block6 >>> 14);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 16383L) << 48) | (block7 >>> 16);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 65535L) << 46) | (block8 >>> 18);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 262143L) << 44) | (block9 >>> 20);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1048575L) << 42) | (block10 >>> 22);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 4194303L) << 40) | (block11 >>> 24);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 16777215L) << 38) | (block12 >>> 26);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 67108863L) << 36) | (block13 >>> 28);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 268435455L) << 34) | (block14 >>> 30);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 1073741823L) << 32) | (block15 >>> 32);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 4294967295L) << 30) | (block16 >>> 34);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 17179869183L) << 28) | (block17 >>> 36);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 68719476735L) << 26) | (block18 >>> 38);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 274877906943L) << 24) | (block19 >>> 40);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1099511627775L) << 22) | (block20 >>> 42);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 4398046511103L) << 20) | (block21 >>> 44);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 17592186044415L) << 18) | (block22 >>> 46);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 70368744177663L) << 16) | (block23 >>> 48);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 281474976710655L) << 14) | (block24 >>> 50);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 1125899906842623L) << 12) | (block25 >>> 52);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 4503599627370495L) << 10) | (block26 >>> 54);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 18014398509481983L) << 8) | (block27 >>> 56);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 72057594037927935L) << 6) | (block28 >>> 58);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 288230376151711743L) << 4) | (block29 >>> 60);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1152921504606846975L) << 2) | (block30 >>> 62);
+ values[valuesOffset++] = block30 & 4611686018427387903L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 54) | (byte1 << 46) | (byte2 << 38) | (byte3 << 30) | (byte4 << 22) | (byte5 << 14) | (byte6 << 6) | (byte7 >>> 2);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 3) << 60) | (byte8 << 52) | (byte9 << 44) | (byte10 << 36) | (byte11 << 28) | (byte12 << 20) | (byte13 << 12) | (byte14 << 4) | (byte15 >>> 4);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 15) << 58) | (byte16 << 50) | (byte17 << 42) | (byte18 << 34) | (byte19 << 26) | (byte20 << 18) | (byte21 << 10) | (byte22 << 2) | (byte23 >>> 6);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 63) << 56) | (byte24 << 48) | (byte25 << 40) | (byte26 << 32) | (byte27 << 24) | (byte28 << 16) | (byte29 << 8) | byte30;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte31 << 54) | (byte32 << 46) | (byte33 << 38) | (byte34 << 30) | (byte35 << 22) | (byte36 << 14) | (byte37 << 6) | (byte38 >>> 2);
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte38 & 3) << 60) | (byte39 << 52) | (byte40 << 44) | (byte41 << 36) | (byte42 << 28) | (byte43 << 20) | (byte44 << 12) | (byte45 << 4) | (byte46 >>> 4);
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte46 & 15) << 58) | (byte47 << 50) | (byte48 << 42) | (byte49 << 34) | (byte50 << 26) | (byte51 << 18) | (byte52 << 10) | (byte53 << 2) | (byte54 >>> 6);
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte54 & 63) << 56) | (byte55 << 48) | (byte56 << 40) | (byte57 << 32) | (byte58 << 24) | (byte59 << 16) | (byte60 << 8) | byte61;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte62 << 54) | (byte63 << 46) | (byte64 << 38) | (byte65 << 30) | (byte66 << 22) | (byte67 << 14) | (byte68 << 6) | (byte69 >>> 2);
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte69 & 3) << 60) | (byte70 << 52) | (byte71 << 44) | (byte72 << 36) | (byte73 << 28) | (byte74 << 20) | (byte75 << 12) | (byte76 << 4) | (byte77 >>> 4);
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte77 & 15) << 58) | (byte78 << 50) | (byte79 << 42) | (byte80 << 34) | (byte81 << 26) | (byte82 << 18) | (byte83 << 10) | (byte84 << 2) | (byte85 >>> 6);
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte85 & 63) << 56) | (byte86 << 48) | (byte87 << 40) | (byte88 << 32) | (byte89 << 24) | (byte90 << 16) | (byte91 << 8) | byte92;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte93 << 54) | (byte94 << 46) | (byte95 << 38) | (byte96 << 30) | (byte97 << 22) | (byte98 << 14) | (byte99 << 6) | (byte100 >>> 2);
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte100 & 3) << 60) | (byte101 << 52) | (byte102 << 44) | (byte103 << 36) | (byte104 << 28) | (byte105 << 20) | (byte106 << 12) | (byte107 << 4) | (byte108 >>> 4);
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte108 & 15) << 58) | (byte109 << 50) | (byte110 << 42) | (byte111 << 34) | (byte112 << 26) | (byte113 << 18) | (byte114 << 10) | (byte115 << 2) | (byte116 >>> 6);
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte116 & 63) << 56) | (byte117 << 48) | (byte118 << 40) | (byte119 << 32) | (byte120 << 24) | (byte121 << 16) | (byte122 << 8) | byte123;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte124 << 54) | (byte125 << 46) | (byte126 << 38) | (byte127 << 30) | (byte128 << 22) | (byte129 << 14) | (byte130 << 6) | (byte131 >>> 2);
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte131 & 3) << 60) | (byte132 << 52) | (byte133 << 44) | (byte134 << 36) | (byte135 << 28) | (byte136 << 20) | (byte137 << 12) | (byte138 << 4) | (byte139 >>> 4);
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte139 & 15) << 58) | (byte140 << 50) | (byte141 << 42) | (byte142 << 34) | (byte143 << 26) | (byte144 << 18) | (byte145 << 10) | (byte146 << 2) | (byte147 >>> 6);
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte147 & 63) << 56) | (byte148 << 48) | (byte149 << 40) | (byte150 << 32) | (byte151 << 24) | (byte152 << 16) | (byte153 << 8) | byte154;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte155 << 54) | (byte156 << 46) | (byte157 << 38) | (byte158 << 30) | (byte159 << 22) | (byte160 << 14) | (byte161 << 6) | (byte162 >>> 2);
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte162 & 3) << 60) | (byte163 << 52) | (byte164 << 44) | (byte165 << 36) | (byte166 << 28) | (byte167 << 20) | (byte168 << 12) | (byte169 << 4) | (byte170 >>> 4);
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte170 & 15) << 58) | (byte171 << 50) | (byte172 << 42) | (byte173 << 34) | (byte174 << 26) | (byte175 << 18) | (byte176 << 10) | (byte177 << 2) | (byte178 >>> 6);
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte178 & 63) << 56) | (byte179 << 48) | (byte180 << 40) | (byte181 << 32) | (byte182 << 24) | (byte183 << 16) | (byte184 << 8) | byte185;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte186 << 54) | (byte187 << 46) | (byte188 << 38) | (byte189 << 30) | (byte190 << 22) | (byte191 << 14) | (byte192 << 6) | (byte193 >>> 2);
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte193 & 3) << 60) | (byte194 << 52) | (byte195 << 44) | (byte196 << 36) | (byte197 << 28) | (byte198 << 20) | (byte199 << 12) | (byte200 << 4) | (byte201 >>> 4);
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte201 & 15) << 58) | (byte202 << 50) | (byte203 << 42) | (byte204 << 34) | (byte205 << 26) | (byte206 << 18) | (byte207 << 10) | (byte208 << 2) | (byte209 >>> 6);
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte209 & 63) << 56) | (byte210 << 48) | (byte211 << 40) | (byte212 << 32) | (byte213 << 24) | (byte214 << 16) | (byte215 << 8) | byte216;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte217 << 54) | (byte218 << 46) | (byte219 << 38) | (byte220 << 30) | (byte221 << 22) | (byte222 << 14) | (byte223 << 6) | (byte224 >>> 2);
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte224 & 3) << 60) | (byte225 << 52) | (byte226 << 44) | (byte227 << 36) | (byte228 << 28) | (byte229 << 20) | (byte230 << 12) | (byte231 << 4) | (byte232 >>> 4);
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte232 & 15) << 58) | (byte233 << 50) | (byte234 << 42) | (byte235 << 34) | (byte236 << 26) | (byte237 << 18) | (byte238 << 10) | (byte239 << 2) | (byte240 >>> 6);
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte240 & 63) << 56) | (byte241 << 48) | (byte242 << 40) | (byte243 << 32) | (byte244 << 24) | (byte245 << 16) | (byte246 << 8) | byte247;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 60);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 58);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 60);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 58);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation63 extends BulkOperation {
+ }
+ ,
+ PACKED_63 {
- public int blocks() {
+ public int blockCount() {
return 63;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block0 = blocks[bi++];
- values[vi++] = block0 >>> 1;
- final long block1 = blocks[bi++];
- values[vi++] = ((block0 & 1L) << 62) | (block1 >>> 2);
- final long block2 = blocks[bi++];
- values[vi++] = ((block1 & 3L) << 61) | (block2 >>> 3);
- final long block3 = blocks[bi++];
- values[vi++] = ((block2 & 7L) << 60) | (block3 >>> 4);
- final long block4 = blocks[bi++];
- values[vi++] = ((block3 & 15L) << 59) | (block4 >>> 5);
- final long block5 = blocks[bi++];
- values[vi++] = ((block4 & 31L) << 58) | (block5 >>> 6);
- final long block6 = blocks[bi++];
- values[vi++] = ((block5 & 63L) << 57) | (block6 >>> 7);
- final long block7 = blocks[bi++];
- values[vi++] = ((block6 & 127L) << 56) | (block7 >>> 8);
- final long block8 = blocks[bi++];
- values[vi++] = ((block7 & 255L) << 55) | (block8 >>> 9);
- final long block9 = blocks[bi++];
- values[vi++] = ((block8 & 511L) << 54) | (block9 >>> 10);
- final long block10 = blocks[bi++];
- values[vi++] = ((block9 & 1023L) << 53) | (block10 >>> 11);
- final long block11 = blocks[bi++];
- values[vi++] = ((block10 & 2047L) << 52) | (block11 >>> 12);
- final long block12 = blocks[bi++];
- values[vi++] = ((block11 & 4095L) << 51) | (block12 >>> 13);
- final long block13 = blocks[bi++];
- values[vi++] = ((block12 & 8191L) << 50) | (block13 >>> 14);
- final long block14 = blocks[bi++];
- values[vi++] = ((block13 & 16383L) << 49) | (block14 >>> 15);
- final long block15 = blocks[bi++];
- values[vi++] = ((block14 & 32767L) << 48) | (block15 >>> 16);
- final long block16 = blocks[bi++];
- values[vi++] = ((block15 & 65535L) << 47) | (block16 >>> 17);
- final long block17 = blocks[bi++];
- values[vi++] = ((block16 & 131071L) << 46) | (block17 >>> 18);
- final long block18 = blocks[bi++];
- values[vi++] = ((block17 & 262143L) << 45) | (block18 >>> 19);
- final long block19 = blocks[bi++];
- values[vi++] = ((block18 & 524287L) << 44) | (block19 >>> 20);
- final long block20 = blocks[bi++];
- values[vi++] = ((block19 & 1048575L) << 43) | (block20 >>> 21);
- final long block21 = blocks[bi++];
- values[vi++] = ((block20 & 2097151L) << 42) | (block21 >>> 22);
- final long block22 = blocks[bi++];
- values[vi++] = ((block21 & 4194303L) << 41) | (block22 >>> 23);
- final long block23 = blocks[bi++];
- values[vi++] = ((block22 & 8388607L) << 40) | (block23 >>> 24);
- final long block24 = blocks[bi++];
- values[vi++] = ((block23 & 16777215L) << 39) | (block24 >>> 25);
- final long block25 = blocks[bi++];
- values[vi++] = ((block24 & 33554431L) << 38) | (block25 >>> 26);
- final long block26 = blocks[bi++];
- values[vi++] = ((block25 & 67108863L) << 37) | (block26 >>> 27);
- final long block27 = blocks[bi++];
- values[vi++] = ((block26 & 134217727L) << 36) | (block27 >>> 28);
- final long block28 = blocks[bi++];
- values[vi++] = ((block27 & 268435455L) << 35) | (block28 >>> 29);
- final long block29 = blocks[bi++];
- values[vi++] = ((block28 & 536870911L) << 34) | (block29 >>> 30);
- final long block30 = blocks[bi++];
- values[vi++] = ((block29 & 1073741823L) << 33) | (block30 >>> 31);
- final long block31 = blocks[bi++];
- values[vi++] = ((block30 & 2147483647L) << 32) | (block31 >>> 32);
- final long block32 = blocks[bi++];
- values[vi++] = ((block31 & 4294967295L) << 31) | (block32 >>> 33);
- final long block33 = blocks[bi++];
- values[vi++] = ((block32 & 8589934591L) << 30) | (block33 >>> 34);
- final long block34 = blocks[bi++];
- values[vi++] = ((block33 & 17179869183L) << 29) | (block34 >>> 35);
- final long block35 = blocks[bi++];
- values[vi++] = ((block34 & 34359738367L) << 28) | (block35 >>> 36);
- final long block36 = blocks[bi++];
- values[vi++] = ((block35 & 68719476735L) << 27) | (block36 >>> 37);
- final long block37 = blocks[bi++];
- values[vi++] = ((block36 & 137438953471L) << 26) | (block37 >>> 38);
- final long block38 = blocks[bi++];
- values[vi++] = ((block37 & 274877906943L) << 25) | (block38 >>> 39);
- final long block39 = blocks[bi++];
- values[vi++] = ((block38 & 549755813887L) << 24) | (block39 >>> 40);
- final long block40 = blocks[bi++];
- values[vi++] = ((block39 & 1099511627775L) << 23) | (block40 >>> 41);
- final long block41 = blocks[bi++];
- values[vi++] = ((block40 & 2199023255551L) << 22) | (block41 >>> 42);
- final long block42 = blocks[bi++];
- values[vi++] = ((block41 & 4398046511103L) << 21) | (block42 >>> 43);
- final long block43 = blocks[bi++];
- values[vi++] = ((block42 & 8796093022207L) << 20) | (block43 >>> 44);
- final long block44 = blocks[bi++];
- values[vi++] = ((block43 & 17592186044415L) << 19) | (block44 >>> 45);
- final long block45 = blocks[bi++];
- values[vi++] = ((block44 & 35184372088831L) << 18) | (block45 >>> 46);
- final long block46 = blocks[bi++];
- values[vi++] = ((block45 & 70368744177663L) << 17) | (block46 >>> 47);
- final long block47 = blocks[bi++];
- values[vi++] = ((block46 & 140737488355327L) << 16) | (block47 >>> 48);
- final long block48 = blocks[bi++];
- values[vi++] = ((block47 & 281474976710655L) << 15) | (block48 >>> 49);
- final long block49 = blocks[bi++];
- values[vi++] = ((block48 & 562949953421311L) << 14) | (block49 >>> 50);
- final long block50 = blocks[bi++];
- values[vi++] = ((block49 & 1125899906842623L) << 13) | (block50 >>> 51);
- final long block51 = blocks[bi++];
- values[vi++] = ((block50 & 2251799813685247L) << 12) | (block51 >>> 52);
- final long block52 = blocks[bi++];
- values[vi++] = ((block51 & 4503599627370495L) << 11) | (block52 >>> 53);
- final long block53 = blocks[bi++];
- values[vi++] = ((block52 & 9007199254740991L) << 10) | (block53 >>> 54);
- final long block54 = blocks[bi++];
- values[vi++] = ((block53 & 18014398509481983L) << 9) | (block54 >>> 55);
- final long block55 = blocks[bi++];
- values[vi++] = ((block54 & 36028797018963967L) << 8) | (block55 >>> 56);
- final long block56 = blocks[bi++];
- values[vi++] = ((block55 & 72057594037927935L) << 7) | (block56 >>> 57);
- final long block57 = blocks[bi++];
- values[vi++] = ((block56 & 144115188075855871L) << 6) | (block57 >>> 58);
- final long block58 = blocks[bi++];
- values[vi++] = ((block57 & 288230376151711743L) << 5) | (block58 >>> 59);
- final long block59 = blocks[bi++];
- values[vi++] = ((block58 & 576460752303423487L) << 4) | (block59 >>> 60);
- final long block60 = blocks[bi++];
- values[vi++] = ((block59 & 1152921504606846975L) << 3) | (block60 >>> 61);
- final long block61 = blocks[bi++];
- values[vi++] = ((block60 & 2305843009213693951L) << 2) | (block61 >>> 62);
- final long block62 = blocks[bi++];
- values[vi++] = ((block61 & 4611686018427387903L) << 1) | (block62 >>> 63);
- values[vi++] = block62 & 9223372036854775807L;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = (values[vi++] << 1) | (values[vi] >>> 62);
- blocks[bi++] = (values[vi++] << 2) | (values[vi] >>> 61);
- blocks[bi++] = (values[vi++] << 3) | (values[vi] >>> 60);
- blocks[bi++] = (values[vi++] << 4) | (values[vi] >>> 59);
- blocks[bi++] = (values[vi++] << 5) | (values[vi] >>> 58);
- blocks[bi++] = (values[vi++] << 6) | (values[vi] >>> 57);
- blocks[bi++] = (values[vi++] << 7) | (values[vi] >>> 56);
- blocks[bi++] = (values[vi++] << 8) | (values[vi] >>> 55);
- blocks[bi++] = (values[vi++] << 9) | (values[vi] >>> 54);
- blocks[bi++] = (values[vi++] << 10) | (values[vi] >>> 53);
- blocks[bi++] = (values[vi++] << 11) | (values[vi] >>> 52);
- blocks[bi++] = (values[vi++] << 12) | (values[vi] >>> 51);
- blocks[bi++] = (values[vi++] << 13) | (values[vi] >>> 50);
- blocks[bi++] = (values[vi++] << 14) | (values[vi] >>> 49);
- blocks[bi++] = (values[vi++] << 15) | (values[vi] >>> 48);
- blocks[bi++] = (values[vi++] << 16) | (values[vi] >>> 47);
- blocks[bi++] = (values[vi++] << 17) | (values[vi] >>> 46);
- blocks[bi++] = (values[vi++] << 18) | (values[vi] >>> 45);
- blocks[bi++] = (values[vi++] << 19) | (values[vi] >>> 44);
- blocks[bi++] = (values[vi++] << 20) | (values[vi] >>> 43);
- blocks[bi++] = (values[vi++] << 21) | (values[vi] >>> 42);
- blocks[bi++] = (values[vi++] << 22) | (values[vi] >>> 41);
- blocks[bi++] = (values[vi++] << 23) | (values[vi] >>> 40);
- blocks[bi++] = (values[vi++] << 24) | (values[vi] >>> 39);
- blocks[bi++] = (values[vi++] << 25) | (values[vi] >>> 38);
- blocks[bi++] = (values[vi++] << 26) | (values[vi] >>> 37);
- blocks[bi++] = (values[vi++] << 27) | (values[vi] >>> 36);
- blocks[bi++] = (values[vi++] << 28) | (values[vi] >>> 35);
- blocks[bi++] = (values[vi++] << 29) | (values[vi] >>> 34);
- blocks[bi++] = (values[vi++] << 30) | (values[vi] >>> 33);
- blocks[bi++] = (values[vi++] << 31) | (values[vi] >>> 32);
- blocks[bi++] = (values[vi++] << 32) | (values[vi] >>> 31);
- blocks[bi++] = (values[vi++] << 33) | (values[vi] >>> 30);
- blocks[bi++] = (values[vi++] << 34) | (values[vi] >>> 29);
- blocks[bi++] = (values[vi++] << 35) | (values[vi] >>> 28);
- blocks[bi++] = (values[vi++] << 36) | (values[vi] >>> 27);
- blocks[bi++] = (values[vi++] << 37) | (values[vi] >>> 26);
- blocks[bi++] = (values[vi++] << 38) | (values[vi] >>> 25);
- blocks[bi++] = (values[vi++] << 39) | (values[vi] >>> 24);
- blocks[bi++] = (values[vi++] << 40) | (values[vi] >>> 23);
- blocks[bi++] = (values[vi++] << 41) | (values[vi] >>> 22);
- blocks[bi++] = (values[vi++] << 42) | (values[vi] >>> 21);
- blocks[bi++] = (values[vi++] << 43) | (values[vi] >>> 20);
- blocks[bi++] = (values[vi++] << 44) | (values[vi] >>> 19);
- blocks[bi++] = (values[vi++] << 45) | (values[vi] >>> 18);
- blocks[bi++] = (values[vi++] << 46) | (values[vi] >>> 17);
- blocks[bi++] = (values[vi++] << 47) | (values[vi] >>> 16);
- blocks[bi++] = (values[vi++] << 48) | (values[vi] >>> 15);
- blocks[bi++] = (values[vi++] << 49) | (values[vi] >>> 14);
- blocks[bi++] = (values[vi++] << 50) | (values[vi] >>> 13);
- blocks[bi++] = (values[vi++] << 51) | (values[vi] >>> 12);
- blocks[bi++] = (values[vi++] << 52) | (values[vi] >>> 11);
- blocks[bi++] = (values[vi++] << 53) | (values[vi] >>> 10);
- blocks[bi++] = (values[vi++] << 54) | (values[vi] >>> 9);
- blocks[bi++] = (values[vi++] << 55) | (values[vi] >>> 8);
- blocks[bi++] = (values[vi++] << 56) | (values[vi] >>> 7);
- blocks[bi++] = (values[vi++] << 57) | (values[vi] >>> 6);
- blocks[bi++] = (values[vi++] << 58) | (values[vi] >>> 5);
- blocks[bi++] = (values[vi++] << 59) | (values[vi] >>> 4);
- blocks[bi++] = (values[vi++] << 60) | (values[vi] >>> 3);
- blocks[bi++] = (values[vi++] << 61) | (values[vi] >>> 2);
- blocks[bi++] = (values[vi++] << 62) | (values[vi] >>> 1);
- blocks[bi++] = (values[vi++] << 63) | values[vi++];
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block0 = blocks[blocksOffset++];
+ values[valuesOffset++] = block0 >>> 1;
+ final long block1 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block0 & 1L) << 62) | (block1 >>> 2);
+ final long block2 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block1 & 3L) << 61) | (block2 >>> 3);
+ final long block3 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block2 & 7L) << 60) | (block3 >>> 4);
+ final long block4 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block3 & 15L) << 59) | (block4 >>> 5);
+ final long block5 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block4 & 31L) << 58) | (block5 >>> 6);
+ final long block6 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block5 & 63L) << 57) | (block6 >>> 7);
+ final long block7 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block6 & 127L) << 56) | (block7 >>> 8);
+ final long block8 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block7 & 255L) << 55) | (block8 >>> 9);
+ final long block9 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block8 & 511L) << 54) | (block9 >>> 10);
+ final long block10 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block9 & 1023L) << 53) | (block10 >>> 11);
+ final long block11 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block10 & 2047L) << 52) | (block11 >>> 12);
+ final long block12 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block11 & 4095L) << 51) | (block12 >>> 13);
+ final long block13 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block12 & 8191L) << 50) | (block13 >>> 14);
+ final long block14 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block13 & 16383L) << 49) | (block14 >>> 15);
+ final long block15 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block14 & 32767L) << 48) | (block15 >>> 16);
+ final long block16 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block15 & 65535L) << 47) | (block16 >>> 17);
+ final long block17 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block16 & 131071L) << 46) | (block17 >>> 18);
+ final long block18 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block17 & 262143L) << 45) | (block18 >>> 19);
+ final long block19 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block18 & 524287L) << 44) | (block19 >>> 20);
+ final long block20 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block19 & 1048575L) << 43) | (block20 >>> 21);
+ final long block21 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block20 & 2097151L) << 42) | (block21 >>> 22);
+ final long block22 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block21 & 4194303L) << 41) | (block22 >>> 23);
+ final long block23 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block22 & 8388607L) << 40) | (block23 >>> 24);
+ final long block24 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block23 & 16777215L) << 39) | (block24 >>> 25);
+ final long block25 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block24 & 33554431L) << 38) | (block25 >>> 26);
+ final long block26 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block25 & 67108863L) << 37) | (block26 >>> 27);
+ final long block27 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block26 & 134217727L) << 36) | (block27 >>> 28);
+ final long block28 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block27 & 268435455L) << 35) | (block28 >>> 29);
+ final long block29 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block28 & 536870911L) << 34) | (block29 >>> 30);
+ final long block30 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block29 & 1073741823L) << 33) | (block30 >>> 31);
+ final long block31 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block30 & 2147483647L) << 32) | (block31 >>> 32);
+ final long block32 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block31 & 4294967295L) << 31) | (block32 >>> 33);
+ final long block33 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block32 & 8589934591L) << 30) | (block33 >>> 34);
+ final long block34 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block33 & 17179869183L) << 29) | (block34 >>> 35);
+ final long block35 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block34 & 34359738367L) << 28) | (block35 >>> 36);
+ final long block36 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block35 & 68719476735L) << 27) | (block36 >>> 37);
+ final long block37 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block36 & 137438953471L) << 26) | (block37 >>> 38);
+ final long block38 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block37 & 274877906943L) << 25) | (block38 >>> 39);
+ final long block39 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block38 & 549755813887L) << 24) | (block39 >>> 40);
+ final long block40 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block39 & 1099511627775L) << 23) | (block40 >>> 41);
+ final long block41 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block40 & 2199023255551L) << 22) | (block41 >>> 42);
+ final long block42 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block41 & 4398046511103L) << 21) | (block42 >>> 43);
+ final long block43 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block42 & 8796093022207L) << 20) | (block43 >>> 44);
+ final long block44 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block43 & 17592186044415L) << 19) | (block44 >>> 45);
+ final long block45 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block44 & 35184372088831L) << 18) | (block45 >>> 46);
+ final long block46 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block45 & 70368744177663L) << 17) | (block46 >>> 47);
+ final long block47 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block46 & 140737488355327L) << 16) | (block47 >>> 48);
+ final long block48 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block47 & 281474976710655L) << 15) | (block48 >>> 49);
+ final long block49 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block48 & 562949953421311L) << 14) | (block49 >>> 50);
+ final long block50 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block49 & 1125899906842623L) << 13) | (block50 >>> 51);
+ final long block51 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block50 & 2251799813685247L) << 12) | (block51 >>> 52);
+ final long block52 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block51 & 4503599627370495L) << 11) | (block52 >>> 53);
+ final long block53 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block52 & 9007199254740991L) << 10) | (block53 >>> 54);
+ final long block54 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block53 & 18014398509481983L) << 9) | (block54 >>> 55);
+ final long block55 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block54 & 36028797018963967L) << 8) | (block55 >>> 56);
+ final long block56 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block55 & 72057594037927935L) << 7) | (block56 >>> 57);
+ final long block57 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block56 & 144115188075855871L) << 6) | (block57 >>> 58);
+ final long block58 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block57 & 288230376151711743L) << 5) | (block58 >>> 59);
+ final long block59 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block58 & 576460752303423487L) << 4) | (block59 >>> 60);
+ final long block60 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block59 & 1152921504606846975L) << 3) | (block60 >>> 61);
+ final long block61 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block60 & 2305843009213693951L) << 2) | (block61 >>> 62);
+ final long block62 = blocks[blocksOffset++];
+ values[valuesOffset++] = ((block61 & 4611686018427387903L) << 1) | (block62 >>> 63);
+ values[valuesOffset++] = block62 & 9223372036854775807L;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte0 << 55) | (byte1 << 47) | (byte2 << 39) | (byte3 << 31) | (byte4 << 23) | (byte5 << 15) | (byte6 << 7) | (byte7 >>> 1);
+ final long byte8 = blocks[blocksOffset++] & 0xFF;
+ final long byte9 = blocks[blocksOffset++] & 0xFF;
+ final long byte10 = blocks[blocksOffset++] & 0xFF;
+ final long byte11 = blocks[blocksOffset++] & 0xFF;
+ final long byte12 = blocks[blocksOffset++] & 0xFF;
+ final long byte13 = blocks[blocksOffset++] & 0xFF;
+ final long byte14 = blocks[blocksOffset++] & 0xFF;
+ final long byte15 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte7 & 1) << 62) | (byte8 << 54) | (byte9 << 46) | (byte10 << 38) | (byte11 << 30) | (byte12 << 22) | (byte13 << 14) | (byte14 << 6) | (byte15 >>> 2);
+ final long byte16 = blocks[blocksOffset++] & 0xFF;
+ final long byte17 = blocks[blocksOffset++] & 0xFF;
+ final long byte18 = blocks[blocksOffset++] & 0xFF;
+ final long byte19 = blocks[blocksOffset++] & 0xFF;
+ final long byte20 = blocks[blocksOffset++] & 0xFF;
+ final long byte21 = blocks[blocksOffset++] & 0xFF;
+ final long byte22 = blocks[blocksOffset++] & 0xFF;
+ final long byte23 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte15 & 3) << 61) | (byte16 << 53) | (byte17 << 45) | (byte18 << 37) | (byte19 << 29) | (byte20 << 21) | (byte21 << 13) | (byte22 << 5) | (byte23 >>> 3);
+ final long byte24 = blocks[blocksOffset++] & 0xFF;
+ final long byte25 = blocks[blocksOffset++] & 0xFF;
+ final long byte26 = blocks[blocksOffset++] & 0xFF;
+ final long byte27 = blocks[blocksOffset++] & 0xFF;
+ final long byte28 = blocks[blocksOffset++] & 0xFF;
+ final long byte29 = blocks[blocksOffset++] & 0xFF;
+ final long byte30 = blocks[blocksOffset++] & 0xFF;
+ final long byte31 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte23 & 7) << 60) | (byte24 << 52) | (byte25 << 44) | (byte26 << 36) | (byte27 << 28) | (byte28 << 20) | (byte29 << 12) | (byte30 << 4) | (byte31 >>> 4);
+ final long byte32 = blocks[blocksOffset++] & 0xFF;
+ final long byte33 = blocks[blocksOffset++] & 0xFF;
+ final long byte34 = blocks[blocksOffset++] & 0xFF;
+ final long byte35 = blocks[blocksOffset++] & 0xFF;
+ final long byte36 = blocks[blocksOffset++] & 0xFF;
+ final long byte37 = blocks[blocksOffset++] & 0xFF;
+ final long byte38 = blocks[blocksOffset++] & 0xFF;
+ final long byte39 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte31 & 15) << 59) | (byte32 << 51) | (byte33 << 43) | (byte34 << 35) | (byte35 << 27) | (byte36 << 19) | (byte37 << 11) | (byte38 << 3) | (byte39 >>> 5);
+ final long byte40 = blocks[blocksOffset++] & 0xFF;
+ final long byte41 = blocks[blocksOffset++] & 0xFF;
+ final long byte42 = blocks[blocksOffset++] & 0xFF;
+ final long byte43 = blocks[blocksOffset++] & 0xFF;
+ final long byte44 = blocks[blocksOffset++] & 0xFF;
+ final long byte45 = blocks[blocksOffset++] & 0xFF;
+ final long byte46 = blocks[blocksOffset++] & 0xFF;
+ final long byte47 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte39 & 31) << 58) | (byte40 << 50) | (byte41 << 42) | (byte42 << 34) | (byte43 << 26) | (byte44 << 18) | (byte45 << 10) | (byte46 << 2) | (byte47 >>> 6);
+ final long byte48 = blocks[blocksOffset++] & 0xFF;
+ final long byte49 = blocks[blocksOffset++] & 0xFF;
+ final long byte50 = blocks[blocksOffset++] & 0xFF;
+ final long byte51 = blocks[blocksOffset++] & 0xFF;
+ final long byte52 = blocks[blocksOffset++] & 0xFF;
+ final long byte53 = blocks[blocksOffset++] & 0xFF;
+ final long byte54 = blocks[blocksOffset++] & 0xFF;
+ final long byte55 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte47 & 63) << 57) | (byte48 << 49) | (byte49 << 41) | (byte50 << 33) | (byte51 << 25) | (byte52 << 17) | (byte53 << 9) | (byte54 << 1) | (byte55 >>> 7);
+ final long byte56 = blocks[blocksOffset++] & 0xFF;
+ final long byte57 = blocks[blocksOffset++] & 0xFF;
+ final long byte58 = blocks[blocksOffset++] & 0xFF;
+ final long byte59 = blocks[blocksOffset++] & 0xFF;
+ final long byte60 = blocks[blocksOffset++] & 0xFF;
+ final long byte61 = blocks[blocksOffset++] & 0xFF;
+ final long byte62 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte55 & 127) << 56) | (byte56 << 48) | (byte57 << 40) | (byte58 << 32) | (byte59 << 24) | (byte60 << 16) | (byte61 << 8) | byte62;
+ final long byte63 = blocks[blocksOffset++] & 0xFF;
+ final long byte64 = blocks[blocksOffset++] & 0xFF;
+ final long byte65 = blocks[blocksOffset++] & 0xFF;
+ final long byte66 = blocks[blocksOffset++] & 0xFF;
+ final long byte67 = blocks[blocksOffset++] & 0xFF;
+ final long byte68 = blocks[blocksOffset++] & 0xFF;
+ final long byte69 = blocks[blocksOffset++] & 0xFF;
+ final long byte70 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte63 << 55) | (byte64 << 47) | (byte65 << 39) | (byte66 << 31) | (byte67 << 23) | (byte68 << 15) | (byte69 << 7) | (byte70 >>> 1);
+ final long byte71 = blocks[blocksOffset++] & 0xFF;
+ final long byte72 = blocks[blocksOffset++] & 0xFF;
+ final long byte73 = blocks[blocksOffset++] & 0xFF;
+ final long byte74 = blocks[blocksOffset++] & 0xFF;
+ final long byte75 = blocks[blocksOffset++] & 0xFF;
+ final long byte76 = blocks[blocksOffset++] & 0xFF;
+ final long byte77 = blocks[blocksOffset++] & 0xFF;
+ final long byte78 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte70 & 1) << 62) | (byte71 << 54) | (byte72 << 46) | (byte73 << 38) | (byte74 << 30) | (byte75 << 22) | (byte76 << 14) | (byte77 << 6) | (byte78 >>> 2);
+ final long byte79 = blocks[blocksOffset++] & 0xFF;
+ final long byte80 = blocks[blocksOffset++] & 0xFF;
+ final long byte81 = blocks[blocksOffset++] & 0xFF;
+ final long byte82 = blocks[blocksOffset++] & 0xFF;
+ final long byte83 = blocks[blocksOffset++] & 0xFF;
+ final long byte84 = blocks[blocksOffset++] & 0xFF;
+ final long byte85 = blocks[blocksOffset++] & 0xFF;
+ final long byte86 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte78 & 3) << 61) | (byte79 << 53) | (byte80 << 45) | (byte81 << 37) | (byte82 << 29) | (byte83 << 21) | (byte84 << 13) | (byte85 << 5) | (byte86 >>> 3);
+ final long byte87 = blocks[blocksOffset++] & 0xFF;
+ final long byte88 = blocks[blocksOffset++] & 0xFF;
+ final long byte89 = blocks[blocksOffset++] & 0xFF;
+ final long byte90 = blocks[blocksOffset++] & 0xFF;
+ final long byte91 = blocks[blocksOffset++] & 0xFF;
+ final long byte92 = blocks[blocksOffset++] & 0xFF;
+ final long byte93 = blocks[blocksOffset++] & 0xFF;
+ final long byte94 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte86 & 7) << 60) | (byte87 << 52) | (byte88 << 44) | (byte89 << 36) | (byte90 << 28) | (byte91 << 20) | (byte92 << 12) | (byte93 << 4) | (byte94 >>> 4);
+ final long byte95 = blocks[blocksOffset++] & 0xFF;
+ final long byte96 = blocks[blocksOffset++] & 0xFF;
+ final long byte97 = blocks[blocksOffset++] & 0xFF;
+ final long byte98 = blocks[blocksOffset++] & 0xFF;
+ final long byte99 = blocks[blocksOffset++] & 0xFF;
+ final long byte100 = blocks[blocksOffset++] & 0xFF;
+ final long byte101 = blocks[blocksOffset++] & 0xFF;
+ final long byte102 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte94 & 15) << 59) | (byte95 << 51) | (byte96 << 43) | (byte97 << 35) | (byte98 << 27) | (byte99 << 19) | (byte100 << 11) | (byte101 << 3) | (byte102 >>> 5);
+ final long byte103 = blocks[blocksOffset++] & 0xFF;
+ final long byte104 = blocks[blocksOffset++] & 0xFF;
+ final long byte105 = blocks[blocksOffset++] & 0xFF;
+ final long byte106 = blocks[blocksOffset++] & 0xFF;
+ final long byte107 = blocks[blocksOffset++] & 0xFF;
+ final long byte108 = blocks[blocksOffset++] & 0xFF;
+ final long byte109 = blocks[blocksOffset++] & 0xFF;
+ final long byte110 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte102 & 31) << 58) | (byte103 << 50) | (byte104 << 42) | (byte105 << 34) | (byte106 << 26) | (byte107 << 18) | (byte108 << 10) | (byte109 << 2) | (byte110 >>> 6);
+ final long byte111 = blocks[blocksOffset++] & 0xFF;
+ final long byte112 = blocks[blocksOffset++] & 0xFF;
+ final long byte113 = blocks[blocksOffset++] & 0xFF;
+ final long byte114 = blocks[blocksOffset++] & 0xFF;
+ final long byte115 = blocks[blocksOffset++] & 0xFF;
+ final long byte116 = blocks[blocksOffset++] & 0xFF;
+ final long byte117 = blocks[blocksOffset++] & 0xFF;
+ final long byte118 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte110 & 63) << 57) | (byte111 << 49) | (byte112 << 41) | (byte113 << 33) | (byte114 << 25) | (byte115 << 17) | (byte116 << 9) | (byte117 << 1) | (byte118 >>> 7);
+ final long byte119 = blocks[blocksOffset++] & 0xFF;
+ final long byte120 = blocks[blocksOffset++] & 0xFF;
+ final long byte121 = blocks[blocksOffset++] & 0xFF;
+ final long byte122 = blocks[blocksOffset++] & 0xFF;
+ final long byte123 = blocks[blocksOffset++] & 0xFF;
+ final long byte124 = blocks[blocksOffset++] & 0xFF;
+ final long byte125 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte118 & 127) << 56) | (byte119 << 48) | (byte120 << 40) | (byte121 << 32) | (byte122 << 24) | (byte123 << 16) | (byte124 << 8) | byte125;
+ final long byte126 = blocks[blocksOffset++] & 0xFF;
+ final long byte127 = blocks[blocksOffset++] & 0xFF;
+ final long byte128 = blocks[blocksOffset++] & 0xFF;
+ final long byte129 = blocks[blocksOffset++] & 0xFF;
+ final long byte130 = blocks[blocksOffset++] & 0xFF;
+ final long byte131 = blocks[blocksOffset++] & 0xFF;
+ final long byte132 = blocks[blocksOffset++] & 0xFF;
+ final long byte133 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte126 << 55) | (byte127 << 47) | (byte128 << 39) | (byte129 << 31) | (byte130 << 23) | (byte131 << 15) | (byte132 << 7) | (byte133 >>> 1);
+ final long byte134 = blocks[blocksOffset++] & 0xFF;
+ final long byte135 = blocks[blocksOffset++] & 0xFF;
+ final long byte136 = blocks[blocksOffset++] & 0xFF;
+ final long byte137 = blocks[blocksOffset++] & 0xFF;
+ final long byte138 = blocks[blocksOffset++] & 0xFF;
+ final long byte139 = blocks[blocksOffset++] & 0xFF;
+ final long byte140 = blocks[blocksOffset++] & 0xFF;
+ final long byte141 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte133 & 1) << 62) | (byte134 << 54) | (byte135 << 46) | (byte136 << 38) | (byte137 << 30) | (byte138 << 22) | (byte139 << 14) | (byte140 << 6) | (byte141 >>> 2);
+ final long byte142 = blocks[blocksOffset++] & 0xFF;
+ final long byte143 = blocks[blocksOffset++] & 0xFF;
+ final long byte144 = blocks[blocksOffset++] & 0xFF;
+ final long byte145 = blocks[blocksOffset++] & 0xFF;
+ final long byte146 = blocks[blocksOffset++] & 0xFF;
+ final long byte147 = blocks[blocksOffset++] & 0xFF;
+ final long byte148 = blocks[blocksOffset++] & 0xFF;
+ final long byte149 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte141 & 3) << 61) | (byte142 << 53) | (byte143 << 45) | (byte144 << 37) | (byte145 << 29) | (byte146 << 21) | (byte147 << 13) | (byte148 << 5) | (byte149 >>> 3);
+ final long byte150 = blocks[blocksOffset++] & 0xFF;
+ final long byte151 = blocks[blocksOffset++] & 0xFF;
+ final long byte152 = blocks[blocksOffset++] & 0xFF;
+ final long byte153 = blocks[blocksOffset++] & 0xFF;
+ final long byte154 = blocks[blocksOffset++] & 0xFF;
+ final long byte155 = blocks[blocksOffset++] & 0xFF;
+ final long byte156 = blocks[blocksOffset++] & 0xFF;
+ final long byte157 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte149 & 7) << 60) | (byte150 << 52) | (byte151 << 44) | (byte152 << 36) | (byte153 << 28) | (byte154 << 20) | (byte155 << 12) | (byte156 << 4) | (byte157 >>> 4);
+ final long byte158 = blocks[blocksOffset++] & 0xFF;
+ final long byte159 = blocks[blocksOffset++] & 0xFF;
+ final long byte160 = blocks[blocksOffset++] & 0xFF;
+ final long byte161 = blocks[blocksOffset++] & 0xFF;
+ final long byte162 = blocks[blocksOffset++] & 0xFF;
+ final long byte163 = blocks[blocksOffset++] & 0xFF;
+ final long byte164 = blocks[blocksOffset++] & 0xFF;
+ final long byte165 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte157 & 15) << 59) | (byte158 << 51) | (byte159 << 43) | (byte160 << 35) | (byte161 << 27) | (byte162 << 19) | (byte163 << 11) | (byte164 << 3) | (byte165 >>> 5);
+ final long byte166 = blocks[blocksOffset++] & 0xFF;
+ final long byte167 = blocks[blocksOffset++] & 0xFF;
+ final long byte168 = blocks[blocksOffset++] & 0xFF;
+ final long byte169 = blocks[blocksOffset++] & 0xFF;
+ final long byte170 = blocks[blocksOffset++] & 0xFF;
+ final long byte171 = blocks[blocksOffset++] & 0xFF;
+ final long byte172 = blocks[blocksOffset++] & 0xFF;
+ final long byte173 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte165 & 31) << 58) | (byte166 << 50) | (byte167 << 42) | (byte168 << 34) | (byte169 << 26) | (byte170 << 18) | (byte171 << 10) | (byte172 << 2) | (byte173 >>> 6);
+ final long byte174 = blocks[blocksOffset++] & 0xFF;
+ final long byte175 = blocks[blocksOffset++] & 0xFF;
+ final long byte176 = blocks[blocksOffset++] & 0xFF;
+ final long byte177 = blocks[blocksOffset++] & 0xFF;
+ final long byte178 = blocks[blocksOffset++] & 0xFF;
+ final long byte179 = blocks[blocksOffset++] & 0xFF;
+ final long byte180 = blocks[blocksOffset++] & 0xFF;
+ final long byte181 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte173 & 63) << 57) | (byte174 << 49) | (byte175 << 41) | (byte176 << 33) | (byte177 << 25) | (byte178 << 17) | (byte179 << 9) | (byte180 << 1) | (byte181 >>> 7);
+ final long byte182 = blocks[blocksOffset++] & 0xFF;
+ final long byte183 = blocks[blocksOffset++] & 0xFF;
+ final long byte184 = blocks[blocksOffset++] & 0xFF;
+ final long byte185 = blocks[blocksOffset++] & 0xFF;
+ final long byte186 = blocks[blocksOffset++] & 0xFF;
+ final long byte187 = blocks[blocksOffset++] & 0xFF;
+ final long byte188 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte181 & 127) << 56) | (byte182 << 48) | (byte183 << 40) | (byte184 << 32) | (byte185 << 24) | (byte186 << 16) | (byte187 << 8) | byte188;
+ final long byte189 = blocks[blocksOffset++] & 0xFF;
+ final long byte190 = blocks[blocksOffset++] & 0xFF;
+ final long byte191 = blocks[blocksOffset++] & 0xFF;
+ final long byte192 = blocks[blocksOffset++] & 0xFF;
+ final long byte193 = blocks[blocksOffset++] & 0xFF;
+ final long byte194 = blocks[blocksOffset++] & 0xFF;
+ final long byte195 = blocks[blocksOffset++] & 0xFF;
+ final long byte196 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte189 << 55) | (byte190 << 47) | (byte191 << 39) | (byte192 << 31) | (byte193 << 23) | (byte194 << 15) | (byte195 << 7) | (byte196 >>> 1);
+ final long byte197 = blocks[blocksOffset++] & 0xFF;
+ final long byte198 = blocks[blocksOffset++] & 0xFF;
+ final long byte199 = blocks[blocksOffset++] & 0xFF;
+ final long byte200 = blocks[blocksOffset++] & 0xFF;
+ final long byte201 = blocks[blocksOffset++] & 0xFF;
+ final long byte202 = blocks[blocksOffset++] & 0xFF;
+ final long byte203 = blocks[blocksOffset++] & 0xFF;
+ final long byte204 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte196 & 1) << 62) | (byte197 << 54) | (byte198 << 46) | (byte199 << 38) | (byte200 << 30) | (byte201 << 22) | (byte202 << 14) | (byte203 << 6) | (byte204 >>> 2);
+ final long byte205 = blocks[blocksOffset++] & 0xFF;
+ final long byte206 = blocks[blocksOffset++] & 0xFF;
+ final long byte207 = blocks[blocksOffset++] & 0xFF;
+ final long byte208 = blocks[blocksOffset++] & 0xFF;
+ final long byte209 = blocks[blocksOffset++] & 0xFF;
+ final long byte210 = blocks[blocksOffset++] & 0xFF;
+ final long byte211 = blocks[blocksOffset++] & 0xFF;
+ final long byte212 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte204 & 3) << 61) | (byte205 << 53) | (byte206 << 45) | (byte207 << 37) | (byte208 << 29) | (byte209 << 21) | (byte210 << 13) | (byte211 << 5) | (byte212 >>> 3);
+ final long byte213 = blocks[blocksOffset++] & 0xFF;
+ final long byte214 = blocks[blocksOffset++] & 0xFF;
+ final long byte215 = blocks[blocksOffset++] & 0xFF;
+ final long byte216 = blocks[blocksOffset++] & 0xFF;
+ final long byte217 = blocks[blocksOffset++] & 0xFF;
+ final long byte218 = blocks[blocksOffset++] & 0xFF;
+ final long byte219 = blocks[blocksOffset++] & 0xFF;
+ final long byte220 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte212 & 7) << 60) | (byte213 << 52) | (byte214 << 44) | (byte215 << 36) | (byte216 << 28) | (byte217 << 20) | (byte218 << 12) | (byte219 << 4) | (byte220 >>> 4);
+ final long byte221 = blocks[blocksOffset++] & 0xFF;
+ final long byte222 = blocks[blocksOffset++] & 0xFF;
+ final long byte223 = blocks[blocksOffset++] & 0xFF;
+ final long byte224 = blocks[blocksOffset++] & 0xFF;
+ final long byte225 = blocks[blocksOffset++] & 0xFF;
+ final long byte226 = blocks[blocksOffset++] & 0xFF;
+ final long byte227 = blocks[blocksOffset++] & 0xFF;
+ final long byte228 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte220 & 15) << 59) | (byte221 << 51) | (byte222 << 43) | (byte223 << 35) | (byte224 << 27) | (byte225 << 19) | (byte226 << 11) | (byte227 << 3) | (byte228 >>> 5);
+ final long byte229 = blocks[blocksOffset++] & 0xFF;
+ final long byte230 = blocks[blocksOffset++] & 0xFF;
+ final long byte231 = blocks[blocksOffset++] & 0xFF;
+ final long byte232 = blocks[blocksOffset++] & 0xFF;
+ final long byte233 = blocks[blocksOffset++] & 0xFF;
+ final long byte234 = blocks[blocksOffset++] & 0xFF;
+ final long byte235 = blocks[blocksOffset++] & 0xFF;
+ final long byte236 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte228 & 31) << 58) | (byte229 << 50) | (byte230 << 42) | (byte231 << 34) | (byte232 << 26) | (byte233 << 18) | (byte234 << 10) | (byte235 << 2) | (byte236 >>> 6);
+ final long byte237 = blocks[blocksOffset++] & 0xFF;
+ final long byte238 = blocks[blocksOffset++] & 0xFF;
+ final long byte239 = blocks[blocksOffset++] & 0xFF;
+ final long byte240 = blocks[blocksOffset++] & 0xFF;
+ final long byte241 = blocks[blocksOffset++] & 0xFF;
+ final long byte242 = blocks[blocksOffset++] & 0xFF;
+ final long byte243 = blocks[blocksOffset++] & 0xFF;
+ final long byte244 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte236 & 63) << 57) | (byte237 << 49) | (byte238 << 41) | (byte239 << 33) | (byte240 << 25) | (byte241 << 17) | (byte242 << 9) | (byte243 << 1) | (byte244 >>> 7);
+ final long byte245 = blocks[blocksOffset++] & 0xFF;
+ final long byte246 = blocks[blocksOffset++] & 0xFF;
+ final long byte247 = blocks[blocksOffset++] & 0xFF;
+ final long byte248 = blocks[blocksOffset++] & 0xFF;
+ final long byte249 = blocks[blocksOffset++] & 0xFF;
+ final long byte250 = blocks[blocksOffset++] & 0xFF;
+ final long byte251 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte244 & 127) << 56) | (byte245 << 48) | (byte246 << 40) | (byte247 << 32) | (byte248 << 24) | (byte249 << 16) | (byte250 << 8) | byte251;
+ final long byte252 = blocks[blocksOffset++] & 0xFF;
+ final long byte253 = blocks[blocksOffset++] & 0xFF;
+ final long byte254 = blocks[blocksOffset++] & 0xFF;
+ final long byte255 = blocks[blocksOffset++] & 0xFF;
+ final long byte256 = blocks[blocksOffset++] & 0xFF;
+ final long byte257 = blocks[blocksOffset++] & 0xFF;
+ final long byte258 = blocks[blocksOffset++] & 0xFF;
+ final long byte259 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte252 << 55) | (byte253 << 47) | (byte254 << 39) | (byte255 << 31) | (byte256 << 23) | (byte257 << 15) | (byte258 << 7) | (byte259 >>> 1);
+ final long byte260 = blocks[blocksOffset++] & 0xFF;
+ final long byte261 = blocks[blocksOffset++] & 0xFF;
+ final long byte262 = blocks[blocksOffset++] & 0xFF;
+ final long byte263 = blocks[blocksOffset++] & 0xFF;
+ final long byte264 = blocks[blocksOffset++] & 0xFF;
+ final long byte265 = blocks[blocksOffset++] & 0xFF;
+ final long byte266 = blocks[blocksOffset++] & 0xFF;
+ final long byte267 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte259 & 1) << 62) | (byte260 << 54) | (byte261 << 46) | (byte262 << 38) | (byte263 << 30) | (byte264 << 22) | (byte265 << 14) | (byte266 << 6) | (byte267 >>> 2);
+ final long byte268 = blocks[blocksOffset++] & 0xFF;
+ final long byte269 = blocks[blocksOffset++] & 0xFF;
+ final long byte270 = blocks[blocksOffset++] & 0xFF;
+ final long byte271 = blocks[blocksOffset++] & 0xFF;
+ final long byte272 = blocks[blocksOffset++] & 0xFF;
+ final long byte273 = blocks[blocksOffset++] & 0xFF;
+ final long byte274 = blocks[blocksOffset++] & 0xFF;
+ final long byte275 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte267 & 3) << 61) | (byte268 << 53) | (byte269 << 45) | (byte270 << 37) | (byte271 << 29) | (byte272 << 21) | (byte273 << 13) | (byte274 << 5) | (byte275 >>> 3);
+ final long byte276 = blocks[blocksOffset++] & 0xFF;
+ final long byte277 = blocks[blocksOffset++] & 0xFF;
+ final long byte278 = blocks[blocksOffset++] & 0xFF;
+ final long byte279 = blocks[blocksOffset++] & 0xFF;
+ final long byte280 = blocks[blocksOffset++] & 0xFF;
+ final long byte281 = blocks[blocksOffset++] & 0xFF;
+ final long byte282 = blocks[blocksOffset++] & 0xFF;
+ final long byte283 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte275 & 7) << 60) | (byte276 << 52) | (byte277 << 44) | (byte278 << 36) | (byte279 << 28) | (byte280 << 20) | (byte281 << 12) | (byte282 << 4) | (byte283 >>> 4);
+ final long byte284 = blocks[blocksOffset++] & 0xFF;
+ final long byte285 = blocks[blocksOffset++] & 0xFF;
+ final long byte286 = blocks[blocksOffset++] & 0xFF;
+ final long byte287 = blocks[blocksOffset++] & 0xFF;
+ final long byte288 = blocks[blocksOffset++] & 0xFF;
+ final long byte289 = blocks[blocksOffset++] & 0xFF;
+ final long byte290 = blocks[blocksOffset++] & 0xFF;
+ final long byte291 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte283 & 15) << 59) | (byte284 << 51) | (byte285 << 43) | (byte286 << 35) | (byte287 << 27) | (byte288 << 19) | (byte289 << 11) | (byte290 << 3) | (byte291 >>> 5);
+ final long byte292 = blocks[blocksOffset++] & 0xFF;
+ final long byte293 = blocks[blocksOffset++] & 0xFF;
+ final long byte294 = blocks[blocksOffset++] & 0xFF;
+ final long byte295 = blocks[blocksOffset++] & 0xFF;
+ final long byte296 = blocks[blocksOffset++] & 0xFF;
+ final long byte297 = blocks[blocksOffset++] & 0xFF;
+ final long byte298 = blocks[blocksOffset++] & 0xFF;
+ final long byte299 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte291 & 31) << 58) | (byte292 << 50) | (byte293 << 42) | (byte294 << 34) | (byte295 << 26) | (byte296 << 18) | (byte297 << 10) | (byte298 << 2) | (byte299 >>> 6);
+ final long byte300 = blocks[blocksOffset++] & 0xFF;
+ final long byte301 = blocks[blocksOffset++] & 0xFF;
+ final long byte302 = blocks[blocksOffset++] & 0xFF;
+ final long byte303 = blocks[blocksOffset++] & 0xFF;
+ final long byte304 = blocks[blocksOffset++] & 0xFF;
+ final long byte305 = blocks[blocksOffset++] & 0xFF;
+ final long byte306 = blocks[blocksOffset++] & 0xFF;
+ final long byte307 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte299 & 63) << 57) | (byte300 << 49) | (byte301 << 41) | (byte302 << 33) | (byte303 << 25) | (byte304 << 17) | (byte305 << 9) | (byte306 << 1) | (byte307 >>> 7);
+ final long byte308 = blocks[blocksOffset++] & 0xFF;
+ final long byte309 = blocks[blocksOffset++] & 0xFF;
+ final long byte310 = blocks[blocksOffset++] & 0xFF;
+ final long byte311 = blocks[blocksOffset++] & 0xFF;
+ final long byte312 = blocks[blocksOffset++] & 0xFF;
+ final long byte313 = blocks[blocksOffset++] & 0xFF;
+ final long byte314 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte307 & 127) << 56) | (byte308 << 48) | (byte309 << 40) | (byte310 << 32) | (byte311 << 24) | (byte312 << 16) | (byte313 << 8) | byte314;
+ final long byte315 = blocks[blocksOffset++] & 0xFF;
+ final long byte316 = blocks[blocksOffset++] & 0xFF;
+ final long byte317 = blocks[blocksOffset++] & 0xFF;
+ final long byte318 = blocks[blocksOffset++] & 0xFF;
+ final long byte319 = blocks[blocksOffset++] & 0xFF;
+ final long byte320 = blocks[blocksOffset++] & 0xFF;
+ final long byte321 = blocks[blocksOffset++] & 0xFF;
+ final long byte322 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte315 << 55) | (byte316 << 47) | (byte317 << 39) | (byte318 << 31) | (byte319 << 23) | (byte320 << 15) | (byte321 << 7) | (byte322 >>> 1);
+ final long byte323 = blocks[blocksOffset++] & 0xFF;
+ final long byte324 = blocks[blocksOffset++] & 0xFF;
+ final long byte325 = blocks[blocksOffset++] & 0xFF;
+ final long byte326 = blocks[blocksOffset++] & 0xFF;
+ final long byte327 = blocks[blocksOffset++] & 0xFF;
+ final long byte328 = blocks[blocksOffset++] & 0xFF;
+ final long byte329 = blocks[blocksOffset++] & 0xFF;
+ final long byte330 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte322 & 1) << 62) | (byte323 << 54) | (byte324 << 46) | (byte325 << 38) | (byte326 << 30) | (byte327 << 22) | (byte328 << 14) | (byte329 << 6) | (byte330 >>> 2);
+ final long byte331 = blocks[blocksOffset++] & 0xFF;
+ final long byte332 = blocks[blocksOffset++] & 0xFF;
+ final long byte333 = blocks[blocksOffset++] & 0xFF;
+ final long byte334 = blocks[blocksOffset++] & 0xFF;
+ final long byte335 = blocks[blocksOffset++] & 0xFF;
+ final long byte336 = blocks[blocksOffset++] & 0xFF;
+ final long byte337 = blocks[blocksOffset++] & 0xFF;
+ final long byte338 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte330 & 3) << 61) | (byte331 << 53) | (byte332 << 45) | (byte333 << 37) | (byte334 << 29) | (byte335 << 21) | (byte336 << 13) | (byte337 << 5) | (byte338 >>> 3);
+ final long byte339 = blocks[blocksOffset++] & 0xFF;
+ final long byte340 = blocks[blocksOffset++] & 0xFF;
+ final long byte341 = blocks[blocksOffset++] & 0xFF;
+ final long byte342 = blocks[blocksOffset++] & 0xFF;
+ final long byte343 = blocks[blocksOffset++] & 0xFF;
+ final long byte344 = blocks[blocksOffset++] & 0xFF;
+ final long byte345 = blocks[blocksOffset++] & 0xFF;
+ final long byte346 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte338 & 7) << 60) | (byte339 << 52) | (byte340 << 44) | (byte341 << 36) | (byte342 << 28) | (byte343 << 20) | (byte344 << 12) | (byte345 << 4) | (byte346 >>> 4);
+ final long byte347 = blocks[blocksOffset++] & 0xFF;
+ final long byte348 = blocks[blocksOffset++] & 0xFF;
+ final long byte349 = blocks[blocksOffset++] & 0xFF;
+ final long byte350 = blocks[blocksOffset++] & 0xFF;
+ final long byte351 = blocks[blocksOffset++] & 0xFF;
+ final long byte352 = blocks[blocksOffset++] & 0xFF;
+ final long byte353 = blocks[blocksOffset++] & 0xFF;
+ final long byte354 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte346 & 15) << 59) | (byte347 << 51) | (byte348 << 43) | (byte349 << 35) | (byte350 << 27) | (byte351 << 19) | (byte352 << 11) | (byte353 << 3) | (byte354 >>> 5);
+ final long byte355 = blocks[blocksOffset++] & 0xFF;
+ final long byte356 = blocks[blocksOffset++] & 0xFF;
+ final long byte357 = blocks[blocksOffset++] & 0xFF;
+ final long byte358 = blocks[blocksOffset++] & 0xFF;
+ final long byte359 = blocks[blocksOffset++] & 0xFF;
+ final long byte360 = blocks[blocksOffset++] & 0xFF;
+ final long byte361 = blocks[blocksOffset++] & 0xFF;
+ final long byte362 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte354 & 31) << 58) | (byte355 << 50) | (byte356 << 42) | (byte357 << 34) | (byte358 << 26) | (byte359 << 18) | (byte360 << 10) | (byte361 << 2) | (byte362 >>> 6);
+ final long byte363 = blocks[blocksOffset++] & 0xFF;
+ final long byte364 = blocks[blocksOffset++] & 0xFF;
+ final long byte365 = blocks[blocksOffset++] & 0xFF;
+ final long byte366 = blocks[blocksOffset++] & 0xFF;
+ final long byte367 = blocks[blocksOffset++] & 0xFF;
+ final long byte368 = blocks[blocksOffset++] & 0xFF;
+ final long byte369 = blocks[blocksOffset++] & 0xFF;
+ final long byte370 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte362 & 63) << 57) | (byte363 << 49) | (byte364 << 41) | (byte365 << 33) | (byte366 << 25) | (byte367 << 17) | (byte368 << 9) | (byte369 << 1) | (byte370 >>> 7);
+ final long byte371 = blocks[blocksOffset++] & 0xFF;
+ final long byte372 = blocks[blocksOffset++] & 0xFF;
+ final long byte373 = blocks[blocksOffset++] & 0xFF;
+ final long byte374 = blocks[blocksOffset++] & 0xFF;
+ final long byte375 = blocks[blocksOffset++] & 0xFF;
+ final long byte376 = blocks[blocksOffset++] & 0xFF;
+ final long byte377 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte370 & 127) << 56) | (byte371 << 48) | (byte372 << 40) | (byte373 << 32) | (byte374 << 24) | (byte375 << 16) | (byte376 << 8) | byte377;
+ final long byte378 = blocks[blocksOffset++] & 0xFF;
+ final long byte379 = blocks[blocksOffset++] & 0xFF;
+ final long byte380 = blocks[blocksOffset++] & 0xFF;
+ final long byte381 = blocks[blocksOffset++] & 0xFF;
+ final long byte382 = blocks[blocksOffset++] & 0xFF;
+ final long byte383 = blocks[blocksOffset++] & 0xFF;
+ final long byte384 = blocks[blocksOffset++] & 0xFF;
+ final long byte385 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte378 << 55) | (byte379 << 47) | (byte380 << 39) | (byte381 << 31) | (byte382 << 23) | (byte383 << 15) | (byte384 << 7) | (byte385 >>> 1);
+ final long byte386 = blocks[blocksOffset++] & 0xFF;
+ final long byte387 = blocks[blocksOffset++] & 0xFF;
+ final long byte388 = blocks[blocksOffset++] & 0xFF;
+ final long byte389 = blocks[blocksOffset++] & 0xFF;
+ final long byte390 = blocks[blocksOffset++] & 0xFF;
+ final long byte391 = blocks[blocksOffset++] & 0xFF;
+ final long byte392 = blocks[blocksOffset++] & 0xFF;
+ final long byte393 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte385 & 1) << 62) | (byte386 << 54) | (byte387 << 46) | (byte388 << 38) | (byte389 << 30) | (byte390 << 22) | (byte391 << 14) | (byte392 << 6) | (byte393 >>> 2);
+ final long byte394 = blocks[blocksOffset++] & 0xFF;
+ final long byte395 = blocks[blocksOffset++] & 0xFF;
+ final long byte396 = blocks[blocksOffset++] & 0xFF;
+ final long byte397 = blocks[blocksOffset++] & 0xFF;
+ final long byte398 = blocks[blocksOffset++] & 0xFF;
+ final long byte399 = blocks[blocksOffset++] & 0xFF;
+ final long byte400 = blocks[blocksOffset++] & 0xFF;
+ final long byte401 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte393 & 3) << 61) | (byte394 << 53) | (byte395 << 45) | (byte396 << 37) | (byte397 << 29) | (byte398 << 21) | (byte399 << 13) | (byte400 << 5) | (byte401 >>> 3);
+ final long byte402 = blocks[blocksOffset++] & 0xFF;
+ final long byte403 = blocks[blocksOffset++] & 0xFF;
+ final long byte404 = blocks[blocksOffset++] & 0xFF;
+ final long byte405 = blocks[blocksOffset++] & 0xFF;
+ final long byte406 = blocks[blocksOffset++] & 0xFF;
+ final long byte407 = blocks[blocksOffset++] & 0xFF;
+ final long byte408 = blocks[blocksOffset++] & 0xFF;
+ final long byte409 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte401 & 7) << 60) | (byte402 << 52) | (byte403 << 44) | (byte404 << 36) | (byte405 << 28) | (byte406 << 20) | (byte407 << 12) | (byte408 << 4) | (byte409 >>> 4);
+ final long byte410 = blocks[blocksOffset++] & 0xFF;
+ final long byte411 = blocks[blocksOffset++] & 0xFF;
+ final long byte412 = blocks[blocksOffset++] & 0xFF;
+ final long byte413 = blocks[blocksOffset++] & 0xFF;
+ final long byte414 = blocks[blocksOffset++] & 0xFF;
+ final long byte415 = blocks[blocksOffset++] & 0xFF;
+ final long byte416 = blocks[blocksOffset++] & 0xFF;
+ final long byte417 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte409 & 15) << 59) | (byte410 << 51) | (byte411 << 43) | (byte412 << 35) | (byte413 << 27) | (byte414 << 19) | (byte415 << 11) | (byte416 << 3) | (byte417 >>> 5);
+ final long byte418 = blocks[blocksOffset++] & 0xFF;
+ final long byte419 = blocks[blocksOffset++] & 0xFF;
+ final long byte420 = blocks[blocksOffset++] & 0xFF;
+ final long byte421 = blocks[blocksOffset++] & 0xFF;
+ final long byte422 = blocks[blocksOffset++] & 0xFF;
+ final long byte423 = blocks[blocksOffset++] & 0xFF;
+ final long byte424 = blocks[blocksOffset++] & 0xFF;
+ final long byte425 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte417 & 31) << 58) | (byte418 << 50) | (byte419 << 42) | (byte420 << 34) | (byte421 << 26) | (byte422 << 18) | (byte423 << 10) | (byte424 << 2) | (byte425 >>> 6);
+ final long byte426 = blocks[blocksOffset++] & 0xFF;
+ final long byte427 = blocks[blocksOffset++] & 0xFF;
+ final long byte428 = blocks[blocksOffset++] & 0xFF;
+ final long byte429 = blocks[blocksOffset++] & 0xFF;
+ final long byte430 = blocks[blocksOffset++] & 0xFF;
+ final long byte431 = blocks[blocksOffset++] & 0xFF;
+ final long byte432 = blocks[blocksOffset++] & 0xFF;
+ final long byte433 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte425 & 63) << 57) | (byte426 << 49) | (byte427 << 41) | (byte428 << 33) | (byte429 << 25) | (byte430 << 17) | (byte431 << 9) | (byte432 << 1) | (byte433 >>> 7);
+ final long byte434 = blocks[blocksOffset++] & 0xFF;
+ final long byte435 = blocks[blocksOffset++] & 0xFF;
+ final long byte436 = blocks[blocksOffset++] & 0xFF;
+ final long byte437 = blocks[blocksOffset++] & 0xFF;
+ final long byte438 = blocks[blocksOffset++] & 0xFF;
+ final long byte439 = blocks[blocksOffset++] & 0xFF;
+ final long byte440 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte433 & 127) << 56) | (byte434 << 48) | (byte435 << 40) | (byte436 << 32) | (byte437 << 24) | (byte438 << 16) | (byte439 << 8) | byte440;
+ final long byte441 = blocks[blocksOffset++] & 0xFF;
+ final long byte442 = blocks[blocksOffset++] & 0xFF;
+ final long byte443 = blocks[blocksOffset++] & 0xFF;
+ final long byte444 = blocks[blocksOffset++] & 0xFF;
+ final long byte445 = blocks[blocksOffset++] & 0xFF;
+ final long byte446 = blocks[blocksOffset++] & 0xFF;
+ final long byte447 = blocks[blocksOffset++] & 0xFF;
+ final long byte448 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = (byte441 << 55) | (byte442 << 47) | (byte443 << 39) | (byte444 << 31) | (byte445 << 23) | (byte446 << 15) | (byte447 << 7) | (byte448 >>> 1);
+ final long byte449 = blocks[blocksOffset++] & 0xFF;
+ final long byte450 = blocks[blocksOffset++] & 0xFF;
+ final long byte451 = blocks[blocksOffset++] & 0xFF;
+ final long byte452 = blocks[blocksOffset++] & 0xFF;
+ final long byte453 = blocks[blocksOffset++] & 0xFF;
+ final long byte454 = blocks[blocksOffset++] & 0xFF;
+ final long byte455 = blocks[blocksOffset++] & 0xFF;
+ final long byte456 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte448 & 1) << 62) | (byte449 << 54) | (byte450 << 46) | (byte451 << 38) | (byte452 << 30) | (byte453 << 22) | (byte454 << 14) | (byte455 << 6) | (byte456 >>> 2);
+ final long byte457 = blocks[blocksOffset++] & 0xFF;
+ final long byte458 = blocks[blocksOffset++] & 0xFF;
+ final long byte459 = blocks[blocksOffset++] & 0xFF;
+ final long byte460 = blocks[blocksOffset++] & 0xFF;
+ final long byte461 = blocks[blocksOffset++] & 0xFF;
+ final long byte462 = blocks[blocksOffset++] & 0xFF;
+ final long byte463 = blocks[blocksOffset++] & 0xFF;
+ final long byte464 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte456 & 3) << 61) | (byte457 << 53) | (byte458 << 45) | (byte459 << 37) | (byte460 << 29) | (byte461 << 21) | (byte462 << 13) | (byte463 << 5) | (byte464 >>> 3);
+ final long byte465 = blocks[blocksOffset++] & 0xFF;
+ final long byte466 = blocks[blocksOffset++] & 0xFF;
+ final long byte467 = blocks[blocksOffset++] & 0xFF;
+ final long byte468 = blocks[blocksOffset++] & 0xFF;
+ final long byte469 = blocks[blocksOffset++] & 0xFF;
+ final long byte470 = blocks[blocksOffset++] & 0xFF;
+ final long byte471 = blocks[blocksOffset++] & 0xFF;
+ final long byte472 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte464 & 7) << 60) | (byte465 << 52) | (byte466 << 44) | (byte467 << 36) | (byte468 << 28) | (byte469 << 20) | (byte470 << 12) | (byte471 << 4) | (byte472 >>> 4);
+ final long byte473 = blocks[blocksOffset++] & 0xFF;
+ final long byte474 = blocks[blocksOffset++] & 0xFF;
+ final long byte475 = blocks[blocksOffset++] & 0xFF;
+ final long byte476 = blocks[blocksOffset++] & 0xFF;
+ final long byte477 = blocks[blocksOffset++] & 0xFF;
+ final long byte478 = blocks[blocksOffset++] & 0xFF;
+ final long byte479 = blocks[blocksOffset++] & 0xFF;
+ final long byte480 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte472 & 15) << 59) | (byte473 << 51) | (byte474 << 43) | (byte475 << 35) | (byte476 << 27) | (byte477 << 19) | (byte478 << 11) | (byte479 << 3) | (byte480 >>> 5);
+ final long byte481 = blocks[blocksOffset++] & 0xFF;
+ final long byte482 = blocks[blocksOffset++] & 0xFF;
+ final long byte483 = blocks[blocksOffset++] & 0xFF;
+ final long byte484 = blocks[blocksOffset++] & 0xFF;
+ final long byte485 = blocks[blocksOffset++] & 0xFF;
+ final long byte486 = blocks[blocksOffset++] & 0xFF;
+ final long byte487 = blocks[blocksOffset++] & 0xFF;
+ final long byte488 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte480 & 31) << 58) | (byte481 << 50) | (byte482 << 42) | (byte483 << 34) | (byte484 << 26) | (byte485 << 18) | (byte486 << 10) | (byte487 << 2) | (byte488 >>> 6);
+ final long byte489 = blocks[blocksOffset++] & 0xFF;
+ final long byte490 = blocks[blocksOffset++] & 0xFF;
+ final long byte491 = blocks[blocksOffset++] & 0xFF;
+ final long byte492 = blocks[blocksOffset++] & 0xFF;
+ final long byte493 = blocks[blocksOffset++] & 0xFF;
+ final long byte494 = blocks[blocksOffset++] & 0xFF;
+ final long byte495 = blocks[blocksOffset++] & 0xFF;
+ final long byte496 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte488 & 63) << 57) | (byte489 << 49) | (byte490 << 41) | (byte491 << 33) | (byte492 << 25) | (byte493 << 17) | (byte494 << 9) | (byte495 << 1) | (byte496 >>> 7);
+ final long byte497 = blocks[blocksOffset++] & 0xFF;
+ final long byte498 = blocks[blocksOffset++] & 0xFF;
+ final long byte499 = blocks[blocksOffset++] & 0xFF;
+ final long byte500 = blocks[blocksOffset++] & 0xFF;
+ final long byte501 = blocks[blocksOffset++] & 0xFF;
+ final long byte502 = blocks[blocksOffset++] & 0xFF;
+ final long byte503 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = ((byte496 & 127) << 56) | (byte497 << 48) | (byte498 << 40) | (byte499 << 32) | (byte500 << 24) | (byte501 << 16) | (byte502 << 8) | byte503;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset] & 0xffffffffL) >>> 62);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset] & 0xffffffffL) >>> 61);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset] & 0xffffffffL) >>> 60);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset] & 0xffffffffL) >>> 59);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset] & 0xffffffffL) >>> 58);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset] & 0xffffffffL) >>> 57);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset] & 0xffffffffL) >>> 56);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset] & 0xffffffffL) >>> 55);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset] & 0xffffffffL) >>> 54);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset] & 0xffffffffL) >>> 53);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset] & 0xffffffffL) >>> 52);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset] & 0xffffffffL) >>> 51);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset] & 0xffffffffL) >>> 50);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset] & 0xffffffffL) >>> 49);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset] & 0xffffffffL) >>> 48);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset] & 0xffffffffL) >>> 47);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset] & 0xffffffffL) >>> 46);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset] & 0xffffffffL) >>> 45);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset] & 0xffffffffL) >>> 44);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset] & 0xffffffffL) >>> 43);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset] & 0xffffffffL) >>> 42);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset] & 0xffffffffL) >>> 41);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset] & 0xffffffffL) >>> 40);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset] & 0xffffffffL) >>> 39);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset] & 0xffffffffL) >>> 38);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset] & 0xffffffffL) >>> 37);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset] & 0xffffffffL) >>> 36);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset] & 0xffffffffL) >>> 35);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset] & 0xffffffffL) >>> 34);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset] & 0xffffffffL) >>> 33);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset] & 0xffffffffL) >>> 32);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset] & 0xffffffffL) >>> 31);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset] & 0xffffffffL) >>> 30);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset] & 0xffffffffL) >>> 29);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset] & 0xffffffffL) >>> 28);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset] & 0xffffffffL) >>> 27);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset] & 0xffffffffL) >>> 26);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset] & 0xffffffffL) >>> 25);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset] & 0xffffffffL) >>> 24);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset] & 0xffffffffL) >>> 23);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset] & 0xffffffffL) >>> 22);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset] & 0xffffffffL) >>> 21);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset] & 0xffffffffL) >>> 20);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset] & 0xffffffffL) >>> 19);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset] & 0xffffffffL) >>> 18);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset] & 0xffffffffL) >>> 17);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset] & 0xffffffffL) >>> 16);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset] & 0xffffffffL) >>> 15);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset] & 0xffffffffL) >>> 14);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset] & 0xffffffffL) >>> 13);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset] & 0xffffffffL) >>> 12);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset] & 0xffffffffL) >>> 11);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset] & 0xffffffffL) >>> 10);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset] & 0xffffffffL) >>> 9);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset] & 0xffffffffL) >>> 8);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset] & 0xffffffffL) >>> 7);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset] & 0xffffffffL) >>> 6);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset] & 0xffffffffL) >>> 5);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset] & 0xffffffffL) >>> 4);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset] & 0xffffffffL) >>> 3);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset] & 0xffffffffL) >>> 2);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset] & 0xffffffffL) >>> 1);
+ blocks[blocksOffset++] = ((values[valuesOffset++] & 0xffffffffL) << 63) | (values[valuesOffset++] & 0xffffffffL);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] << 1) | (values[valuesOffset] >>> 62);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 2) | (values[valuesOffset] >>> 61);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 3) | (values[valuesOffset] >>> 60);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 4) | (values[valuesOffset] >>> 59);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 5) | (values[valuesOffset] >>> 58);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 6) | (values[valuesOffset] >>> 57);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 7) | (values[valuesOffset] >>> 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 8) | (values[valuesOffset] >>> 55);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 9) | (values[valuesOffset] >>> 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 10) | (values[valuesOffset] >>> 53);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 11) | (values[valuesOffset] >>> 52);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 12) | (values[valuesOffset] >>> 51);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 13) | (values[valuesOffset] >>> 50);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 14) | (values[valuesOffset] >>> 49);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 15) | (values[valuesOffset] >>> 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 16) | (values[valuesOffset] >>> 47);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 17) | (values[valuesOffset] >>> 46);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 18) | (values[valuesOffset] >>> 45);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 19) | (values[valuesOffset] >>> 44);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 20) | (values[valuesOffset] >>> 43);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 21) | (values[valuesOffset] >>> 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 22) | (values[valuesOffset] >>> 41);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 23) | (values[valuesOffset] >>> 40);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 24) | (values[valuesOffset] >>> 39);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 25) | (values[valuesOffset] >>> 38);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 26) | (values[valuesOffset] >>> 37);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 27) | (values[valuesOffset] >>> 36);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 28) | (values[valuesOffset] >>> 35);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 29) | (values[valuesOffset] >>> 34);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 30) | (values[valuesOffset] >>> 33);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 31) | (values[valuesOffset] >>> 32);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 32) | (values[valuesOffset] >>> 31);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 33) | (values[valuesOffset] >>> 30);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 34) | (values[valuesOffset] >>> 29);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 35) | (values[valuesOffset] >>> 28);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 36) | (values[valuesOffset] >>> 27);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 37) | (values[valuesOffset] >>> 26);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 38) | (values[valuesOffset] >>> 25);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 39) | (values[valuesOffset] >>> 24);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 40) | (values[valuesOffset] >>> 23);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 41) | (values[valuesOffset] >>> 22);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 42) | (values[valuesOffset] >>> 21);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 43) | (values[valuesOffset] >>> 20);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 44) | (values[valuesOffset] >>> 19);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 45) | (values[valuesOffset] >>> 18);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 46) | (values[valuesOffset] >>> 17);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 47) | (values[valuesOffset] >>> 16);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 48) | (values[valuesOffset] >>> 15);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 49) | (values[valuesOffset] >>> 14);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 50) | (values[valuesOffset] >>> 13);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 51) | (values[valuesOffset] >>> 12);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 52) | (values[valuesOffset] >>> 11);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 53) | (values[valuesOffset] >>> 10);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 54) | (values[valuesOffset] >>> 9);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 55) | (values[valuesOffset] >>> 8);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 56) | (values[valuesOffset] >>> 7);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 57) | (values[valuesOffset] >>> 6);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 58) | (values[valuesOffset] >>> 5);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 59) | (values[valuesOffset] >>> 4);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 60) | (values[valuesOffset] >>> 3);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 61) | (values[valuesOffset] >>> 2);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 62) | (values[valuesOffset] >>> 1);
+ blocks[blocksOffset++] = (values[valuesOffset++] << 63) | values[valuesOffset++];
}
}
- static final class Packed64BulkOperation64 extends BulkOperation {
+ }
+ ,
+ PACKED_64 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 1;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- System.arraycopy(blocks, bi, values, vi, iterations);
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ System.arraycopy(blocks, blocksOffset, values, valuesOffset, valueCount() * iterations);
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- System.arraycopy(values, bi, blocks, vi, iterations);
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ LongBuffer.wrap(values, valuesOffset, iterations * valueCount()).put(ByteBuffer.wrap(blocks, blocksOffset, 8 * iterations * blockCount()).asLongBuffer());
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ System.arraycopy(values, valuesOffset, blocks, blocksOffset, valueCount() * iterations);
+ }
+
}
+ ,
- static final class Packed64SingleBlockBulkOperation1 extends BulkOperation {
+ PACKED_SINGLE_BLOCK_1 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 64;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 1L;
- values[vi++] = (block >>> 1) & 1L;
- values[vi++] = (block >>> 2) & 1L;
- values[vi++] = (block >>> 3) & 1L;
- values[vi++] = (block >>> 4) & 1L;
- values[vi++] = (block >>> 5) & 1L;
- values[vi++] = (block >>> 6) & 1L;
- values[vi++] = (block >>> 7) & 1L;
- values[vi++] = (block >>> 8) & 1L;
- values[vi++] = (block >>> 9) & 1L;
- values[vi++] = (block >>> 10) & 1L;
- values[vi++] = (block >>> 11) & 1L;
- values[vi++] = (block >>> 12) & 1L;
- values[vi++] = (block >>> 13) & 1L;
- values[vi++] = (block >>> 14) & 1L;
- values[vi++] = (block >>> 15) & 1L;
- values[vi++] = (block >>> 16) & 1L;
- values[vi++] = (block >>> 17) & 1L;
- values[vi++] = (block >>> 18) & 1L;
- values[vi++] = (block >>> 19) & 1L;
- values[vi++] = (block >>> 20) & 1L;
- values[vi++] = (block >>> 21) & 1L;
- values[vi++] = (block >>> 22) & 1L;
- values[vi++] = (block >>> 23) & 1L;
- values[vi++] = (block >>> 24) & 1L;
- values[vi++] = (block >>> 25) & 1L;
- values[vi++] = (block >>> 26) & 1L;
- values[vi++] = (block >>> 27) & 1L;
- values[vi++] = (block >>> 28) & 1L;
- values[vi++] = (block >>> 29) & 1L;
- values[vi++] = (block >>> 30) & 1L;
- values[vi++] = (block >>> 31) & 1L;
- values[vi++] = (block >>> 32) & 1L;
- values[vi++] = (block >>> 33) & 1L;
- values[vi++] = (block >>> 34) & 1L;
- values[vi++] = (block >>> 35) & 1L;
- values[vi++] = (block >>> 36) & 1L;
- values[vi++] = (block >>> 37) & 1L;
- values[vi++] = (block >>> 38) & 1L;
- values[vi++] = (block >>> 39) & 1L;
- values[vi++] = (block >>> 40) & 1L;
- values[vi++] = (block >>> 41) & 1L;
- values[vi++] = (block >>> 42) & 1L;
- values[vi++] = (block >>> 43) & 1L;
- values[vi++] = (block >>> 44) & 1L;
- values[vi++] = (block >>> 45) & 1L;
- values[vi++] = (block >>> 46) & 1L;
- values[vi++] = (block >>> 47) & 1L;
- values[vi++] = (block >>> 48) & 1L;
- values[vi++] = (block >>> 49) & 1L;
- values[vi++] = (block >>> 50) & 1L;
- values[vi++] = (block >>> 51) & 1L;
- values[vi++] = (block >>> 52) & 1L;
- values[vi++] = (block >>> 53) & 1L;
- values[vi++] = (block >>> 54) & 1L;
- values[vi++] = (block >>> 55) & 1L;
- values[vi++] = (block >>> 56) & 1L;
- values[vi++] = (block >>> 57) & 1L;
- values[vi++] = (block >>> 58) & 1L;
- values[vi++] = (block >>> 59) & 1L;
- values[vi++] = (block >>> 60) & 1L;
- values[vi++] = (block >>> 61) & 1L;
- values[vi++] = (block >>> 62) & 1L;
- values[vi++] = block >>> 63;
- }
- }
-
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 1) | (values[vi++] << 2) | (values[vi++] << 3) | (values[vi++] << 4) | (values[vi++] << 5) | (values[vi++] << 6) | (values[vi++] << 7) | (values[vi++] << 8) | (values[vi++] << 9) | (values[vi++] << 10) | (values[vi++] << 11) | (values[vi++] << 12) | (values[vi++] << 13) | (values[vi++] << 14) | (values[vi++] << 15) | (values[vi++] << 16) | (values[vi++] << 17) | (values[vi++] << 18) | (values[vi++] << 19) | (values[vi++] << 20) | (values[vi++] << 21) | (values[vi++] << 22) | (values[vi++] << 23) | (values[vi++] << 24) | (values[vi++] << 25) | (values[vi++] << 26) | (values[vi++] << 27) | (values[vi++] << 28) | (values[vi++] << 29) | (values[vi++] << 30) | (values[vi++] << 31) | (values[vi++] << 32) | (values[vi++] << 33) | (values[vi++] << 34) | (values[vi++] << 35) | (values[vi++] << 36) | (values[vi++] << 37) | (values[vi++] << 38) | (values[vi++] << 39) | (values[vi++] << 40) | (values[vi++] << 41) | (values[vi++] << 42) | (values[vi++] << 43) | (values[vi++] << 44) | (values[vi++] << 45) | (values[vi++] << 46) | (values[vi++] << 47) | (values[vi++] << 48) | (values[vi++] << 49) | (values[vi++] << 50) | (values[vi++] << 51) | (values[vi++] << 52) | (values[vi++] << 53) | (values[vi++] << 54) | (values[vi++] << 55) | (values[vi++] << 56) | (values[vi++] << 57) | (values[vi++] << 58) | (values[vi++] << 59) | (values[vi++] << 60) | (values[vi++] << 61) | (values[vi++] << 62) | (values[vi++] << 63);
- }
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 1L);
+ values[valuesOffset++] = (int) ((block >>> 1) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 2) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 3) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 4) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 5) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 6) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 7) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 8) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 9) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 10) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 11) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 13) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 14) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 15) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 16) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 17) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 18) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 19) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 20) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 21) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 22) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 23) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 25) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 26) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 27) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 28) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 29) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 31) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 32) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 33) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 34) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 35) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 37) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 38) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 39) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 41) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 42) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 43) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 44) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 45) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 46) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 47) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 49) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 50) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 51) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 52) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 53) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 54) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 55) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 56) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 57) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 58) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 59) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 60) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 61) & 1L);
+ values[valuesOffset++] = (int) ((block >>> 62) & 1L);
+ values[valuesOffset++] = (int) (block >>> 63);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 1;
+ values[valuesOffset++] = (byte0 >>> 1) & 1;
+ values[valuesOffset++] = (byte0 >>> 2) & 1;
+ values[valuesOffset++] = (byte0 >>> 3) & 1;
+ values[valuesOffset++] = (byte0 >>> 4) & 1;
+ values[valuesOffset++] = (byte0 >>> 5) & 1;
+ values[valuesOffset++] = (byte0 >>> 6) & 1;
+ values[valuesOffset++] = byte0 >>> 7;
+ values[valuesOffset++] = byte1 & 1;
+ values[valuesOffset++] = (byte1 >>> 1) & 1;
+ values[valuesOffset++] = (byte1 >>> 2) & 1;
+ values[valuesOffset++] = (byte1 >>> 3) & 1;
+ values[valuesOffset++] = (byte1 >>> 4) & 1;
+ values[valuesOffset++] = (byte1 >>> 5) & 1;
+ values[valuesOffset++] = (byte1 >>> 6) & 1;
+ values[valuesOffset++] = byte1 >>> 7;
+ values[valuesOffset++] = byte2 & 1;
+ values[valuesOffset++] = (byte2 >>> 1) & 1;
+ values[valuesOffset++] = (byte2 >>> 2) & 1;
+ values[valuesOffset++] = (byte2 >>> 3) & 1;
+ values[valuesOffset++] = (byte2 >>> 4) & 1;
+ values[valuesOffset++] = (byte2 >>> 5) & 1;
+ values[valuesOffset++] = (byte2 >>> 6) & 1;
+ values[valuesOffset++] = byte2 >>> 7;
+ values[valuesOffset++] = byte3 & 1;
+ values[valuesOffset++] = (byte3 >>> 1) & 1;
+ values[valuesOffset++] = (byte3 >>> 2) & 1;
+ values[valuesOffset++] = (byte3 >>> 3) & 1;
+ values[valuesOffset++] = (byte3 >>> 4) & 1;
+ values[valuesOffset++] = (byte3 >>> 5) & 1;
+ values[valuesOffset++] = (byte3 >>> 6) & 1;
+ values[valuesOffset++] = byte3 >>> 7;
+ values[valuesOffset++] = byte4 & 1;
+ values[valuesOffset++] = (byte4 >>> 1) & 1;
+ values[valuesOffset++] = (byte4 >>> 2) & 1;
+ values[valuesOffset++] = (byte4 >>> 3) & 1;
+ values[valuesOffset++] = (byte4 >>> 4) & 1;
+ values[valuesOffset++] = (byte4 >>> 5) & 1;
+ values[valuesOffset++] = (byte4 >>> 6) & 1;
+ values[valuesOffset++] = byte4 >>> 7;
+ values[valuesOffset++] = byte5 & 1;
+ values[valuesOffset++] = (byte5 >>> 1) & 1;
+ values[valuesOffset++] = (byte5 >>> 2) & 1;
+ values[valuesOffset++] = (byte5 >>> 3) & 1;
+ values[valuesOffset++] = (byte5 >>> 4) & 1;
+ values[valuesOffset++] = (byte5 >>> 5) & 1;
+ values[valuesOffset++] = (byte5 >>> 6) & 1;
+ values[valuesOffset++] = byte5 >>> 7;
+ values[valuesOffset++] = byte6 & 1;
+ values[valuesOffset++] = (byte6 >>> 1) & 1;
+ values[valuesOffset++] = (byte6 >>> 2) & 1;
+ values[valuesOffset++] = (byte6 >>> 3) & 1;
+ values[valuesOffset++] = (byte6 >>> 4) & 1;
+ values[valuesOffset++] = (byte6 >>> 5) & 1;
+ values[valuesOffset++] = (byte6 >>> 6) & 1;
+ values[valuesOffset++] = byte6 >>> 7;
+ values[valuesOffset++] = byte7 & 1;
+ values[valuesOffset++] = (byte7 >>> 1) & 1;
+ values[valuesOffset++] = (byte7 >>> 2) & 1;
+ values[valuesOffset++] = (byte7 >>> 3) & 1;
+ values[valuesOffset++] = (byte7 >>> 4) & 1;
+ values[valuesOffset++] = (byte7 >>> 5) & 1;
+ values[valuesOffset++] = (byte7 >>> 6) & 1;
+ values[valuesOffset++] = byte7 >>> 7;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 1L;
+ values[valuesOffset++] = (block >>> 1) & 1L;
+ values[valuesOffset++] = (block >>> 2) & 1L;
+ values[valuesOffset++] = (block >>> 3) & 1L;
+ values[valuesOffset++] = (block >>> 4) & 1L;
+ values[valuesOffset++] = (block >>> 5) & 1L;
+ values[valuesOffset++] = (block >>> 6) & 1L;
+ values[valuesOffset++] = (block >>> 7) & 1L;
+ values[valuesOffset++] = (block >>> 8) & 1L;
+ values[valuesOffset++] = (block >>> 9) & 1L;
+ values[valuesOffset++] = (block >>> 10) & 1L;
+ values[valuesOffset++] = (block >>> 11) & 1L;
+ values[valuesOffset++] = (block >>> 12) & 1L;
+ values[valuesOffset++] = (block >>> 13) & 1L;
+ values[valuesOffset++] = (block >>> 14) & 1L;
+ values[valuesOffset++] = (block >>> 15) & 1L;
+ values[valuesOffset++] = (block >>> 16) & 1L;
+ values[valuesOffset++] = (block >>> 17) & 1L;
+ values[valuesOffset++] = (block >>> 18) & 1L;
+ values[valuesOffset++] = (block >>> 19) & 1L;
+ values[valuesOffset++] = (block >>> 20) & 1L;
+ values[valuesOffset++] = (block >>> 21) & 1L;
+ values[valuesOffset++] = (block >>> 22) & 1L;
+ values[valuesOffset++] = (block >>> 23) & 1L;
+ values[valuesOffset++] = (block >>> 24) & 1L;
+ values[valuesOffset++] = (block >>> 25) & 1L;
+ values[valuesOffset++] = (block >>> 26) & 1L;
+ values[valuesOffset++] = (block >>> 27) & 1L;
+ values[valuesOffset++] = (block >>> 28) & 1L;
+ values[valuesOffset++] = (block >>> 29) & 1L;
+ values[valuesOffset++] = (block >>> 30) & 1L;
+ values[valuesOffset++] = (block >>> 31) & 1L;
+ values[valuesOffset++] = (block >>> 32) & 1L;
+ values[valuesOffset++] = (block >>> 33) & 1L;
+ values[valuesOffset++] = (block >>> 34) & 1L;
+ values[valuesOffset++] = (block >>> 35) & 1L;
+ values[valuesOffset++] = (block >>> 36) & 1L;
+ values[valuesOffset++] = (block >>> 37) & 1L;
+ values[valuesOffset++] = (block >>> 38) & 1L;
+ values[valuesOffset++] = (block >>> 39) & 1L;
+ values[valuesOffset++] = (block >>> 40) & 1L;
+ values[valuesOffset++] = (block >>> 41) & 1L;
+ values[valuesOffset++] = (block >>> 42) & 1L;
+ values[valuesOffset++] = (block >>> 43) & 1L;
+ values[valuesOffset++] = (block >>> 44) & 1L;
+ values[valuesOffset++] = (block >>> 45) & 1L;
+ values[valuesOffset++] = (block >>> 46) & 1L;
+ values[valuesOffset++] = (block >>> 47) & 1L;
+ values[valuesOffset++] = (block >>> 48) & 1L;
+ values[valuesOffset++] = (block >>> 49) & 1L;
+ values[valuesOffset++] = (block >>> 50) & 1L;
+ values[valuesOffset++] = (block >>> 51) & 1L;
+ values[valuesOffset++] = (block >>> 52) & 1L;
+ values[valuesOffset++] = (block >>> 53) & 1L;
+ values[valuesOffset++] = (block >>> 54) & 1L;
+ values[valuesOffset++] = (block >>> 55) & 1L;
+ values[valuesOffset++] = (block >>> 56) & 1L;
+ values[valuesOffset++] = (block >>> 57) & 1L;
+ values[valuesOffset++] = (block >>> 58) & 1L;
+ values[valuesOffset++] = (block >>> 59) & 1L;
+ values[valuesOffset++] = (block >>> 60) & 1L;
+ values[valuesOffset++] = (block >>> 61) & 1L;
+ values[valuesOffset++] = (block >>> 62) & 1L;
+ values[valuesOffset++] = block >>> 63;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 1;
+ values[valuesOffset++] = (byte0 >>> 1) & 1;
+ values[valuesOffset++] = (byte0 >>> 2) & 1;
+ values[valuesOffset++] = (byte0 >>> 3) & 1;
+ values[valuesOffset++] = (byte0 >>> 4) & 1;
+ values[valuesOffset++] = (byte0 >>> 5) & 1;
+ values[valuesOffset++] = (byte0 >>> 6) & 1;
+ values[valuesOffset++] = byte0 >>> 7;
+ values[valuesOffset++] = byte1 & 1;
+ values[valuesOffset++] = (byte1 >>> 1) & 1;
+ values[valuesOffset++] = (byte1 >>> 2) & 1;
+ values[valuesOffset++] = (byte1 >>> 3) & 1;
+ values[valuesOffset++] = (byte1 >>> 4) & 1;
+ values[valuesOffset++] = (byte1 >>> 5) & 1;
+ values[valuesOffset++] = (byte1 >>> 6) & 1;
+ values[valuesOffset++] = byte1 >>> 7;
+ values[valuesOffset++] = byte2 & 1;
+ values[valuesOffset++] = (byte2 >>> 1) & 1;
+ values[valuesOffset++] = (byte2 >>> 2) & 1;
+ values[valuesOffset++] = (byte2 >>> 3) & 1;
+ values[valuesOffset++] = (byte2 >>> 4) & 1;
+ values[valuesOffset++] = (byte2 >>> 5) & 1;
+ values[valuesOffset++] = (byte2 >>> 6) & 1;
+ values[valuesOffset++] = byte2 >>> 7;
+ values[valuesOffset++] = byte3 & 1;
+ values[valuesOffset++] = (byte3 >>> 1) & 1;
+ values[valuesOffset++] = (byte3 >>> 2) & 1;
+ values[valuesOffset++] = (byte3 >>> 3) & 1;
+ values[valuesOffset++] = (byte3 >>> 4) & 1;
+ values[valuesOffset++] = (byte3 >>> 5) & 1;
+ values[valuesOffset++] = (byte3 >>> 6) & 1;
+ values[valuesOffset++] = byte3 >>> 7;
+ values[valuesOffset++] = byte4 & 1;
+ values[valuesOffset++] = (byte4 >>> 1) & 1;
+ values[valuesOffset++] = (byte4 >>> 2) & 1;
+ values[valuesOffset++] = (byte4 >>> 3) & 1;
+ values[valuesOffset++] = (byte4 >>> 4) & 1;
+ values[valuesOffset++] = (byte4 >>> 5) & 1;
+ values[valuesOffset++] = (byte4 >>> 6) & 1;
+ values[valuesOffset++] = byte4 >>> 7;
+ values[valuesOffset++] = byte5 & 1;
+ values[valuesOffset++] = (byte5 >>> 1) & 1;
+ values[valuesOffset++] = (byte5 >>> 2) & 1;
+ values[valuesOffset++] = (byte5 >>> 3) & 1;
+ values[valuesOffset++] = (byte5 >>> 4) & 1;
+ values[valuesOffset++] = (byte5 >>> 5) & 1;
+ values[valuesOffset++] = (byte5 >>> 6) & 1;
+ values[valuesOffset++] = byte5 >>> 7;
+ values[valuesOffset++] = byte6 & 1;
+ values[valuesOffset++] = (byte6 >>> 1) & 1;
+ values[valuesOffset++] = (byte6 >>> 2) & 1;
+ values[valuesOffset++] = (byte6 >>> 3) & 1;
+ values[valuesOffset++] = (byte6 >>> 4) & 1;
+ values[valuesOffset++] = (byte6 >>> 5) & 1;
+ values[valuesOffset++] = (byte6 >>> 6) & 1;
+ values[valuesOffset++] = byte6 >>> 7;
+ values[valuesOffset++] = byte7 & 1;
+ values[valuesOffset++] = (byte7 >>> 1) & 1;
+ values[valuesOffset++] = (byte7 >>> 2) & 1;
+ values[valuesOffset++] = (byte7 >>> 3) & 1;
+ values[valuesOffset++] = (byte7 >>> 4) & 1;
+ values[valuesOffset++] = (byte7 >>> 5) & 1;
+ values[valuesOffset++] = (byte7 >>> 6) & 1;
+ values[valuesOffset++] = byte7 >>> 7;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 1) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 11) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 13) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 17) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 19) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 23) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 29) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 31) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 37) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 41) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 43) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 47) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 53) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 55) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 59) | ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 61) | ((values[valuesOffset++] & 0xffffffffL) << 62) | ((values[valuesOffset++] & 0xffffffffL) << 63);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 1) | (values[valuesOffset++] << 2) | (values[valuesOffset++] << 3) | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 5) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 7) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 11) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 13) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 17) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 19) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 23) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 29) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 31) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 37) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 41) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 43) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 47) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 53) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 55) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 57) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 59) | (values[valuesOffset++] << 60) | (values[valuesOffset++] << 61) | (values[valuesOffset++] << 62) | (values[valuesOffset++] << 63);
}
}
- static final class Packed64SingleBlockBulkOperation2 extends BulkOperation {
+ } ,
+
+ PACKED_SINGLE_BLOCK_2 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 32;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 3L;
- values[vi++] = (block >>> 2) & 3L;
- values[vi++] = (block >>> 4) & 3L;
- values[vi++] = (block >>> 6) & 3L;
- values[vi++] = (block >>> 8) & 3L;
- values[vi++] = (block >>> 10) & 3L;
- values[vi++] = (block >>> 12) & 3L;
- values[vi++] = (block >>> 14) & 3L;
- values[vi++] = (block >>> 16) & 3L;
- values[vi++] = (block >>> 18) & 3L;
- values[vi++] = (block >>> 20) & 3L;
- values[vi++] = (block >>> 22) & 3L;
- values[vi++] = (block >>> 24) & 3L;
- values[vi++] = (block >>> 26) & 3L;
- values[vi++] = (block >>> 28) & 3L;
- values[vi++] = (block >>> 30) & 3L;
- values[vi++] = (block >>> 32) & 3L;
- values[vi++] = (block >>> 34) & 3L;
- values[vi++] = (block >>> 36) & 3L;
- values[vi++] = (block >>> 38) & 3L;
- values[vi++] = (block >>> 40) & 3L;
- values[vi++] = (block >>> 42) & 3L;
- values[vi++] = (block >>> 44) & 3L;
- values[vi++] = (block >>> 46) & 3L;
- values[vi++] = (block >>> 48) & 3L;
- values[vi++] = (block >>> 50) & 3L;
- values[vi++] = (block >>> 52) & 3L;
- values[vi++] = (block >>> 54) & 3L;
- values[vi++] = (block >>> 56) & 3L;
- values[vi++] = (block >>> 58) & 3L;
- values[vi++] = (block >>> 60) & 3L;
- values[vi++] = block >>> 62;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 3L);
+ values[valuesOffset++] = (int) ((block >>> 2) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 4) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 6) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 8) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 10) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 14) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 16) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 18) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 20) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 22) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 26) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 28) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 32) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 34) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 38) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 42) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 44) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 46) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 50) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 52) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 54) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 56) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 58) & 3L);
+ values[valuesOffset++] = (int) ((block >>> 60) & 3L);
+ values[valuesOffset++] = (int) (block >>> 62);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 3;
+ values[valuesOffset++] = (byte0 >>> 2) & 3;
+ values[valuesOffset++] = (byte0 >>> 4) & 3;
+ values[valuesOffset++] = byte0 >>> 6;
+ values[valuesOffset++] = byte1 & 3;
+ values[valuesOffset++] = (byte1 >>> 2) & 3;
+ values[valuesOffset++] = (byte1 >>> 4) & 3;
+ values[valuesOffset++] = byte1 >>> 6;
+ values[valuesOffset++] = byte2 & 3;
+ values[valuesOffset++] = (byte2 >>> 2) & 3;
+ values[valuesOffset++] = (byte2 >>> 4) & 3;
+ values[valuesOffset++] = byte2 >>> 6;
+ values[valuesOffset++] = byte3 & 3;
+ values[valuesOffset++] = (byte3 >>> 2) & 3;
+ values[valuesOffset++] = (byte3 >>> 4) & 3;
+ values[valuesOffset++] = byte3 >>> 6;
+ values[valuesOffset++] = byte4 & 3;
+ values[valuesOffset++] = (byte4 >>> 2) & 3;
+ values[valuesOffset++] = (byte4 >>> 4) & 3;
+ values[valuesOffset++] = byte4 >>> 6;
+ values[valuesOffset++] = byte5 & 3;
+ values[valuesOffset++] = (byte5 >>> 2) & 3;
+ values[valuesOffset++] = (byte5 >>> 4) & 3;
+ values[valuesOffset++] = byte5 >>> 6;
+ values[valuesOffset++] = byte6 & 3;
+ values[valuesOffset++] = (byte6 >>> 2) & 3;
+ values[valuesOffset++] = (byte6 >>> 4) & 3;
+ values[valuesOffset++] = byte6 >>> 6;
+ values[valuesOffset++] = byte7 & 3;
+ values[valuesOffset++] = (byte7 >>> 2) & 3;
+ values[valuesOffset++] = (byte7 >>> 4) & 3;
+ values[valuesOffset++] = byte7 >>> 6;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 3L;
+ values[valuesOffset++] = (block >>> 2) & 3L;
+ values[valuesOffset++] = (block >>> 4) & 3L;
+ values[valuesOffset++] = (block >>> 6) & 3L;
+ values[valuesOffset++] = (block >>> 8) & 3L;
+ values[valuesOffset++] = (block >>> 10) & 3L;
+ values[valuesOffset++] = (block >>> 12) & 3L;
+ values[valuesOffset++] = (block >>> 14) & 3L;
+ values[valuesOffset++] = (block >>> 16) & 3L;
+ values[valuesOffset++] = (block >>> 18) & 3L;
+ values[valuesOffset++] = (block >>> 20) & 3L;
+ values[valuesOffset++] = (block >>> 22) & 3L;
+ values[valuesOffset++] = (block >>> 24) & 3L;
+ values[valuesOffset++] = (block >>> 26) & 3L;
+ values[valuesOffset++] = (block >>> 28) & 3L;
+ values[valuesOffset++] = (block >>> 30) & 3L;
+ values[valuesOffset++] = (block >>> 32) & 3L;
+ values[valuesOffset++] = (block >>> 34) & 3L;
+ values[valuesOffset++] = (block >>> 36) & 3L;
+ values[valuesOffset++] = (block >>> 38) & 3L;
+ values[valuesOffset++] = (block >>> 40) & 3L;
+ values[valuesOffset++] = (block >>> 42) & 3L;
+ values[valuesOffset++] = (block >>> 44) & 3L;
+ values[valuesOffset++] = (block >>> 46) & 3L;
+ values[valuesOffset++] = (block >>> 48) & 3L;
+ values[valuesOffset++] = (block >>> 50) & 3L;
+ values[valuesOffset++] = (block >>> 52) & 3L;
+ values[valuesOffset++] = (block >>> 54) & 3L;
+ values[valuesOffset++] = (block >>> 56) & 3L;
+ values[valuesOffset++] = (block >>> 58) & 3L;
+ values[valuesOffset++] = (block >>> 60) & 3L;
+ values[valuesOffset++] = block >>> 62;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 3;
+ values[valuesOffset++] = (byte0 >>> 2) & 3;
+ values[valuesOffset++] = (byte0 >>> 4) & 3;
+ values[valuesOffset++] = byte0 >>> 6;
+ values[valuesOffset++] = byte1 & 3;
+ values[valuesOffset++] = (byte1 >>> 2) & 3;
+ values[valuesOffset++] = (byte1 >>> 4) & 3;
+ values[valuesOffset++] = byte1 >>> 6;
+ values[valuesOffset++] = byte2 & 3;
+ values[valuesOffset++] = (byte2 >>> 2) & 3;
+ values[valuesOffset++] = (byte2 >>> 4) & 3;
+ values[valuesOffset++] = byte2 >>> 6;
+ values[valuesOffset++] = byte3 & 3;
+ values[valuesOffset++] = (byte3 >>> 2) & 3;
+ values[valuesOffset++] = (byte3 >>> 4) & 3;
+ values[valuesOffset++] = byte3 >>> 6;
+ values[valuesOffset++] = byte4 & 3;
+ values[valuesOffset++] = (byte4 >>> 2) & 3;
+ values[valuesOffset++] = (byte4 >>> 4) & 3;
+ values[valuesOffset++] = byte4 >>> 6;
+ values[valuesOffset++] = byte5 & 3;
+ values[valuesOffset++] = (byte5 >>> 2) & 3;
+ values[valuesOffset++] = (byte5 >>> 4) & 3;
+ values[valuesOffset++] = byte5 >>> 6;
+ values[valuesOffset++] = byte6 & 3;
+ values[valuesOffset++] = (byte6 >>> 2) & 3;
+ values[valuesOffset++] = (byte6 >>> 4) & 3;
+ values[valuesOffset++] = byte6 >>> 6;
+ values[valuesOffset++] = byte7 & 3;
+ values[valuesOffset++] = (byte7 >>> 2) & 3;
+ values[valuesOffset++] = (byte7 >>> 4) & 3;
+ values[valuesOffset++] = byte7 >>> 6;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 2) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 22) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 26) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 34) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 38) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 46) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 58) | ((values[valuesOffset++] & 0xffffffffL) << 60) | ((values[valuesOffset++] & 0xffffffffL) << 62);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 2) | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 22) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 26) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 34) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 38) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 46) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 58) | (values[valuesOffset++] << 60) | (values[valuesOffset++] << 62);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 2) | (values[vi++] << 4) | (values[vi++] << 6) | (values[vi++] << 8) | (values[vi++] << 10) | (values[vi++] << 12) | (values[vi++] << 14) | (values[vi++] << 16) | (values[vi++] << 18) | (values[vi++] << 20) | (values[vi++] << 22) | (values[vi++] << 24) | (values[vi++] << 26) | (values[vi++] << 28) | (values[vi++] << 30) | (values[vi++] << 32) | (values[vi++] << 34) | (values[vi++] << 36) | (values[vi++] << 38) | (values[vi++] << 40) | (values[vi++] << 42) | (values[vi++] << 44) | (values[vi++] << 46) | (values[vi++] << 48) | (values[vi++] << 50) | (values[vi++] << 52) | (values[vi++] << 54) | (values[vi++] << 56) | (values[vi++] << 58) | (values[vi++] << 60) | (values[vi++] << 62);
- }
- }
- }
+ } ,
- static final class Packed64SingleBlockBulkOperation3 extends BulkOperation {
+ PACKED_SINGLE_BLOCK_3 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 21;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 7L;
- values[vi++] = (block >>> 3) & 7L;
- values[vi++] = (block >>> 6) & 7L;
- values[vi++] = (block >>> 9) & 7L;
- values[vi++] = (block >>> 12) & 7L;
- values[vi++] = (block >>> 15) & 7L;
- values[vi++] = (block >>> 18) & 7L;
- values[vi++] = (block >>> 21) & 7L;
- values[vi++] = (block >>> 24) & 7L;
- values[vi++] = (block >>> 27) & 7L;
- values[vi++] = (block >>> 30) & 7L;
- values[vi++] = (block >>> 33) & 7L;
- values[vi++] = (block >>> 36) & 7L;
- values[vi++] = (block >>> 39) & 7L;
- values[vi++] = (block >>> 42) & 7L;
- values[vi++] = (block >>> 45) & 7L;
- values[vi++] = (block >>> 48) & 7L;
- values[vi++] = (block >>> 51) & 7L;
- values[vi++] = (block >>> 54) & 7L;
- values[vi++] = (block >>> 57) & 7L;
- values[vi++] = block >>> 60;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 7L);
+ values[valuesOffset++] = (int) ((block >>> 3) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 6) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 9) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 15) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 18) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 21) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 27) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 33) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 39) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 42) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 45) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 51) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 54) & 7L);
+ values[valuesOffset++] = (int) ((block >>> 57) & 7L);
+ values[valuesOffset++] = (int) (block >>> 60);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 7;
+ values[valuesOffset++] = (byte0 >>> 3) & 7;
+ values[valuesOffset++] = (byte0 >>> 6) | ((byte1 & 1) << 2);
+ values[valuesOffset++] = (byte1 >>> 1) & 7;
+ values[valuesOffset++] = (byte1 >>> 4) & 7;
+ values[valuesOffset++] = (byte1 >>> 7) | ((byte2 & 3) << 1);
+ values[valuesOffset++] = (byte2 >>> 2) & 7;
+ values[valuesOffset++] = byte2 >>> 5;
+ values[valuesOffset++] = byte3 & 7;
+ values[valuesOffset++] = (byte3 >>> 3) & 7;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 1) << 2);
+ values[valuesOffset++] = (byte4 >>> 1) & 7;
+ values[valuesOffset++] = (byte4 >>> 4) & 7;
+ values[valuesOffset++] = (byte4 >>> 7) | ((byte5 & 3) << 1);
+ values[valuesOffset++] = (byte5 >>> 2) & 7;
+ values[valuesOffset++] = byte5 >>> 5;
+ values[valuesOffset++] = byte6 & 7;
+ values[valuesOffset++] = (byte6 >>> 3) & 7;
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 1) << 2);
+ values[valuesOffset++] = (byte7 >>> 1) & 7;
+ values[valuesOffset++] = (byte7 >>> 4) & 7;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 7L;
+ values[valuesOffset++] = (block >>> 3) & 7L;
+ values[valuesOffset++] = (block >>> 6) & 7L;
+ values[valuesOffset++] = (block >>> 9) & 7L;
+ values[valuesOffset++] = (block >>> 12) & 7L;
+ values[valuesOffset++] = (block >>> 15) & 7L;
+ values[valuesOffset++] = (block >>> 18) & 7L;
+ values[valuesOffset++] = (block >>> 21) & 7L;
+ values[valuesOffset++] = (block >>> 24) & 7L;
+ values[valuesOffset++] = (block >>> 27) & 7L;
+ values[valuesOffset++] = (block >>> 30) & 7L;
+ values[valuesOffset++] = (block >>> 33) & 7L;
+ values[valuesOffset++] = (block >>> 36) & 7L;
+ values[valuesOffset++] = (block >>> 39) & 7L;
+ values[valuesOffset++] = (block >>> 42) & 7L;
+ values[valuesOffset++] = (block >>> 45) & 7L;
+ values[valuesOffset++] = (block >>> 48) & 7L;
+ values[valuesOffset++] = (block >>> 51) & 7L;
+ values[valuesOffset++] = (block >>> 54) & 7L;
+ values[valuesOffset++] = (block >>> 57) & 7L;
+ values[valuesOffset++] = block >>> 60;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 7;
+ values[valuesOffset++] = (byte0 >>> 3) & 7;
+ values[valuesOffset++] = (byte0 >>> 6) | ((byte1 & 1) << 2);
+ values[valuesOffset++] = (byte1 >>> 1) & 7;
+ values[valuesOffset++] = (byte1 >>> 4) & 7;
+ values[valuesOffset++] = (byte1 >>> 7) | ((byte2 & 3) << 1);
+ values[valuesOffset++] = (byte2 >>> 2) & 7;
+ values[valuesOffset++] = byte2 >>> 5;
+ values[valuesOffset++] = byte3 & 7;
+ values[valuesOffset++] = (byte3 >>> 3) & 7;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 1) << 2);
+ values[valuesOffset++] = (byte4 >>> 1) & 7;
+ values[valuesOffset++] = (byte4 >>> 4) & 7;
+ values[valuesOffset++] = (byte4 >>> 7) | ((byte5 & 3) << 1);
+ values[valuesOffset++] = (byte5 >>> 2) & 7;
+ values[valuesOffset++] = byte5 >>> 5;
+ values[valuesOffset++] = byte6 & 7;
+ values[valuesOffset++] = (byte6 >>> 3) & 7;
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 1) << 2);
+ values[valuesOffset++] = (byte7 >>> 1) & 7;
+ values[valuesOffset++] = (byte7 >>> 4) & 7;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 3) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 33) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 39) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 51) | ((values[valuesOffset++] & 0xffffffffL) << 54) | ((values[valuesOffset++] & 0xffffffffL) << 57) | ((values[valuesOffset++] & 0xffffffffL) << 60);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 3) | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 33) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 39) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 51) | (values[valuesOffset++] << 54) | (values[valuesOffset++] << 57) | (values[valuesOffset++] << 60);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 3) | (values[vi++] << 6) | (values[vi++] << 9) | (values[vi++] << 12) | (values[vi++] << 15) | (values[vi++] << 18) | (values[vi++] << 21) | (values[vi++] << 24) | (values[vi++] << 27) | (values[vi++] << 30) | (values[vi++] << 33) | (values[vi++] << 36) | (values[vi++] << 39) | (values[vi++] << 42) | (values[vi++] << 45) | (values[vi++] << 48) | (values[vi++] << 51) | (values[vi++] << 54) | (values[vi++] << 57) | (values[vi++] << 60);
+ } ,
+
+ PACKED_SINGLE_BLOCK_4 {
+
+ public int blockCount() {
+ return 1;
}
+
+ public int valueCount() {
+ return 16;
+ }
+
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 15L);
+ values[valuesOffset++] = (int) ((block >>> 4) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 8) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 16) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 20) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 28) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 32) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 44) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 52) & 15L);
+ values[valuesOffset++] = (int) ((block >>> 56) & 15L);
+ values[valuesOffset++] = (int) (block >>> 60);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 15;
+ values[valuesOffset++] = byte0 >>> 4;
+ values[valuesOffset++] = byte1 & 15;
+ values[valuesOffset++] = byte1 >>> 4;
+ values[valuesOffset++] = byte2 & 15;
+ values[valuesOffset++] = byte2 >>> 4;
+ values[valuesOffset++] = byte3 & 15;
+ values[valuesOffset++] = byte3 >>> 4;
+ values[valuesOffset++] = byte4 & 15;
+ values[valuesOffset++] = byte4 >>> 4;
+ values[valuesOffset++] = byte5 & 15;
+ values[valuesOffset++] = byte5 >>> 4;
+ values[valuesOffset++] = byte6 & 15;
+ values[valuesOffset++] = byte6 >>> 4;
+ values[valuesOffset++] = byte7 & 15;
+ values[valuesOffset++] = byte7 >>> 4;
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 15L;
+ values[valuesOffset++] = (block >>> 4) & 15L;
+ values[valuesOffset++] = (block >>> 8) & 15L;
+ values[valuesOffset++] = (block >>> 12) & 15L;
+ values[valuesOffset++] = (block >>> 16) & 15L;
+ values[valuesOffset++] = (block >>> 20) & 15L;
+ values[valuesOffset++] = (block >>> 24) & 15L;
+ values[valuesOffset++] = (block >>> 28) & 15L;
+ values[valuesOffset++] = (block >>> 32) & 15L;
+ values[valuesOffset++] = (block >>> 36) & 15L;
+ values[valuesOffset++] = (block >>> 40) & 15L;
+ values[valuesOffset++] = (block >>> 44) & 15L;
+ values[valuesOffset++] = (block >>> 48) & 15L;
+ values[valuesOffset++] = (block >>> 52) & 15L;
+ values[valuesOffset++] = (block >>> 56) & 15L;
+ values[valuesOffset++] = block >>> 60;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 15;
+ values[valuesOffset++] = byte0 >>> 4;
+ values[valuesOffset++] = byte1 & 15;
+ values[valuesOffset++] = byte1 >>> 4;
+ values[valuesOffset++] = byte2 & 15;
+ values[valuesOffset++] = byte2 >>> 4;
+ values[valuesOffset++] = byte3 & 15;
+ values[valuesOffset++] = byte3 >>> 4;
+ values[valuesOffset++] = byte4 & 15;
+ values[valuesOffset++] = byte4 >>> 4;
+ values[valuesOffset++] = byte5 & 15;
+ values[valuesOffset++] = byte5 >>> 4;
+ values[valuesOffset++] = byte6 & 15;
+ values[valuesOffset++] = byte6 >>> 4;
+ values[valuesOffset++] = byte7 & 15;
+ values[valuesOffset++] = byte7 >>> 4;
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 4) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 44) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 52) | ((values[valuesOffset++] & 0xffffffffL) << 56) | ((values[valuesOffset++] & 0xffffffffL) << 60);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 4) | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 44) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 52) | (values[valuesOffset++] << 56) | (values[valuesOffset++] << 60);
}
}
- static final class Packed64SingleBlockBulkOperation4 extends BulkOperation {
+ } ,
+
+ PACKED_SINGLE_BLOCK_5 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
- return 16;
+ public int valueCount() {
+ return 12;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 15L;
- values[vi++] = (block >>> 4) & 15L;
- values[vi++] = (block >>> 8) & 15L;
- values[vi++] = (block >>> 12) & 15L;
- values[vi++] = (block >>> 16) & 15L;
- values[vi++] = (block >>> 20) & 15L;
- values[vi++] = (block >>> 24) & 15L;
- values[vi++] = (block >>> 28) & 15L;
- values[vi++] = (block >>> 32) & 15L;
- values[vi++] = (block >>> 36) & 15L;
- values[vi++] = (block >>> 40) & 15L;
- values[vi++] = (block >>> 44) & 15L;
- values[vi++] = (block >>> 48) & 15L;
- values[vi++] = (block >>> 52) & 15L;
- values[vi++] = (block >>> 56) & 15L;
- values[vi++] = block >>> 60;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 31L);
+ values[valuesOffset++] = (int) ((block >>> 5) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 10) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 15) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 20) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 25) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 35) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 45) & 31L);
+ values[valuesOffset++] = (int) ((block >>> 50) & 31L);
+ values[valuesOffset++] = (int) (block >>> 55);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 31;
+ values[valuesOffset++] = (byte0 >>> 5) | ((byte1 & 3) << 3);
+ values[valuesOffset++] = (byte1 >>> 2) & 31;
+ values[valuesOffset++] = (byte1 >>> 7) | ((byte2 & 15) << 1);
+ values[valuesOffset++] = (byte2 >>> 4) | ((byte3 & 1) << 4);
+ values[valuesOffset++] = (byte3 >>> 1) & 31;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 7) << 2);
+ values[valuesOffset++] = byte4 >>> 3;
+ values[valuesOffset++] = byte5 & 31;
+ values[valuesOffset++] = (byte5 >>> 5) | ((byte6 & 3) << 3);
+ values[valuesOffset++] = (byte6 >>> 2) & 31;
+ values[valuesOffset++] = (byte6 >>> 7) | ((byte7 & 15) << 1);
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 31L;
+ values[valuesOffset++] = (block >>> 5) & 31L;
+ values[valuesOffset++] = (block >>> 10) & 31L;
+ values[valuesOffset++] = (block >>> 15) & 31L;
+ values[valuesOffset++] = (block >>> 20) & 31L;
+ values[valuesOffset++] = (block >>> 25) & 31L;
+ values[valuesOffset++] = (block >>> 30) & 31L;
+ values[valuesOffset++] = (block >>> 35) & 31L;
+ values[valuesOffset++] = (block >>> 40) & 31L;
+ values[valuesOffset++] = (block >>> 45) & 31L;
+ values[valuesOffset++] = (block >>> 50) & 31L;
+ values[valuesOffset++] = block >>> 55;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 31;
+ values[valuesOffset++] = (byte0 >>> 5) | ((byte1 & 3) << 3);
+ values[valuesOffset++] = (byte1 >>> 2) & 31;
+ values[valuesOffset++] = (byte1 >>> 7) | ((byte2 & 15) << 1);
+ values[valuesOffset++] = (byte2 >>> 4) | ((byte3 & 1) << 4);
+ values[valuesOffset++] = (byte3 >>> 1) & 31;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 7) << 2);
+ values[valuesOffset++] = byte4 >>> 3;
+ values[valuesOffset++] = byte5 & 31;
+ values[valuesOffset++] = (byte5 >>> 5) | ((byte6 & 3) << 3);
+ values[valuesOffset++] = (byte6 >>> 2) & 31;
+ values[valuesOffset++] = (byte6 >>> 7) | ((byte7 & 15) << 1);
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 5) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 15) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 25) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 50) | ((values[valuesOffset++] & 0xffffffffL) << 55);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 5) | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 15) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 25) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 50) | (values[valuesOffset++] << 55);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
- for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 4) | (values[vi++] << 8) | (values[vi++] << 12) | (values[vi++] << 16) | (values[vi++] << 20) | (values[vi++] << 24) | (values[vi++] << 28) | (values[vi++] << 32) | (values[vi++] << 36) | (values[vi++] << 40) | (values[vi++] << 44) | (values[vi++] << 48) | (values[vi++] << 52) | (values[vi++] << 56) | (values[vi++] << 60);
+ } ,
+
+ PACKED_SINGLE_BLOCK_6 {
+
+ public int blockCount() {
+ return 1;
+ }
+
+ public int valueCount() {
+ return 10;
}
+
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 63L);
+ values[valuesOffset++] = (int) ((block >>> 6) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 18) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 42) & 63L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 63L);
+ values[valuesOffset++] = (int) (block >>> 54);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 63;
+ values[valuesOffset++] = (byte0 >>> 6) | ((byte1 & 15) << 2);
+ values[valuesOffset++] = (byte1 >>> 4) | ((byte2 & 3) << 4);
+ values[valuesOffset++] = byte2 >>> 2;
+ values[valuesOffset++] = byte3 & 63;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 15) << 2);
+ values[valuesOffset++] = (byte4 >>> 4) | ((byte5 & 3) << 4);
+ values[valuesOffset++] = byte5 >>> 2;
+ values[valuesOffset++] = byte6 & 63;
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 15) << 2);
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 63L;
+ values[valuesOffset++] = (block >>> 6) & 63L;
+ values[valuesOffset++] = (block >>> 12) & 63L;
+ values[valuesOffset++] = (block >>> 18) & 63L;
+ values[valuesOffset++] = (block >>> 24) & 63L;
+ values[valuesOffset++] = (block >>> 30) & 63L;
+ values[valuesOffset++] = (block >>> 36) & 63L;
+ values[valuesOffset++] = (block >>> 42) & 63L;
+ values[valuesOffset++] = (block >>> 48) & 63L;
+ values[valuesOffset++] = block >>> 54;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 63;
+ values[valuesOffset++] = (byte0 >>> 6) | ((byte1 & 15) << 2);
+ values[valuesOffset++] = (byte1 >>> 4) | ((byte2 & 3) << 4);
+ values[valuesOffset++] = byte2 >>> 2;
+ values[valuesOffset++] = byte3 & 63;
+ values[valuesOffset++] = (byte3 >>> 6) | ((byte4 & 15) << 2);
+ values[valuesOffset++] = (byte4 >>> 4) | ((byte5 & 3) << 4);
+ values[valuesOffset++] = byte5 >>> 2;
+ values[valuesOffset++] = byte6 & 63;
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 15) << 2);
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 6) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 54);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 6) | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 54);
}
}
- static final class Packed64SingleBlockBulkOperation5 extends BulkOperation {
+ } ,
+
+ PACKED_SINGLE_BLOCK_7 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
- return 12;
+ public int valueCount() {
+ return 9;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 31L;
- values[vi++] = (block >>> 5) & 31L;
- values[vi++] = (block >>> 10) & 31L;
- values[vi++] = (block >>> 15) & 31L;
- values[vi++] = (block >>> 20) & 31L;
- values[vi++] = (block >>> 25) & 31L;
- values[vi++] = (block >>> 30) & 31L;
- values[vi++] = (block >>> 35) & 31L;
- values[vi++] = (block >>> 40) & 31L;
- values[vi++] = (block >>> 45) & 31L;
- values[vi++] = (block >>> 50) & 31L;
- values[vi++] = block >>> 55;
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 127L);
+ values[valuesOffset++] = (int) ((block >>> 7) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 14) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 21) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 28) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 35) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 42) & 127L);
+ values[valuesOffset++] = (int) ((block >>> 49) & 127L);
+ values[valuesOffset++] = (int) (block >>> 56);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 5) | (values[vi++] << 10) | (values[vi++] << 15) | (values[vi++] << 20) | (values[vi++] << 25) | (values[vi++] << 30) | (values[vi++] << 35) | (values[vi++] << 40) | (values[vi++] << 45) | (values[vi++] << 50) | (values[vi++] << 55);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 127;
+ values[valuesOffset++] = (byte0 >>> 7) | ((byte1 & 63) << 1);
+ values[valuesOffset++] = (byte1 >>> 6) | ((byte2 & 31) << 2);
+ values[valuesOffset++] = (byte2 >>> 5) | ((byte3 & 15) << 3);
+ values[valuesOffset++] = (byte3 >>> 4) | ((byte4 & 7) << 4);
+ values[valuesOffset++] = (byte4 >>> 3) | ((byte5 & 3) << 5);
+ values[valuesOffset++] = (byte5 >>> 2) | ((byte6 & 1) << 6);
+ values[valuesOffset++] = byte6 >>> 1;
+ values[valuesOffset++] = byte7 & 127;
}
}
- }
-
- static final class Packed64SingleBlockBulkOperation6 extends BulkOperation {
- public int blocks() {
- return 1;
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 127L;
+ values[valuesOffset++] = (block >>> 7) & 127L;
+ values[valuesOffset++] = (block >>> 14) & 127L;
+ values[valuesOffset++] = (block >>> 21) & 127L;
+ values[valuesOffset++] = (block >>> 28) & 127L;
+ values[valuesOffset++] = (block >>> 35) & 127L;
+ values[valuesOffset++] = (block >>> 42) & 127L;
+ values[valuesOffset++] = (block >>> 49) & 127L;
+ values[valuesOffset++] = block >>> 56;
}
-
- public int values() {
- return 10;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 63L;
- values[vi++] = (block >>> 6) & 63L;
- values[vi++] = (block >>> 12) & 63L;
- values[vi++] = (block >>> 18) & 63L;
- values[vi++] = (block >>> 24) & 63L;
- values[vi++] = (block >>> 30) & 63L;
- values[vi++] = (block >>> 36) & 63L;
- values[vi++] = (block >>> 42) & 63L;
- values[vi++] = (block >>> 48) & 63L;
- values[vi++] = block >>> 54;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 & 127;
+ values[valuesOffset++] = (byte0 >>> 7) | ((byte1 & 63) << 1);
+ values[valuesOffset++] = (byte1 >>> 6) | ((byte2 & 31) << 2);
+ values[valuesOffset++] = (byte2 >>> 5) | ((byte3 & 15) << 3);
+ values[valuesOffset++] = (byte3 >>> 4) | ((byte4 & 7) << 4);
+ values[valuesOffset++] = (byte4 >>> 3) | ((byte5 & 3) << 5);
+ values[valuesOffset++] = (byte5 >>> 2) | ((byte6 & 1) << 6);
+ values[valuesOffset++] = byte6 >>> 1;
+ values[valuesOffset++] = byte7 & 127;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 6) | (values[vi++] << 12) | (values[vi++] << 18) | (values[vi++] << 24) | (values[vi++] << 30) | (values[vi++] << 36) | (values[vi++] << 42) | (values[vi++] << 48) | (values[vi++] << 54);
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 7) | ((values[valuesOffset++] & 0xffffffffL) << 14) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 28) | ((values[valuesOffset++] & 0xffffffffL) << 35) | ((values[valuesOffset++] & 0xffffffffL) << 42) | ((values[valuesOffset++] & 0xffffffffL) << 49) | ((values[valuesOffset++] & 0xffffffffL) << 56);
}
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 7) | (values[valuesOffset++] << 14) | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 28) | (values[valuesOffset++] << 35) | (values[valuesOffset++] << 42) | (values[valuesOffset++] << 49) | (values[valuesOffset++] << 56);
+ }
}
- static final class Packed64SingleBlockBulkOperation7 extends BulkOperation {
+ } ,
+
+ PACKED_SINGLE_BLOCK_8 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
- return 9;
+ public int valueCount() {
+ return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 127L;
- values[vi++] = (block >>> 7) & 127L;
- values[vi++] = (block >>> 14) & 127L;
- values[vi++] = (block >>> 21) & 127L;
- values[vi++] = (block >>> 28) & 127L;
- values[vi++] = (block >>> 35) & 127L;
- values[vi++] = (block >>> 42) & 127L;
- values[vi++] = (block >>> 49) & 127L;
- values[vi++] = block >>> 56;
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 255L);
+ values[valuesOffset++] = (int) ((block >>> 8) & 255L);
+ values[valuesOffset++] = (int) ((block >>> 16) & 255L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 255L);
+ values[valuesOffset++] = (int) ((block >>> 32) & 255L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 255L);
+ values[valuesOffset++] = (int) ((block >>> 48) & 255L);
+ values[valuesOffset++] = (int) (block >>> 56);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 7) | (values[vi++] << 14) | (values[vi++] << 21) | (values[vi++] << 28) | (values[vi++] << 35) | (values[vi++] << 42) | (values[vi++] << 49) | (values[vi++] << 56);
- }
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0;
+ values[valuesOffset++] = byte1;
+ values[valuesOffset++] = byte2;
+ values[valuesOffset++] = byte3;
+ values[valuesOffset++] = byte4;
+ values[valuesOffset++] = byte5;
+ values[valuesOffset++] = byte6;
+ values[valuesOffset++] = byte7;
}
}
- static final class Packed64SingleBlockBulkOperation8 extends BulkOperation {
-
- public int blocks() {
- return 1;
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 255L;
+ values[valuesOffset++] = (block >>> 8) & 255L;
+ values[valuesOffset++] = (block >>> 16) & 255L;
+ values[valuesOffset++] = (block >>> 24) & 255L;
+ values[valuesOffset++] = (block >>> 32) & 255L;
+ values[valuesOffset++] = (block >>> 40) & 255L;
+ values[valuesOffset++] = (block >>> 48) & 255L;
+ values[valuesOffset++] = block >>> 56;
}
-
- public int values() {
- return 8;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 255L;
- values[vi++] = (block >>> 8) & 255L;
- values[vi++] = (block >>> 16) & 255L;
- values[vi++] = (block >>> 24) & 255L;
- values[vi++] = (block >>> 32) & 255L;
- values[vi++] = (block >>> 40) & 255L;
- values[vi++] = (block >>> 48) & 255L;
- values[vi++] = block >>> 56;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0;
+ values[valuesOffset++] = byte1;
+ values[valuesOffset++] = byte2;
+ values[valuesOffset++] = byte3;
+ values[valuesOffset++] = byte4;
+ values[valuesOffset++] = byte5;
+ values[valuesOffset++] = byte6;
+ values[valuesOffset++] = byte7;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 8) | (values[vi++] << 16) | (values[vi++] << 24) | (values[vi++] << 32) | (values[vi++] << 40) | (values[vi++] << 48) | (values[vi++] << 56);
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 8) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 48) | ((values[valuesOffset++] & 0xffffffffL) << 56);
}
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 8) | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 48) | (values[valuesOffset++] << 56);
}
+ }
+
+ } ,
- static final class Packed64SingleBlockBulkOperation9 extends BulkOperation {
+ PACKED_SINGLE_BLOCK_9 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 7;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 511L);
+ values[valuesOffset++] = (int) ((block >>> 9) & 511L);
+ values[valuesOffset++] = (int) ((block >>> 18) & 511L);
+ values[valuesOffset++] = (int) ((block >>> 27) & 511L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 511L);
+ values[valuesOffset++] = (int) ((block >>> 45) & 511L);
+ values[valuesOffset++] = (int) (block >>> 54);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 1) << 8);
+ values[valuesOffset++] = (byte1 >>> 1) | ((byte2 & 3) << 7);
+ values[valuesOffset++] = (byte2 >>> 2) | ((byte3 & 7) << 6);
+ values[valuesOffset++] = (byte3 >>> 3) | ((byte4 & 15) << 5);
+ values[valuesOffset++] = (byte4 >>> 4) | ((byte5 & 31) << 4);
+ values[valuesOffset++] = (byte5 >>> 5) | ((byte6 & 63) << 3);
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 127) << 2);
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 511L;
- values[vi++] = (block >>> 9) & 511L;
- values[vi++] = (block >>> 18) & 511L;
- values[vi++] = (block >>> 27) & 511L;
- values[vi++] = (block >>> 36) & 511L;
- values[vi++] = (block >>> 45) & 511L;
- values[vi++] = block >>> 54;
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 511L;
+ values[valuesOffset++] = (block >>> 9) & 511L;
+ values[valuesOffset++] = (block >>> 18) & 511L;
+ values[valuesOffset++] = (block >>> 27) & 511L;
+ values[valuesOffset++] = (block >>> 36) & 511L;
+ values[valuesOffset++] = (block >>> 45) & 511L;
+ values[valuesOffset++] = block >>> 54;
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 9) | (values[vi++] << 18) | (values[vi++] << 27) | (values[vi++] << 36) | (values[vi++] << 45) | (values[vi++] << 54);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 1) << 8);
+ values[valuesOffset++] = (byte1 >>> 1) | ((byte2 & 3) << 7);
+ values[valuesOffset++] = (byte2 >>> 2) | ((byte3 & 7) << 6);
+ values[valuesOffset++] = (byte3 >>> 3) | ((byte4 & 15) << 5);
+ values[valuesOffset++] = (byte4 >>> 4) | ((byte5 & 31) << 4);
+ values[valuesOffset++] = (byte5 >>> 5) | ((byte6 & 63) << 3);
+ values[valuesOffset++] = (byte6 >>> 6) | ((byte7 & 127) << 2);
+ }
}
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 9) | ((values[valuesOffset++] & 0xffffffffL) << 18) | ((values[valuesOffset++] & 0xffffffffL) << 27) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 45) | ((values[valuesOffset++] & 0xffffffffL) << 54);
}
}
- static final class Packed64SingleBlockBulkOperation10 extends BulkOperation {
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 9) | (values[valuesOffset++] << 18) | (values[valuesOffset++] << 27) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 45) | (values[valuesOffset++] << 54);
+ }
+ }
- public int blocks() {
+ } ,
+
+ PACKED_SINGLE_BLOCK_10 {
+
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 6;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 1023L);
+ values[valuesOffset++] = (int) ((block >>> 10) & 1023L);
+ values[valuesOffset++] = (int) ((block >>> 20) & 1023L);
+ values[valuesOffset++] = (int) ((block >>> 30) & 1023L);
+ values[valuesOffset++] = (int) ((block >>> 40) & 1023L);
+ values[valuesOffset++] = (int) (block >>> 50);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 1023L;
- values[vi++] = (block >>> 10) & 1023L;
- values[vi++] = (block >>> 20) & 1023L;
- values[vi++] = (block >>> 30) & 1023L;
- values[vi++] = (block >>> 40) & 1023L;
- values[vi++] = block >>> 50;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 3) << 8);
+ values[valuesOffset++] = (byte1 >>> 2) | ((byte2 & 15) << 6);
+ values[valuesOffset++] = (byte2 >>> 4) | ((byte3 & 63) << 4);
+ values[valuesOffset++] = (byte3 >>> 6) | (byte4 << 2);
+ values[valuesOffset++] = byte5 | ((byte6 & 3) << 8);
+ values[valuesOffset++] = (byte6 >>> 2) | ((byte7 & 15) << 6);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 10) | (values[vi++] << 20) | (values[vi++] << 30) | (values[vi++] << 40) | (values[vi++] << 50);
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 1023L;
+ values[valuesOffset++] = (block >>> 10) & 1023L;
+ values[valuesOffset++] = (block >>> 20) & 1023L;
+ values[valuesOffset++] = (block >>> 30) & 1023L;
+ values[valuesOffset++] = (block >>> 40) & 1023L;
+ values[valuesOffset++] = block >>> 50;
}
}
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 3) << 8);
+ values[valuesOffset++] = (byte1 >>> 2) | ((byte2 & 15) << 6);
+ values[valuesOffset++] = (byte2 >>> 4) | ((byte3 & 63) << 4);
+ values[valuesOffset++] = (byte3 >>> 6) | (byte4 << 2);
+ values[valuesOffset++] = byte5 | ((byte6 & 3) << 8);
+ values[valuesOffset++] = (byte6 >>> 2) | ((byte7 & 15) << 6);
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 10) | ((values[valuesOffset++] & 0xffffffffL) << 20) | ((values[valuesOffset++] & 0xffffffffL) << 30) | ((values[valuesOffset++] & 0xffffffffL) << 40) | ((values[valuesOffset++] & 0xffffffffL) << 50);
+ }
}
- static final class Packed64SingleBlockBulkOperation12 extends BulkOperation {
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 10) | (values[valuesOffset++] << 20) | (values[valuesOffset++] << 30) | (values[valuesOffset++] << 40) | (values[valuesOffset++] << 50);
+ }
+ }
+
+ } ,
- public int blocks() {
+ PACKED_SINGLE_BLOCK_12 {
+
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 5;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 4095L;
- values[vi++] = (block >>> 12) & 4095L;
- values[vi++] = (block >>> 24) & 4095L;
- values[vi++] = (block >>> 36) & 4095L;
- values[vi++] = block >>> 48;
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 4095L);
+ values[valuesOffset++] = (int) ((block >>> 12) & 4095L);
+ values[valuesOffset++] = (int) ((block >>> 24) & 4095L);
+ values[valuesOffset++] = (int) ((block >>> 36) & 4095L);
+ values[valuesOffset++] = (int) (block >>> 48);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 12) | (values[vi++] << 24) | (values[vi++] << 36) | (values[vi++] << 48);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 15) << 8);
+ values[valuesOffset++] = (byte1 >>> 4) | (byte2 << 4);
+ values[valuesOffset++] = byte3 | ((byte4 & 15) << 8);
+ values[valuesOffset++] = (byte4 >>> 4) | (byte5 << 4);
+ values[valuesOffset++] = byte6 | ((byte7 & 15) << 8);
+ }
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 4095L;
+ values[valuesOffset++] = (block >>> 12) & 4095L;
+ values[valuesOffset++] = (block >>> 24) & 4095L;
+ values[valuesOffset++] = (block >>> 36) & 4095L;
+ values[valuesOffset++] = block >>> 48;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | ((byte1 & 15) << 8);
+ values[valuesOffset++] = (byte1 >>> 4) | (byte2 << 4);
+ values[valuesOffset++] = byte3 | ((byte4 & 15) << 8);
+ values[valuesOffset++] = (byte4 >>> 4) | (byte5 << 4);
+ values[valuesOffset++] = byte6 | ((byte7 & 15) << 8);
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 12) | ((values[valuesOffset++] & 0xffffffffL) << 24) | ((values[valuesOffset++] & 0xffffffffL) << 36) | ((values[valuesOffset++] & 0xffffffffL) << 48);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 12) | (values[valuesOffset++] << 24) | (values[valuesOffset++] << 36) | (values[valuesOffset++] << 48);
}
}
- static final class Packed64SingleBlockBulkOperation16 extends BulkOperation {
+ } ,
- public int blocks() {
+ PACKED_SINGLE_BLOCK_16 {
+
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 4;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 65535L);
+ values[valuesOffset++] = (int) ((block >>> 16) & 65535L);
+ values[valuesOffset++] = (int) ((block >>> 32) & 65535L);
+ values[valuesOffset++] = (int) (block >>> 48);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8);
+ values[valuesOffset++] = byte2 | (byte3 << 8);
+ values[valuesOffset++] = byte4 | (byte5 << 8);
+ values[valuesOffset++] = byte6 | (byte7 << 8);
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 65535L;
+ values[valuesOffset++] = (block >>> 16) & 65535L;
+ values[valuesOffset++] = (block >>> 32) & 65535L;
+ values[valuesOffset++] = block >>> 48;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 65535L;
- values[vi++] = (block >>> 16) & 65535L;
- values[vi++] = (block >>> 32) & 65535L;
- values[vi++] = block >>> 48;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8);
+ values[valuesOffset++] = byte2 | (byte3 << 8);
+ values[valuesOffset++] = byte4 | (byte5 << 8);
+ values[valuesOffset++] = byte6 | (byte7 << 8);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 16) | (values[vi++] << 32) | (values[vi++] << 48);
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 16) | ((values[valuesOffset++] & 0xffffffffL) << 32) | ((values[valuesOffset++] & 0xffffffffL) << 48);
}
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 16) | (values[valuesOffset++] << 32) | (values[valuesOffset++] << 48);
}
+ }
+
+ } ,
- static final class Packed64SingleBlockBulkOperation21 extends BulkOperation {
+ PACKED_SINGLE_BLOCK_21 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 3;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 2097151L);
+ values[valuesOffset++] = (int) ((block >>> 21) & 2097151L);
+ values[valuesOffset++] = (int) (block >>> 42);
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8) | ((byte2 & 31) << 16);
+ values[valuesOffset++] = (byte2 >>> 5) | (byte3 << 3) | (byte4 << 11) | ((byte5 & 3) << 19);
+ values[valuesOffset++] = (byte5 >>> 2) | (byte6 << 6) | ((byte7 & 127) << 14);
+ }
+ }
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 2097151L;
+ values[valuesOffset++] = (block >>> 21) & 2097151L;
+ values[valuesOffset++] = block >>> 42;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 2097151L;
- values[vi++] = (block >>> 21) & 2097151L;
- values[vi++] = block >>> 42;
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8) | ((byte2 & 31) << 16);
+ values[valuesOffset++] = (byte2 >>> 5) | (byte3 << 3) | (byte4 << 11) | ((byte5 & 3) << 19);
+ values[valuesOffset++] = (byte5 >>> 2) | (byte6 << 6) | ((byte7 & 127) << 14);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 21) | (values[vi++] << 42);
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 21) | ((values[valuesOffset++] & 0xffffffffL) << 42);
}
}
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 21) | (values[valuesOffset++] << 42);
+ }
}
- static final class Packed64SingleBlockBulkOperation32 extends BulkOperation {
+ } ,
+
+ PACKED_SINGLE_BLOCK_32 {
- public int blocks() {
+ public int blockCount() {
return 1;
}
- public int values() {
+ public int valueCount() {
return 2;
}
- public void get(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- final long block = blocks[bi++];
- values[vi++] = block & 4294967295L;
- values[vi++] = block >>> 32;
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = (int) (block & 4294967295L);
+ values[valuesOffset++] = (int) (block >>> 32);
}
}
- public void set(long[] blocks, int bi, long[] values, int vi, int iterations) {
- assert bi + iterations * blocks() <= blocks.length;
- assert vi + iterations * values() <= values.length;
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
for (int i = 0; i < iterations; ++i) {
- blocks[bi++] = values[vi++] | (values[vi++] << 32);
+ final int byte7 = blocks[blocksOffset++] & 0xFF;
+ final int byte6 = blocks[blocksOffset++] & 0xFF;
+ final int byte5 = blocks[blocksOffset++] & 0xFF;
+ final int byte4 = blocks[blocksOffset++] & 0xFF;
+ final int byte3 = blocks[blocksOffset++] & 0xFF;
+ final int byte2 = blocks[blocksOffset++] & 0xFF;
+ final int byte1 = blocks[blocksOffset++] & 0xFF;
+ final int byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8) | (byte2 << 16) | (byte3 << 24);
+ values[valuesOffset++] = byte4 | (byte5 << 8) | (byte6 << 16) | (byte7 << 24);
}
}
+
+ public void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long block = blocks[blocksOffset++];
+ values[valuesOffset++] = block & 4294967295L;
+ values[valuesOffset++] = block >>> 32;
+ }
+ }
+
+ public void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations) {
+ assert blocksOffset + 8 * iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ final long byte7 = blocks[blocksOffset++] & 0xFF;
+ final long byte6 = blocks[blocksOffset++] & 0xFF;
+ final long byte5 = blocks[blocksOffset++] & 0xFF;
+ final long byte4 = blocks[blocksOffset++] & 0xFF;
+ final long byte3 = blocks[blocksOffset++] & 0xFF;
+ final long byte2 = blocks[blocksOffset++] & 0xFF;
+ final long byte1 = blocks[blocksOffset++] & 0xFF;
+ final long byte0 = blocks[blocksOffset++] & 0xFF;
+ values[valuesOffset++] = byte0 | (byte1 << 8) | (byte2 << 16) | (byte3 << 24);
+ values[valuesOffset++] = byte4 | (byte5 << 8) | (byte6 << 16) | (byte7 << 24);
+ }
+ }
+
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = (values[valuesOffset++] & 0xffffffffL) | ((values[valuesOffset++] & 0xffffffffL) << 32);
+ }
+ }
+
+ public void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ assert blocksOffset + iterations * blockCount() <= blocks.length;
+ assert valuesOffset + iterations * valueCount() <= values.length;
+ for (int i = 0; i < iterations; ++i) {
+ blocks[blocksOffset++] = values[valuesOffset++] | (values[valuesOffset++] << 32);
+ }
+ }
+
+ } ;
+
+ public static BulkOperation of(PackedInts.Format format, int bitsPerValue) {
+ switch (format) {
+ case PACKED:
+ switch (bitsPerValue) {
+ case 1:
+ return PACKED_1;
+ case 2:
+ return PACKED_2;
+ case 3:
+ return PACKED_3;
+ case 4:
+ return PACKED_4;
+ case 5:
+ return PACKED_5;
+ case 6:
+ return PACKED_6;
+ case 7:
+ return PACKED_7;
+ case 8:
+ return PACKED_8;
+ case 9:
+ return PACKED_9;
+ case 10:
+ return PACKED_10;
+ case 11:
+ return PACKED_11;
+ case 12:
+ return PACKED_12;
+ case 13:
+ return PACKED_13;
+ case 14:
+ return PACKED_14;
+ case 15:
+ return PACKED_15;
+ case 16:
+ return PACKED_16;
+ case 17:
+ return PACKED_17;
+ case 18:
+ return PACKED_18;
+ case 19:
+ return PACKED_19;
+ case 20:
+ return PACKED_20;
+ case 21:
+ return PACKED_21;
+ case 22:
+ return PACKED_22;
+ case 23:
+ return PACKED_23;
+ case 24:
+ return PACKED_24;
+ case 25:
+ return PACKED_25;
+ case 26:
+ return PACKED_26;
+ case 27:
+ return PACKED_27;
+ case 28:
+ return PACKED_28;
+ case 29:
+ return PACKED_29;
+ case 30:
+ return PACKED_30;
+ case 31:
+ return PACKED_31;
+ case 32:
+ return PACKED_32;
+ case 33:
+ return PACKED_33;
+ case 34:
+ return PACKED_34;
+ case 35:
+ return PACKED_35;
+ case 36:
+ return PACKED_36;
+ case 37:
+ return PACKED_37;
+ case 38:
+ return PACKED_38;
+ case 39:
+ return PACKED_39;
+ case 40:
+ return PACKED_40;
+ case 41:
+ return PACKED_41;
+ case 42:
+ return PACKED_42;
+ case 43:
+ return PACKED_43;
+ case 44:
+ return PACKED_44;
+ case 45:
+ return PACKED_45;
+ case 46:
+ return PACKED_46;
+ case 47:
+ return PACKED_47;
+ case 48:
+ return PACKED_48;
+ case 49:
+ return PACKED_49;
+ case 50:
+ return PACKED_50;
+ case 51:
+ return PACKED_51;
+ case 52:
+ return PACKED_52;
+ case 53:
+ return PACKED_53;
+ case 54:
+ return PACKED_54;
+ case 55:
+ return PACKED_55;
+ case 56:
+ return PACKED_56;
+ case 57:
+ return PACKED_57;
+ case 58:
+ return PACKED_58;
+ case 59:
+ return PACKED_59;
+ case 60:
+ return PACKED_60;
+ case 61:
+ return PACKED_61;
+ case 62:
+ return PACKED_62;
+ case 63:
+ return PACKED_63;
+ case 64:
+ return PACKED_64;
+ default:
+ throw new AssertionError();
+ }
+ case PACKED_SINGLE_BLOCK:
+ switch (bitsPerValue) {
+ case 1:
+ return PACKED_SINGLE_BLOCK_1;
+ case 2:
+ return PACKED_SINGLE_BLOCK_2;
+ case 3:
+ return PACKED_SINGLE_BLOCK_3;
+ case 4:
+ return PACKED_SINGLE_BLOCK_4;
+ case 5:
+ return PACKED_SINGLE_BLOCK_5;
+ case 6:
+ return PACKED_SINGLE_BLOCK_6;
+ case 7:
+ return PACKED_SINGLE_BLOCK_7;
+ case 8:
+ return PACKED_SINGLE_BLOCK_8;
+ case 9:
+ return PACKED_SINGLE_BLOCK_9;
+ case 10:
+ return PACKED_SINGLE_BLOCK_10;
+ case 12:
+ return PACKED_SINGLE_BLOCK_12;
+ case 16:
+ return PACKED_SINGLE_BLOCK_16;
+ case 21:
+ return PACKED_SINGLE_BLOCK_21;
+ case 32:
+ return PACKED_SINGLE_BLOCK_32;
+ default:
+ throw new AssertionError();
+ }
+ default:
+ throw new AssertionError();
+ }
+ }
+
+
+ private static long[] toLongArray(int[] ints, int offset, int length) {
+ long[] arr = new long[length];
+ for (int i = 0; i < length; ++i) {
+ arr[i] = ints[offset + i];
+ }
+ return arr;
+ }
+
+ @Override
+ public void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations) {
+ encode(toLongArray(values, valuesOffset, iterations * valueCount()), 0, blocks, blocksOffset, iterations);
+ }
+
+ @Override
+ public void encode(long[] values, int valuesOffset, byte[] blocks, int blocksOffset, int iterations) {
+ final long[] longBLocks = new long[blockCount() * iterations];
+ encode(values, valuesOffset, longBLocks, 0, iterations);
+ ByteBuffer.wrap(blocks, blocksOffset, 8 * iterations * blockCount()).asLongBuffer().put(longBLocks);
+ }
+
+ @Override
+ public void encode(int[] values, int valuesOffset, byte[] blocks, int blocksOffset, int iterations) {
+ final long[] longBLocks = new long[blockCount() * iterations];
+ encode(values, valuesOffset, longBLocks, 0, iterations);
+ ByteBuffer.wrap(blocks, blocksOffset, 8 * iterations * blockCount()).asLongBuffer().put(longBLocks);
+ }
+
+ /**
+ * For every number of bits per value, there is a minimum number of
+ * blocks (b) / values (v) you need to write in order to reach the next block
+ * boundary:
+ * - 16 bits per value -> b=1, v=4
+ * - 24 bits per value -> b=3, v=8
+ * - 50 bits per value -> b=25, v=32
+ * - 63 bits per value -> b=63, v=64
+ * - ...
+ *
+ * A bulk read consists in copying iterations*v values that are
+ * contained in iterations*b blocks into a long[]
+ * (higher values of iterations are likely to yield a better
+ * throughput) => this requires n * (b + v) longs in memory.
+ *
+ * This method computes iterations as
+ * ramBudget / (8 * (b + v)) (since a long is 8 bytes).
+ */
+ public final int computeIterations(int valueCount, int ramBudget) {
+ final int iterations = (ramBudget >>> 3) / (blockCount() + valueCount());
+ if (iterations == 0) {
+ // at least 1
+ return 1;
+ } else if ((iterations - 1) * blockCount() >= valueCount) {
+ // don't allocate for more than the size of the reader
+ return (int) Math.ceil((double) valueCount / valueCount());
+ } else {
+ return iterations;
+ }
}
}
\ No newline at end of file
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/Packed64.java pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/Packed64.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/Packed64.java 2012-07-04 05:19:01.579941789 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/Packed64.java 2012-08-07 11:11:12.245295639 -0400
@@ -17,12 +17,12 @@
* limitations under the License.
*/
-import org.apache.lucene.store.DataInput;
-import org.apache.lucene.util.RamUsageEstimator;
-
import java.io.IOException;
import java.util.Arrays;
+import org.apache.lucene.store.DataInput;
+import org.apache.lucene.util.RamUsageEstimator;
+
/**
* Space optimized random access capable array of values with a fixed number of
* bits/value. Values are packed contiguously.
@@ -146,12 +146,12 @@
assert off + len <= arr.length;
final int originalIndex = index;
- final BulkOperation op = BulkOperation.of(PackedInts.Format.PACKED, bitsPerValue);
+ final PackedInts.Decoder decoder = BulkOperation.of(PackedInts.Format.PACKED, bitsPerValue);
// go to the next block where the value does not span across two blocks
- final int offsetInBlocks = index % op.values();
+ final int offsetInBlocks = index % decoder.valueCount();
if (offsetInBlocks != 0) {
- for (int i = offsetInBlocks; i < op.values() && len > 0; ++i) {
+ for (int i = offsetInBlocks; i < decoder.valueCount() && len > 0; ++i) {
arr[off++] = get(index++);
--len;
}
@@ -161,12 +161,12 @@
}
// bulk get
- assert index % op.values() == 0;
+ assert index % decoder.valueCount() == 0;
int blockIndex = (int) ((long) index * bitsPerValue) >>> BLOCK_BITS;
assert (((long)index * bitsPerValue) & MOD_MASK) == 0;
- final int iterations = len / op.values();
- op.get(blocks, blockIndex, arr, off, iterations);
- final int gotValues = iterations * op.values();
+ final int iterations = len / decoder.valueCount();
+ decoder.decode(blocks, blockIndex, arr, off, iterations);
+ final int gotValues = iterations * decoder.valueCount();
index += gotValues;
len -= gotValues;
assert len >= 0;
@@ -210,12 +210,12 @@
assert off + len <= arr.length;
final int originalIndex = index;
- final BulkOperation op = BulkOperation.of(PackedInts.Format.PACKED, bitsPerValue);
+ final PackedInts.Encoder encoder = BulkOperation.of(PackedInts.Format.PACKED, bitsPerValue);
// go to the next block where the value does not span across two blocks
- final int offsetInBlocks = index % op.values();
+ final int offsetInBlocks = index % encoder.valueCount();
if (offsetInBlocks != 0) {
- for (int i = offsetInBlocks; i < op.values() && len > 0; ++i) {
+ for (int i = offsetInBlocks; i < encoder.valueCount() && len > 0; ++i) {
set(index++, arr[off++]);
--len;
}
@@ -224,13 +224,13 @@
}
}
- // bulk get
- assert index % op.values() == 0;
+ // bulk set
+ assert index % encoder.valueCount() == 0;
int blockIndex = (int) ((long) index * bitsPerValue) >>> BLOCK_BITS;
assert (((long)index * bitsPerValue) & MOD_MASK) == 0;
- final int iterations = len / op.values();
- op.set(blocks, blockIndex, arr, off, iterations);
- final int setValues = iterations * op.values();
+ final int iterations = len / encoder.valueCount();
+ encoder.encode(arr, off, blocks, blockIndex, iterations);
+ final int setValues = iterations * encoder.valueCount();
index += setValues;
len -= setValues;
assert len >= 0;
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/Packed64SingleBlock.java pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/Packed64SingleBlock.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/Packed64SingleBlock.java 2012-07-04 05:19:01.583941628 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/Packed64SingleBlock.java 2012-08-07 11:11:12.245295639 -0400
@@ -86,12 +86,12 @@
// bulk get
assert index % valuesPerBlock == 0;
- final BulkOperation op = BulkOperation.of(PackedInts.Format.PACKED_SINGLE_BLOCK, bitsPerValue);
- assert op.blocks() == 1;
- assert op.values() == valuesPerBlock;
+ final PackedInts.Decoder decoder = BulkOperation.of(PackedInts.Format.PACKED_SINGLE_BLOCK, bitsPerValue);
+ assert decoder.blockCount() == 1;
+ assert decoder.valueCount() == valuesPerBlock;
final int blockIndex = index / valuesPerBlock;
final int nblocks = (index + len) / valuesPerBlock - blockIndex;
- op.get(blocks, blockIndex, arr, off, nblocks);
+ decoder.decode(blocks, blockIndex, arr, off, nblocks);
final int diff = nblocks * valuesPerBlock;
index += diff; len -= diff;
@@ -131,11 +131,11 @@
// bulk set
assert index % valuesPerBlock == 0;
final BulkOperation op = BulkOperation.of(PackedInts.Format.PACKED_SINGLE_BLOCK, bitsPerValue);
- assert op.blocks() == 1;
- assert op.values() == valuesPerBlock;
+ assert op.blockCount() == 1;
+ assert op.valueCount() == valuesPerBlock;
final int blockIndex = index / valuesPerBlock;
final int nblocks = (index + len) / valuesPerBlock - blockIndex;
- op.set(blocks, blockIndex, arr, off, nblocks);
+ op.encode(arr, off, blocks, blockIndex, nblocks);
final int diff = nblocks * valuesPerBlock;
index += diff; len -= diff;
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedInts.java pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedInts.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedInts.java 2012-08-17 13:49:23.650496785 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedInts.java 2012-08-18 09:15:22.653813897 -0400
@@ -18,6 +18,7 @@
*/
import java.io.Closeable;
+import java.io.IOException;
import org.apache.lucene.codecs.CodecUtil;
import org.apache.lucene.store.DataInput;
@@ -25,8 +26,6 @@
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.util.LongsRef;
-import java.io.IOException;
-
/**
* Simplistic compression for array of unsigned long values.
* Each value is >= 0 and <= a specified maximum value. The
@@ -242,6 +241,146 @@
}
/**
+ * A decoder for packed integers.
+ */
+ public static interface Decoder {
+
+ /**
+ * The minimum number of long blocks to decode in a single call.
+ */
+ int blockCount();
+
+ /**
+ * The number of values that can be stored in blockCount() long
+ * blocks.
+ */
+ int valueCount();
+
+ /**
+ * Read iterations * blockCount() blocks from blocks,
+ * decode them and write iterations * valueCount() values into
+ * values.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start reading blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start writing values
+ * @param iterations controls how much data to decode
+ */
+ void decode(long[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations);
+
+ /**
+ * Read 8 * iterations * blockCount() blocks from blocks,
+ * decode them and write iterations * valueCount() values into
+ * values.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start reading blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start writing values
+ * @param iterations controls how much data to decode
+ */
+ void decode(byte[] blocks, int blocksOffset, long[] values, int valuesOffset, int iterations);
+
+ /**
+ * Read iterations * blockCount() blocks from blocks,
+ * decode them and write iterations * valueCount() values into
+ * values.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start reading blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start writing values
+ * @param iterations controls how much data to decode
+ */
+ void decode(long[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations);
+
+ /**
+ * Read 8 * iterations * blockCount() blocks from blocks,
+ * decode them and write iterations * valueCount() values into
+ * values.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start reading blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start writing values
+ * @param iterations controls how much data to decode
+ */
+ void decode(byte[] blocks, int blocksOffset, int[] values, int valuesOffset, int iterations);
+
+ }
+
+ /**
+ * An encoder for packed integers.
+ */
+ public static interface Encoder {
+
+ /**
+ * The minimum number of long blocks to encode in a single call.
+ */
+ int blockCount();
+
+ /**
+ * The number of values that can be stored in blockCount() long
+ * blocks.
+ */
+ int valueCount();
+
+ /**
+ * Read iterations * valueCount() values from values,
+ * encode them and write iterations * blockCount() blocks into
+ * blocks.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start writing blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start reading values
+ * @param iterations controls how much data to encode
+ */
+ void encode(long[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations);
+
+ /**
+ * Read iterations * valueCount() values from values,
+ * encode them and write 8 * iterations * blockCount() blocks into
+ * blocks.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start writing blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start reading values
+ * @param iterations controls how much data to encode
+ */
+ void encode(long[] values, int valuesOffset, byte[] blocks, int blocksOffset, int iterations);
+
+ /**
+ * Read iterations * valueCount() values from values,
+ * encode them and write iterations * blockCount() blocks into
+ * blocks.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start writing blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start reading values
+ * @param iterations controls how much data to encode
+ */
+ void encode(int[] values, int valuesOffset, long[] blocks, int blocksOffset, int iterations);
+
+ /**
+ * Read iterations * valueCount() values from values,
+ * encode them and write 8 * iterations * blockCount() blocks into
+ * blocks.
+ *
+ * @param blocks the long blocks that hold packed integer values
+ * @param blocksOffset the offset where to start writing blocks
+ * @param values the values buffer
+ * @param valuesOffset the offset where to start reading values
+ * @param iterations controls how much data to encode
+ */
+ void encode(int[] values, int valuesOffset, byte[] blocks, int blocksOffset, int iterations);
+
+ }
+
+ /**
* A read-only random access array of positive integers.
* @lucene.internal
*/
@@ -490,8 +629,7 @@
protected final int valueCount;
protected final int bitsPerValue;
- protected Writer(DataOutput out, int valueCount, int bitsPerValue)
- throws IOException {
+ protected Writer(DataOutput out, int valueCount, int bitsPerValue) {
assert bitsPerValue <= 64;
assert valueCount >= 0 || valueCount == -1;
this.out = out;
@@ -529,6 +667,30 @@
}
/**
+ * Get a {@link Decoder}.
+ *
+ * @param format the format used to store packed ints
+ * @param version the compatibility version
+ * @param bitsPerValue the number of bits per value
+ * @return a decoder
+ */
+ public static Decoder getDecoder(Format format, int version, int bitsPerValue) {
+ return BulkOperation.of(format, bitsPerValue);
+ }
+
+ /**
+ * Get an {@link Encoder}.
+ *
+ * @param format the format used to store packed ints
+ * @param version the compatibility version
+ * @param bitsPerValue the number of bits per value
+ * @return an encoder
+ */
+ public static Encoder getEncoder(Format format, int version, int bitsPerValue) {
+ return BulkOperation.of(format, bitsPerValue);
+ }
+
+ /**
* Expert: Restore a {@link Reader} from a stream without reading metadata at
* the beginning of the stream. This method is useful to restore data from
* streams which have been created using
@@ -612,7 +774,7 @@
* @lucene.internal
*/
public static ReaderIterator getReaderIteratorNoHeader(DataInput in, Format format, int version,
- int valueCount, int bitsPerValue, int mem) throws IOException {
+ int valueCount, int bitsPerValue, int mem) {
return new PackedReaderIterator(format, valueCount, bitsPerValue, in, mem);
}
@@ -652,7 +814,7 @@
* @lucene.internal
*/
public static Reader getDirectReaderNoHeader(IndexInput in, Format format,
- int version, int valueCount, int bitsPerValue) throws IOException {
+ int version, int valueCount, int bitsPerValue) {
switch (format) {
case PACKED:
return new DirectPackedReader(bitsPerValue, valueCount, in);
@@ -784,7 +946,7 @@
* @lucene.internal
*/
public static Writer getWriterNoHeader(
- DataOutput out, Format format, int valueCount, int bitsPerValue, int mem) throws IOException {
+ DataOutput out, Format format, int valueCount, int bitsPerValue, int mem) {
return new PackedWriter(format, out, valueCount, bitsPerValue, mem);
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedReaderIterator.java pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedReaderIterator.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedReaderIterator.java 2012-07-04 05:19:01.583941628 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedReaderIterator.java 2012-08-07 11:11:12.245295639 -0400
@@ -38,10 +38,10 @@
bulkOperation = BulkOperation.of(format, bitsPerValue);
iterations = bulkOperation.computeIterations(valueCount, mem);
assert iterations > 0;
- nextBlocks = new long[iterations * bulkOperation.blocks()];
- nextValues = new LongsRef(new long[iterations * bulkOperation.values()], 0, 0);
- assert iterations * bulkOperation.values() == nextValues.longs.length;
- assert iterations * bulkOperation.blocks() == nextBlocks.length;
+ nextBlocks = new long[iterations * bulkOperation.blockCount()];
+ nextValues = new LongsRef(new long[iterations * bulkOperation.valueCount()], 0, 0);
+ assert iterations * bulkOperation.valueCount() == nextValues.longs.length;
+ assert iterations * bulkOperation.blockCount() == nextBlocks.length;
nextValues.offset = nextValues.longs.length;
position = -1;
}
@@ -70,7 +70,7 @@
nextBlocks[i] = 0L;
}
- bulkOperation.get(nextBlocks, 0, nextValues.longs, 0, iterations);
+ bulkOperation.decode(nextBlocks, 0, nextValues.longs, 0, iterations);
nextValues.offset = 0;
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedWriter.java pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedWriter.java
--- lucene.trunk/lucene/core/src/java/org/apache/lucene/util/packed/PackedWriter.java 2012-07-04 05:19:01.583941628 -0400
+++ pforbranch/lucene/core/src/java/org/apache/lucene/util/packed/PackedWriter.java 2012-08-07 11:11:12.245295639 -0400
@@ -21,6 +21,7 @@
import java.io.EOFException;
import java.io.IOException;
+import java.util.Arrays;
// Packs high order byte first, to match
// IndexOutput.writeInt/Long/Short byte order
@@ -29,21 +30,20 @@
boolean finished;
final PackedInts.Format format;
- final BulkOperation bulkOperation;
+ final BulkOperation encoder;
final long[] nextBlocks;
final long[] nextValues;
final int iterations;
int off;
int written;
- PackedWriter(PackedInts.Format format, DataOutput out, int valueCount, int bitsPerValue, int mem)
- throws IOException {
+ PackedWriter(PackedInts.Format format, DataOutput out, int valueCount, int bitsPerValue, int mem) {
super(out, valueCount, bitsPerValue);
this.format = format;
- bulkOperation = BulkOperation.of(format, bitsPerValue);
- iterations = bulkOperation.computeIterations(valueCount, mem);
- nextBlocks = new long[iterations * bulkOperation.blocks()];
- nextValues = new long[iterations * bulkOperation.values()];
+ encoder = BulkOperation.of(format, bitsPerValue);
+ iterations = encoder.computeIterations(valueCount, mem);
+ nextBlocks = new long[iterations * encoder.blockCount()];
+ nextValues = new long[iterations * encoder.valueCount()];
off = 0;
written = 0;
finished = false;
@@ -63,8 +63,7 @@
}
nextValues[off++] = v;
if (off == nextValues.length) {
- flush(nextValues.length);
- off = 0;
+ flush();
}
++written;
}
@@ -77,16 +76,17 @@
add(0L);
}
}
- flush(off);
+ flush();
finished = true;
}
- private void flush(int nvalues) throws IOException {
- bulkOperation.set(nextBlocks, 0, nextValues, 0, iterations);
- final int blocks = format.nblocks(bitsPerValue, nvalues);
+ private void flush() throws IOException {
+ encoder.encode(nextValues, 0, nextBlocks, 0, iterations);
+ final int blocks = format.nblocks(bitsPerValue, off);
for (int i = 0; i < blocks; ++i) {
out.writeLong(nextBlocks[i]);
}
+ Arrays.fill(nextValues, 0L);
off = 0;
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/resources/META-INF/services/org.apache.lucene.codecs.PostingsFormat pforbranch/lucene/core/src/resources/META-INF/services/org.apache.lucene.codecs.PostingsFormat
--- lucene.trunk/lucene/core/src/resources/META-INF/services/org.apache.lucene.codecs.PostingsFormat 2012-08-03 16:08:39.982348858 -0400
+++ pforbranch/lucene/core/src/resources/META-INF/services/org.apache.lucene.codecs.PostingsFormat 2012-08-15 06:58:45.922872708 -0400
@@ -19,3 +19,4 @@
org.apache.lucene.codecs.memory.MemoryPostingsFormat
org.apache.lucene.codecs.bloom.BloomFilteringPostingsFormat
org.apache.lucene.codecs.memory.DirectPostingsFormat
+org.apache.lucene.codecs.block.BlockPostingsFormat
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/test/org/apache/lucene/codecs/block/TestForUtil.java pforbranch/lucene/core/src/test/org/apache/lucene/codecs/block/TestForUtil.java
--- lucene.trunk/lucene/core/src/test/org/apache/lucene/codecs/block/TestForUtil.java 1969-12-31 19:00:00.000000000 -0500
+++ pforbranch/lucene/core/src/test/org/apache/lucene/codecs/block/TestForUtil.java 2012-08-09 17:57:20.714256067 -0400
@@ -0,0 +1,94 @@
+package org.apache.lucene.codecs.block;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static org.apache.lucene.codecs.block.BlockPostingsFormat.BLOCK_SIZE;
+import static org.apache.lucene.codecs.block.ForUtil.MAX_DATA_SIZE;
+import static org.apache.lucene.codecs.block.ForUtil.MAX_ENCODED_SIZE;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IOContext;
+import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.store.RAMDirectory;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.packed.PackedInts;
+
+import com.carrotsearch.randomizedtesting.generators.RandomInts;
+
+public class TestForUtil extends LuceneTestCase {
+
+ public void testEncodeDecode() throws IOException {
+ final int iterations = RandomInts.randomIntBetween(random(), 1, 1000);
+ final float acceptableOverheadRatio = random().nextFloat();
+ final int[] values = new int[(iterations - 1) * BLOCK_SIZE + ForUtil.MAX_DATA_SIZE];
+ for (int i = 0; i < iterations; ++i) {
+ final int bpv = random().nextInt(32);
+ if (bpv == 0) {
+ final int value = RandomInts.randomIntBetween(random(), 0, Integer.MAX_VALUE);
+ for (int j = 0; j < BLOCK_SIZE; ++j) {
+ values[i * BLOCK_SIZE + j] = value;
+ }
+ } else {
+ for (int j = 0; j < BLOCK_SIZE; ++j) {
+ values[i * BLOCK_SIZE + j] = RandomInts.randomIntBetween(random(),
+ 0, (int) PackedInts.maxValue(bpv));
+ }
+ }
+ }
+
+ final Directory d = new RAMDirectory();
+ final long endPointer;
+
+ {
+ // encode
+ IndexOutput out = d.createOutput("test.bin", IOContext.DEFAULT);
+ final ForUtil forUtil = new ForUtil(acceptableOverheadRatio, out);
+
+ for (int i = 0; i < iterations; ++i) {
+ forUtil.writeBlock(
+ Arrays.copyOfRange(values, i * BLOCK_SIZE, values.length),
+ new byte[MAX_ENCODED_SIZE], out);
+ }
+ endPointer = out.getFilePointer();
+ out.close();
+ }
+
+ {
+ // decode
+ IndexInput in = d.openInput("test.bin", IOContext.READONCE);
+ final ForUtil forUtil = new ForUtil(in);
+ for (int i = 0; i < iterations; ++i) {
+ if (random().nextBoolean()) {
+ forUtil.skipBlock(in);
+ continue;
+ }
+ final int[] restored = new int[MAX_DATA_SIZE];
+ forUtil.readBlock(in, new byte[MAX_ENCODED_SIZE], restored);
+ assertArrayEquals(Arrays.copyOfRange(values, i * BLOCK_SIZE, (i + 1) * BLOCK_SIZE),
+ Arrays.copyOf(restored, BLOCK_SIZE));
+ }
+ assertEquals(endPointer, in.getFilePointer());
+ in.close();
+ }
+ }
+
+}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java pforbranch/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java
--- lucene.trunk/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java 2012-08-13 06:55:19.477540086 -0400
+++ pforbranch/lucene/core/src/test/org/apache/lucene/index/TestPostingsFormat.java 2012-08-13 06:56:58.057538566 -0400
@@ -933,6 +933,7 @@
// NOTE: you can also test "weaker" index options than
// you indexed with:
testTerms(fieldsProducer, EnumSet.allOf(Option.class), IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
+ //testTerms(fieldsProducer, EnumSet.complementOf(EnumSet.of(Option.THREADS)), IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
fieldsProducer.close();
dir.close();
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java pforbranch/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java
--- lucene.trunk/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java 2012-07-12 17:55:06.976584273 -0400
+++ pforbranch/lucene/core/src/test/org/apache/lucene/util/packed/TestPackedInts.java 2012-08-09 06:53:18.050870350 -0400
@@ -18,17 +18,24 @@
*/
import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.LongBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import org.apache.lucene.codecs.CodecUtil;
-import org.apache.lucene.store.*;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.store.IOContext;
+import org.apache.lucene.store.IndexInput;
+import org.apache.lucene.store.IndexOutput;
+import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.LongsRef;
import org.apache.lucene.util.LuceneTestCase;
-import org.apache.lucene.util._TestUtil;
import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.lucene.util._TestUtil;
import org.apache.lucene.util.packed.PackedInts.Reader;
@Slow
@@ -622,4 +629,106 @@
}
}
+ public void testEncodeDecode() {
+ for (PackedInts.Format format : PackedInts.Format.values()) {
+ for (int bpv = 1; bpv <= 64; ++bpv) {
+ if (!format.isSupported(bpv)) {
+ continue;
+ }
+ String msg = format + " " + bpv;
+
+ final PackedInts.Encoder encoder = PackedInts.getEncoder(format, PackedInts.VERSION_CURRENT, bpv);
+ final PackedInts.Decoder decoder = PackedInts.getDecoder(format, PackedInts.VERSION_CURRENT, bpv);
+ final int blockCount = encoder.blockCount();
+ final int valueCount = encoder.valueCount();
+ assertEquals(blockCount, decoder.blockCount());
+ assertEquals(valueCount, decoder.valueCount());
+
+ final int iterations = random().nextInt(100);
+ final int blocksOffset = random().nextInt(100);
+ final int valuesOffset = random().nextInt(100);
+ final int blocksOffset2 = random().nextInt(100);
+ final int blocksLen = iterations * blockCount;
+
+ // 1. generate random inputs
+ final long[] blocks = new long[blocksOffset + blocksLen];
+ for (int i = 0; i < blocks.length; ++i) {
+ blocks[i] = random().nextLong();
+ if (format == PackedInts.Format.PACKED_SINGLE_BLOCK && 64 % bpv != 0) {
+ // clear highest bits for packed
+ final int toClear = 64 % bpv;
+ blocks[i] = (blocks[i] << toClear) >>> toClear;
+ }
+ }
+
+ // 2. decode
+ final long[] values = new long[valuesOffset + iterations * valueCount];
+ decoder.decode(blocks, blocksOffset, values, valuesOffset, iterations);
+ for (long value : values) {
+ assertTrue(value <= PackedInts.maxValue(bpv));
+ }
+ // test decoding to int[]
+ final int[] intValues;
+ if (bpv <= 32) {
+ intValues = new int[values.length];
+ decoder.decode(blocks, blocksOffset, intValues, valuesOffset, iterations);
+ assertTrue(equals(intValues, values));
+ } else {
+ intValues = null;
+ }
+
+ // 3. re-encode
+ final long[] blocks2 = new long[blocksOffset2 + blocksLen];
+ encoder.encode(values, valuesOffset, blocks2, blocksOffset2, iterations);
+ assertArrayEquals(msg, Arrays.copyOfRange(blocks, blocksOffset, blocks.length),
+ Arrays.copyOfRange(blocks2, blocksOffset2, blocks2.length));
+ // test encoding from int[]
+ if (bpv <= 32) {
+ final long[] blocks3 = new long[blocks2.length];
+ encoder.encode(intValues, valuesOffset, blocks3, blocksOffset2, iterations);
+ assertArrayEquals(msg, blocks2, blocks3);
+ }
+
+ // 4. byte[] decoding
+ final byte[] byteBlocks = new byte[8 * blocks.length];
+ ByteBuffer.wrap(byteBlocks).asLongBuffer().put(blocks);
+ final long[] values2 = new long[valuesOffset + iterations * valueCount];
+ decoder.decode(byteBlocks, blocksOffset * 8, values2, valuesOffset, iterations);
+ for (long value : values2) {
+ assertTrue(msg, value <= PackedInts.maxValue(bpv));
+ }
+ assertArrayEquals(msg, values, values2);
+ // test decoding to int[]
+ if (bpv <= 32) {
+ final int[] intValues2 = new int[values2.length];
+ decoder.decode(byteBlocks, blocksOffset * 8, intValues2, valuesOffset, iterations);
+ assertTrue(msg, equals(intValues2, values2));
+ }
+
+ // 5. byte[] encoding
+ final byte[] blocks3 = new byte[8 * (blocksOffset2 + blocksLen)];
+ encoder.encode(values, valuesOffset, blocks3, 8 * blocksOffset2, iterations);
+ assertEquals(msg, LongBuffer.wrap(blocks2), ByteBuffer.wrap(blocks3).asLongBuffer());
+ // test encoding from int[]
+ if (bpv <= 32) {
+ final byte[] blocks4 = new byte[blocks3.length];
+ encoder.encode(intValues, valuesOffset, blocks4, 8 * blocksOffset2, iterations);
+ assertArrayEquals(msg, blocks3, blocks4);
+ }
+ }
+ }
+ }
+
+ private static boolean equals(int[] ints, long[] longs) {
+ if (ints.length != longs.length) {
+ return false;
+ }
+ for (int i = 0; i < ints.length; ++i) {
+ if ((ints[i] & 0xFFFFFFFFL) != longs[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/test-framework/src/java/org/apache/lucene/codecs/mocksep/MockSingleIntIndexInput.java pforbranch/lucene/test-framework/src/java/org/apache/lucene/codecs/mocksep/MockSingleIntIndexInput.java
--- lucene.trunk/lucene/test-framework/src/java/org/apache/lucene/codecs/mocksep/MockSingleIntIndexInput.java 2012-08-16 15:11:15.515291282 -0400
+++ pforbranch/lucene/test-framework/src/java/org/apache/lucene/codecs/mocksep/MockSingleIntIndexInput.java 2012-08-18 09:15:27.841814352 -0400
@@ -87,7 +87,7 @@
}
@Override
- public void set(IntIndexInput.Index other) {
+ public void copyFrom(IntIndexInput.Index other) {
fp = ((MockSingleIntIndexInputIndex) other).fp;
}
diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java pforbranch/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
--- lucene.trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java 2012-08-15 07:04:48.434867118 -0400
+++ pforbranch/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java 2012-08-15 08:13:27.754803607 -0400
@@ -310,9 +310,7 @@
"MockFixedIntBlock",
"MockVariableIntBlock",
"MockSep",
- "MockRandom",
- "For",
- "PFor"
+ "MockRandom"
));
// -----------------------------------------------------------------