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: + *

+ *

+ * + *

+ * Files and detailed format: + *

+ *

+ * + * + *
+ *
+ * Term Dictionary + * + *

The .tim file format is quite similar to Lucene40PostingsFormat, + * with minor difference in MetadataBlock

+ * + * + *

Notes:

+ * + *
+ *
+ * + * + *
+ *
+ * Term Index + *

The .tim file format is mentioned in + * + * Lucene40PostingsFormat:TermIndex + *

+ *
+ * + * + * + *
+ *
+ * Frequencies and Skip Data + * + *

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:

+ * + *
+ *
+ * + * + *
+ *
+ * Positions + *

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:

+ * + *
+ *
+ * + * + *
+ *
+ * Payloads and Offsets + *

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:

+ *
+ *
+ *

+ * + */ + +public final class BlockPostingsFormat extends PostingsFormat { + public static final String DOC_EXTENSION = "doc"; + public static final String POS_EXTENSION = "pos"; + public static final String PAY_EXTENSION = "pay"; + + private final int minTermBlockSize; + private final int maxTermBlockSize; + + // NOTE: must be multiple of 64 because of PackedInts long-aligned encoding/decoding + public final static int BLOCK_SIZE = 128; + + public BlockPostingsFormat() { + this(BlockTreeTermsWriter.DEFAULT_MIN_BLOCK_SIZE, BlockTreeTermsWriter.DEFAULT_MAX_BLOCK_SIZE); + } + + public BlockPostingsFormat(int minTermBlockSize, int maxTermBlockSize) { + super("Block"); + this.minTermBlockSize = minTermBlockSize; + assert minTermBlockSize > 1; + this.maxTermBlockSize = maxTermBlockSize; + assert minTermBlockSize <= maxTermBlockSize; + } + + @Override + public String toString() { + return getName() + "(blocksize=" + BLOCK_SIZE + ")"; + } + + @Override + public FieldsConsumer fieldsConsumer(SegmentWriteState state) throws IOException { + PostingsWriterBase postingsWriter = new BlockPostingsWriter(state); + + boolean success = false; + try { + FieldsConsumer ret = new BlockTreeTermsWriter(state, + postingsWriter, + minTermBlockSize, + maxTermBlockSize); + success = true; + return ret; + } finally { + if (!success) { + IOUtils.closeWhileHandlingException(postingsWriter); + } + } + } + + @Override + public FieldsProducer fieldsProducer(SegmentReadState state) throws IOException { + PostingsReaderBase postingsReader = new BlockPostingsReader(state.dir, + state.fieldInfos, + state.segmentInfo, + state.context, + state.segmentSuffix); + boolean success = false; + try { + FieldsProducer ret = new BlockTreeTermsReader(state.dir, + state.fieldInfos, + state.segmentInfo.name, + postingsReader, + state.context, + state.segmentSuffix, + state.termsIndexDivisor); + success = true; + return ret; + } finally { + if (!success) { + IOUtils.closeWhileHandlingException(postingsReader); + } + } + } +} diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsReader.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsReader.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsReader.java 1969-12-31 19:00:00.000000000 -0500 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsReader.java 2012-08-18 08:29:38.377841288 -0400 @@ -0,0 +1,1503 @@ +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.codecs.BlockTermState; +import org.apache.lucene.codecs.CodecUtil; +import org.apache.lucene.codecs.PostingsReaderBase; +import org.apache.lucene.index.DocsAndPositionsEnum; +import org.apache.lucene.index.DocsEnum; +import org.apache.lucene.index.FieldInfo; +import org.apache.lucene.index.FieldInfo.IndexOptions; +import org.apache.lucene.index.FieldInfos; +import org.apache.lucene.index.IndexFileNames; +import org.apache.lucene.index.SegmentInfo; +import org.apache.lucene.index.TermState; +import org.apache.lucene.store.ByteArrayDataInput; +import org.apache.lucene.store.DataInput; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.IOContext; +import org.apache.lucene.store.IndexInput; +import org.apache.lucene.util.ArrayUtil; +import org.apache.lucene.util.Bits; +import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.IOUtils; + +/** + * Concrete class that reads docId(maybe frq,pos,offset,payloads) list + * with postings format. + * + * @see BlockSkipReader for details + * + */ +final class BlockPostingsReader extends PostingsReaderBase { + + private final IndexInput docIn; + private final IndexInput posIn; + private final IndexInput payIn; + + private final ForUtil forUtil; + + // public static boolean DEBUG = false; + + public BlockPostingsReader(Directory dir, FieldInfos fieldInfos, SegmentInfo segmentInfo, IOContext ioContext, String segmentSuffix) throws IOException { + boolean success = false; + IndexInput docIn = null; + IndexInput posIn = null; + IndexInput payIn = null; + try { + docIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, BlockPostingsFormat.DOC_EXTENSION), + ioContext); + CodecUtil.checkHeader(docIn, + BlockPostingsWriter.DOC_CODEC, + BlockPostingsWriter.VERSION_START, + BlockPostingsWriter.VERSION_START); + forUtil = new ForUtil(docIn); + + if (fieldInfos.hasProx()) { + posIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, BlockPostingsFormat.POS_EXTENSION), + ioContext); + CodecUtil.checkHeader(posIn, + BlockPostingsWriter.POS_CODEC, + BlockPostingsWriter.VERSION_START, + BlockPostingsWriter.VERSION_START); + + if (fieldInfos.hasPayloads() || fieldInfos.hasOffsets()) { + payIn = dir.openInput(IndexFileNames.segmentFileName(segmentInfo.name, segmentSuffix, BlockPostingsFormat.PAY_EXTENSION), + ioContext); + CodecUtil.checkHeader(payIn, + BlockPostingsWriter.PAY_CODEC, + BlockPostingsWriter.VERSION_START, + BlockPostingsWriter.VERSION_START); + } + } + + this.docIn = docIn; + this.posIn = posIn; + this.payIn = payIn; + success = true; + } finally { + if (!success) { + IOUtils.closeWhileHandlingException(docIn, posIn, payIn); + } + } + } + + @Override + public void init(IndexInput termsIn) throws IOException { + // Make sure we are talking to the matching past writer + CodecUtil.checkHeader(termsIn, + BlockPostingsWriter.TERMS_CODEC, + BlockPostingsWriter.VERSION_START, + BlockPostingsWriter.VERSION_START); + final int indexBlockSize = termsIn.readVInt(); + if (indexBlockSize != BLOCK_SIZE) { + throw new IllegalStateException("index-time BLOCK_SIZE (" + indexBlockSize + ") != read-time BLOCK_SIZE (" + BLOCK_SIZE + ")"); + } + } + + /** + * Read values that have been written using variable-length encoding instead of bit-packing. + */ + private static void readVIntBlock(IndexInput docIn, int[] docBuffer, + int[] freqBuffer, int num, boolean indexHasFreq) throws IOException { + if (indexHasFreq) { + for(int i=0;i>> 1; + if ((code & 1) != 0) { + freqBuffer[i] = 1; + } else { + freqBuffer[i] = docIn.readVInt(); + } + } + } else { + for(int i=0;i docUpto) { + // Skipper moved + // if (DEBUG) { + // System.out.println("skipper moved to docUpto=" + newDocUpto + " vs current=" + docUpto + "; docID=" + skipper.getDoc() + " fp=" + skipper.getDocPointer()); + // } + assert newDocUpto % BLOCK_SIZE == 0 : "got " + newDocUpto; + docUpto = newDocUpto; + + // Force to read next block + docBufferUpto = BLOCK_SIZE; + accum = skipper.getDoc(); // actually, this is just lastSkipEntry + docIn.seek(skipper.getDocPointer()); // now point to the block we want to search + } + nextSkipDoc = skipper.getNextSkipDoc(); + } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + if (docBufferUpto == BLOCK_SIZE) { + refillDocs(); + } + + // Now scan... this is an inlined/pared down version + // of nextDoc(): + while (true) { + // if (DEBUG) { + // System.out.println(" scan doc=" + accum + " docBufferUpto=" + docBufferUpto); + // } + accum += docDeltaBuffer[docBufferUpto]; + docUpto++; + + if (accum >= target) { + break; + } + docBufferUpto++; + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + } + + if (liveDocs == null || liveDocs.get(accum)) { + // if (DEBUG) { + // System.out.println(" return doc=" + accum); + // } + freq = freqBuffer[docBufferUpto]; + docBufferUpto++; + return doc = accum; + } else { + // if (DEBUG) { + // System.out.println(" now do nextDoc()"); + // } + docBufferUpto++; + return nextDoc(); + } + } + } + + + final class BlockDocsAndPositionsEnum extends DocsAndPositionsEnum { + + private final byte[] encoded; + + private final int[] docDeltaBuffer = new int[MAX_DATA_SIZE]; + private final int[] freqBuffer = new int[MAX_DATA_SIZE]; + private final int[] posDeltaBuffer = new int[MAX_DATA_SIZE]; + + private int docBufferUpto; + private int posBufferUpto; + + private BlockSkipReader skipper; + private boolean skipped; + + final IndexInput startDocIn; + + final IndexInput docIn; + final IndexInput posIn; + + final boolean indexHasOffsets; + final boolean indexHasPayloads; + + private int docFreq; // number of docs in this posting list + private int docUpto; // how many docs we've read + private int doc; // doc we last read + private int accum; // accumulator for doc deltas + private int freq; // freq we last read + private int position; // current position + + // how many positions "behind" we are; nextPosition must + // skip these to "catch up": + private int posPendingCount; + + // Lazy pos seek: if != -1 then we must seek to this FP + // before reading positions: + private long posPendingFP; + + // Where this term's postings start in the .doc file: + private long docTermStartFP; + + // Where this term's postings start in the .pos file: + private long posTermStartFP; + + // Where this term's payloads/offsets start in the .pay + // file: + private long payTermStartFP; + + // File pointer where the last (vInt encoded) pos delta + // block is. We need this to know whether to bulk + // decode vs vInt decode the block: + private long lastPosBlockFP; + + // Where this term's skip data starts (after + // docTermStartFP) in the .doc file (or -1 if there is + // no skip data for this term): + private int skipOffset; + + private int nextSkipDoc; + + private Bits liveDocs; + + public BlockDocsAndPositionsEnum(FieldInfo fieldInfo) throws IOException { + this.startDocIn = BlockPostingsReader.this.docIn; + this.docIn = (IndexInput) startDocIn.clone(); + this.posIn = (IndexInput) BlockPostingsReader.this.posIn.clone(); + encoded = new byte[MAX_ENCODED_SIZE]; + indexHasOffsets = fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0; + indexHasPayloads = fieldInfo.hasPayloads(); + } + + public boolean canReuse(IndexInput docIn, FieldInfo fieldInfo) { + return docIn == startDocIn && + indexHasOffsets == (fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0) && + indexHasPayloads == fieldInfo.hasPayloads(); + } + + public DocsAndPositionsEnum reset(Bits liveDocs, IntBlockTermState termState) throws IOException { + this.liveDocs = liveDocs; + // if (DEBUG) { + // System.out.println(" FPR.reset: termState=" + termState); + // } + docFreq = termState.docFreq; + docTermStartFP = termState.docStartFP; + posTermStartFP = termState.posStartFP; + payTermStartFP = termState.payStartFP; + docIn.seek(docTermStartFP); + skipOffset = termState.skipOffset; + posPendingFP = posTermStartFP; + posPendingCount = 0; + if (termState.totalTermFreq < BLOCK_SIZE) { + lastPosBlockFP = posTermStartFP; + } else if (termState.totalTermFreq == BLOCK_SIZE) { + lastPosBlockFP = -1; + } else { + lastPosBlockFP = posTermStartFP + termState.lastPosBlockOffset; + } + + doc = -1; + accum = 0; + docUpto = 0; + nextSkipDoc = BLOCK_SIZE - 1; + docBufferUpto = BLOCK_SIZE; + skipped = false; + return this; + } + + @Override + public int freq() throws IOException { + return freq; + } + + @Override + public int docID() { + return doc; + } + + private void refillDocs() throws IOException { + final int left = docFreq - docUpto; + assert left > 0; + + if (left >= BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" fill doc block from fp=" + docIn.getFilePointer()); + // } + forUtil.readBlock(docIn, encoded, docDeltaBuffer); + // if (DEBUG) { + // System.out.println(" fill freq block from fp=" + docIn.getFilePointer()); + // } + forUtil.readBlock(docIn, encoded, freqBuffer); + } else { + // Read vInts: + // if (DEBUG) { + // System.out.println(" fill last vInt doc block from fp=" + docIn.getFilePointer()); + // } + readVIntBlock(docIn, docDeltaBuffer, freqBuffer, left, true); + } + docBufferUpto = 0; + } + + private void refillPositions() throws IOException { + // if (DEBUG) { + // System.out.println(" refillPositions"); + // } + if (posIn.getFilePointer() == lastPosBlockFP) { + // if (DEBUG) { + // System.out.println(" vInt pos block @ fp=" + posIn.getFilePointer() + " hasPayloads=" + indexHasPayloads + " hasOffsets=" + indexHasOffsets); + // } + final int count = posIn.readVInt(); + int payloadLength = 0; + for(int i=0;i>> 1; + if (payloadLength != 0) { + posIn.seek(posIn.getFilePointer() + payloadLength); + } + } else { + posDeltaBuffer[i] = code; + } + if (indexHasOffsets) { + posIn.readVInt(); + posIn.readVInt(); + } + } + } else { + // if (DEBUG) { + // System.out.println(" bulk pos block @ fp=" + posIn.getFilePointer()); + // } + forUtil.readBlock(posIn, encoded, posDeltaBuffer); + } + } + + @Override + public int nextDoc() throws IOException { + // if (DEBUG) { + // System.out.println(" FPR.nextDoc"); + // } + while (true) { + // if (DEBUG) { + // System.out.println(" docUpto=" + docUpto + " (of df=" + docFreq + ") docBufferUpto=" + docBufferUpto); + // } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + if (docBufferUpto == BLOCK_SIZE) { + refillDocs(); + } + // if (DEBUG) { + // System.out.println(" accum=" + accum + " docDeltaBuffer[" + docBufferUpto + "]=" + docDeltaBuffer[docBufferUpto]); + // } + accum += docDeltaBuffer[docBufferUpto]; + freq = freqBuffer[docBufferUpto]; + posPendingCount += freq; + docBufferUpto++; + docUpto++; + + if (liveDocs == null || liveDocs.get(accum)) { + doc = accum; + position = 0; + // if (DEBUG) { + // System.out.println(" return doc=" + doc + " freq=" + freq + " posPendingCount=" + posPendingCount); + // } + return doc; + } + // if (DEBUG) { + // System.out.println(" doc=" + accum + " is deleted; try next doc"); + // } + } + } + + @Override + public int advance(int target) throws IOException { + // TODO: make frq block load lazy/skippable + // if (DEBUG) { + // System.out.println(" FPR.advance target=" + target); + // } + + if (docFreq > BLOCK_SIZE && target > nextSkipDoc) { + // if (DEBUG) { + // System.out.println(" try skipper"); + // } + if (skipper == null) { + // Lazy init: first time this enum has ever been used for skipping + // if (DEBUG) { + // System.out.println(" create skipper"); + // } + skipper = new BlockSkipReader((IndexInput) docIn.clone(), + BlockPostingsWriter.maxSkipLevels, + BLOCK_SIZE, + true, + indexHasOffsets, + indexHasPayloads); + } + + if (!skipped) { + assert skipOffset != -1; + // This is the first time this enum has skipped + // since reset() was called; load the skip data: + // if (DEBUG) { + // System.out.println(" init skipper"); + // } + skipper.init(docTermStartFP+skipOffset, docTermStartFP, posTermStartFP, payTermStartFP, docFreq); + skipped = true; + } + + final int newDocUpto = skipper.skipTo(target) + 1; + + if (newDocUpto > docUpto) { + // Skipper moved + // if (DEBUG) { + // System.out.println(" skipper moved to docUpto=" + newDocUpto + " vs current=" + docUpto + "; docID=" + skipper.getDoc() + " fp=" + skipper.getDocPointer() + " pos.fp=" + skipper.getPosPointer() + " pos.bufferUpto=" + skipper.getPosBufferUpto()); + // } + + assert newDocUpto % BLOCK_SIZE == 0 : "got " + newDocUpto; + docUpto = newDocUpto; + + // Force to read next block + docBufferUpto = BLOCK_SIZE; + accum = skipper.getDoc(); + docIn.seek(skipper.getDocPointer()); + posPendingFP = skipper.getPosPointer(); + posPendingCount = skipper.getPosBufferUpto(); + } + nextSkipDoc = skipper.getNextSkipDoc(); + } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + if (docBufferUpto == BLOCK_SIZE) { + refillDocs(); + } + + // Now scan... this is an inlined/pared down version + // of nextDoc(): + while (true) { + // if (DEBUG) { + // System.out.println(" scan doc=" + accum + " docBufferUpto=" + docBufferUpto); + // } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + accum += docDeltaBuffer[docBufferUpto]; + freq = freqBuffer[docBufferUpto]; + posPendingCount += freq; + docBufferUpto++; + docUpto++; + + if (accum >= target) { + break; + } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + } + + if (liveDocs == null || liveDocs.get(accum)) { + // if (DEBUG) { + // System.out.println(" return doc=" + accum); + // } + position = 0; + return doc = accum; + } else { + // if (DEBUG) { + // System.out.println(" now do nextDoc()"); + // } + return nextDoc(); + } + } + + // TODO: in theory we could avoid loading frq block + // when not needed, ie, use skip data to load how far to + // seek the pos pointe ... instead of having to load frq + // blocks only to sum up how many positions to skip + private void skipPositions() throws IOException { + // Skip positions now: + int toSkip = posPendingCount - freq; + // if (DEBUG) { + // System.out.println(" FPR.skipPositions: toSkip=" + toSkip); + // } + + final int leftInBlock = BLOCK_SIZE - posBufferUpto; + if (toSkip < leftInBlock) { + posBufferUpto += toSkip; + // if (DEBUG) { + // System.out.println(" skip w/in block to posBufferUpto=" + posBufferUpto); + // } + } else { + toSkip -= leftInBlock; + while(toSkip >= BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" skip whole block @ fp=" + posIn.getFilePointer()); + // } + assert posIn.getFilePointer() != lastPosBlockFP; + forUtil.skipBlock(posIn); + toSkip -= BLOCK_SIZE; + } + refillPositions(); + posBufferUpto = toSkip; + // if (DEBUG) { + // System.out.println(" skip w/in block to posBufferUpto=" + posBufferUpto); + // } + } + + position = 0; + } + + @Override + public int nextPosition() throws IOException { + // if (DEBUG) { + // System.out.println(" FPR.nextPosition posPendingCount=" + posPendingCount + " posBufferUpto=" + posBufferUpto); + // } + if (posPendingFP != -1) { + // if (DEBUG) { + // System.out.println(" seek to pendingFP=" + posPendingFP); + // } + posIn.seek(posPendingFP); + posPendingFP = -1; + + // Force buffer refill: + posBufferUpto = BLOCK_SIZE; + } + + if (posPendingCount > freq) { + skipPositions(); + posPendingCount = freq; + } + + if (posBufferUpto == BLOCK_SIZE) { + refillPositions(); + posBufferUpto = 0; + } + position += posDeltaBuffer[posBufferUpto++]; + posPendingCount--; + // if (DEBUG) { + // System.out.println(" return pos=" + position); + // } + return position; + } + + @Override + public int startOffset() { + return -1; + } + + @Override + public int endOffset() { + return -1; + } + + @Override + public BytesRef getPayload() { + return null; + } + } + + // Also handles payloads + offsets + final class EverythingEnum extends DocsAndPositionsEnum { + + private final byte[] encoded; + + private final int[] docDeltaBuffer = new int[MAX_DATA_SIZE]; + private final int[] freqBuffer = new int[MAX_DATA_SIZE]; + private final int[] posDeltaBuffer = new int[MAX_DATA_SIZE]; + + private final int[] payloadLengthBuffer; + private final int[] offsetStartDeltaBuffer; + private final int[] offsetLengthBuffer; + + private byte[] payloadBytes; + private int payloadByteUpto; + private int payloadLength; + + private int lastStartOffset; + private int startOffset; + private int endOffset; + + private int docBufferUpto; + private int posBufferUpto; + + private BlockSkipReader skipper; + private boolean skipped; + + final IndexInput startDocIn; + + final IndexInput docIn; + final IndexInput posIn; + final IndexInput payIn; + final BytesRef payload; + + final boolean indexHasOffsets; + final boolean indexHasPayloads; + + private int docFreq; // number of docs in this posting list + private int docUpto; // how many docs we've read + private int doc; // doc we last read + private int accum; // accumulator for doc deltas + private int freq; // freq we last read + private int position; // current position + + // how many positions "behind" we are; nextPosition must + // skip these to "catch up": + private int posPendingCount; + + // Lazy pos seek: if != -1 then we must seek to this FP + // before reading positions: + private long posPendingFP; + + // Lazy pay seek: if != -1 then we must seek to this FP + // before reading payloads/offsets: + private long payPendingFP; + + // Where this term's postings start in the .doc file: + private long docTermStartFP; + + // Where this term's postings start in the .pos file: + private long posTermStartFP; + + // Where this term's payloads/offsets start in the .pay + // file: + private long payTermStartFP; + + // File pointer where the last (vInt encoded) pos delta + // block is. We need this to know whether to bulk + // decode vs vInt decode the block: + private long lastPosBlockFP; + + // Where this term's skip data starts (after + // docTermStartFP) in the .doc file (or -1 if there is + // no skip data for this term): + private int skipOffset; + + private int nextSkipDoc; + + private Bits liveDocs; + + public EverythingEnum(FieldInfo fieldInfo) throws IOException { + this.startDocIn = BlockPostingsReader.this.docIn; + this.docIn = (IndexInput) startDocIn.clone(); + this.posIn = (IndexInput) BlockPostingsReader.this.posIn.clone(); + this.payIn = (IndexInput) BlockPostingsReader.this.payIn.clone(); + encoded = new byte[MAX_ENCODED_SIZE]; + indexHasOffsets = fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0; + if (indexHasOffsets) { + offsetStartDeltaBuffer = new int[MAX_DATA_SIZE]; + offsetLengthBuffer = new int[MAX_DATA_SIZE]; + } else { + offsetStartDeltaBuffer = null; + offsetLengthBuffer = null; + startOffset = -1; + endOffset = -1; + } + + indexHasPayloads = fieldInfo.hasPayloads(); + if (indexHasPayloads) { + payloadLengthBuffer = new int[MAX_DATA_SIZE]; + payloadBytes = new byte[128]; + payload = new BytesRef(); + } else { + payloadLengthBuffer = null; + payloadBytes = null; + payload = null; + } + } + + public boolean canReuse(IndexInput docIn, FieldInfo fieldInfo) { + return docIn == startDocIn && + indexHasOffsets == (fieldInfo.getIndexOptions().compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0) && + indexHasPayloads == fieldInfo.hasPayloads(); + } + + public EverythingEnum reset(Bits liveDocs, IntBlockTermState termState) throws IOException { + this.liveDocs = liveDocs; + // if (DEBUG) { + // System.out.println(" FPR.reset: termState=" + termState); + // } + docFreq = termState.docFreq; + docTermStartFP = termState.docStartFP; + posTermStartFP = termState.posStartFP; + payTermStartFP = termState.payStartFP; + docIn.seek(docTermStartFP); + skipOffset = termState.skipOffset; + posPendingFP = posTermStartFP; + payPendingFP = payTermStartFP; + posPendingCount = 0; + if (termState.totalTermFreq < BLOCK_SIZE) { + lastPosBlockFP = posTermStartFP; + } else if (termState.totalTermFreq == BLOCK_SIZE) { + lastPosBlockFP = -1; + } else { + lastPosBlockFP = posTermStartFP + termState.lastPosBlockOffset; + } + + doc = -1; + accum = 0; + docUpto = 0; + nextSkipDoc = BLOCK_SIZE - 1; + docBufferUpto = BLOCK_SIZE; + skipped = false; + return this; + } + + @Override + public int freq() throws IOException { + return freq; + } + + @Override + public int docID() { + return doc; + } + + private void refillDocs() throws IOException { + final int left = docFreq - docUpto; + assert left > 0; + + if (left >= BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" fill doc block from fp=" + docIn.getFilePointer()); + // } + forUtil.readBlock(docIn, encoded, docDeltaBuffer); + // if (DEBUG) { + // System.out.println(" fill freq block from fp=" + docIn.getFilePointer()); + // } + forUtil.readBlock(docIn, encoded, freqBuffer); + } else { + // if (DEBUG) { + // System.out.println(" fill last vInt doc block from fp=" + docIn.getFilePointer()); + // } + readVIntBlock(docIn, docDeltaBuffer, freqBuffer, left, true); + } + docBufferUpto = 0; + } + + private void refillPositions() throws IOException { + // if (DEBUG) { + // System.out.println(" refillPositions"); + // } + if (posIn.getFilePointer() == lastPosBlockFP) { + // if (DEBUG) { + // System.out.println(" vInt pos block @ fp=" + posIn.getFilePointer() + " hasPayloads=" + indexHasPayloads + " hasOffsets=" + indexHasOffsets); + // } + final int count = posIn.readVInt(); + int payloadLength = 0; + payloadByteUpto = 0; + for(int i=0;i docUpto) { + // Skipper moved + // if (DEBUG) { + // System.out.println(" skipper moved to docUpto=" + newDocUpto + " vs current=" + docUpto + "; docID=" + skipper.getDoc() + " fp=" + skipper.getDocPointer() + " pos.fp=" + skipper.getPosPointer() + " pos.bufferUpto=" + skipper.getPosBufferUpto() + " pay.fp=" + skipper.getPayPointer() + " lastStartOffset=" + lastStartOffset); + // } + assert newDocUpto % BLOCK_SIZE == 0 : "got " + newDocUpto; + docUpto = newDocUpto; + + // Force to read next block + docBufferUpto = BLOCK_SIZE; + accum = skipper.getDoc(); + docIn.seek(skipper.getDocPointer()); + posPendingFP = skipper.getPosPointer(); + payPendingFP = skipper.getPayPointer(); + posPendingCount = skipper.getPosBufferUpto(); + lastStartOffset = skipper.getStartOffset(); + payloadByteUpto = skipper.getPayloadByteUpto(); + } + nextSkipDoc = skipper.getNextSkipDoc(); + } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + if (docBufferUpto == BLOCK_SIZE) { + refillDocs(); + } + + // Now scan: + while (true) { + // if (DEBUG) { + // System.out.println(" scan doc=" + accum + " docBufferUpto=" + docBufferUpto); + // } + accum += docDeltaBuffer[docBufferUpto]; + freq = freqBuffer[docBufferUpto]; + posPendingCount += freq; + docBufferUpto++; + docUpto++; + + if (accum >= target) { + break; + } + if (docUpto == docFreq) { + return doc = NO_MORE_DOCS; + } + } + + if (liveDocs == null || liveDocs.get(accum)) { + // if (DEBUG) { + // System.out.println(" return doc=" + accum); + // } + position = 0; + lastStartOffset = 0; + return doc = accum; + } else { + // if (DEBUG) { + // System.out.println(" now do nextDoc()"); + // } + return nextDoc(); + } + } + + // TODO: in theory we could avoid loading frq block + // when not needed, ie, use skip data to load how far to + // seek the pos pointe ... instead of having to load frq + // blocks only to sum up how many positions to skip + private void skipPositions() throws IOException { + // Skip positions now: + int toSkip = posPendingCount - freq; + // if (DEBUG) { + // System.out.println(" FPR.skipPositions: toSkip=" + toSkip); + // } + + final int leftInBlock = BLOCK_SIZE - posBufferUpto; + if (toSkip < leftInBlock) { + int end = posBufferUpto + toSkip; + while(posBufferUpto < end) { + if (indexHasPayloads) { + payloadByteUpto += payloadLengthBuffer[posBufferUpto]; + } + posBufferUpto++; + } + // if (DEBUG) { + // System.out.println(" skip w/in block to posBufferUpto=" + posBufferUpto); + // } + } else { + toSkip -= leftInBlock; + while(toSkip >= BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" skip whole block @ fp=" + posIn.getFilePointer()); + // } + assert posIn.getFilePointer() != lastPosBlockFP; + forUtil.skipBlock(posIn); + + if (indexHasPayloads) { + // Skip payloadLength block: + forUtil.skipBlock(payIn); + + // Skip payloadBytes block: + int numBytes = payIn.readVInt(); + payIn.seek(payIn.getFilePointer() + numBytes); + } + + if (indexHasOffsets) { + forUtil.skipBlock(payIn); + forUtil.skipBlock(payIn); + } + toSkip -= BLOCK_SIZE; + } + refillPositions(); + payloadByteUpto = 0; + posBufferUpto = 0; + while(posBufferUpto < toSkip) { + if (indexHasPayloads) { + payloadByteUpto += payloadLengthBuffer[posBufferUpto]; + } + posBufferUpto++; + } + // if (DEBUG) { + // System.out.println(" skip w/in block to posBufferUpto=" + posBufferUpto); + // } + } + + position = 0; + lastStartOffset = 0; + } + + @Override + public int nextPosition() throws IOException { + // if (DEBUG) { + // System.out.println(" FPR.nextPosition posPendingCount=" + posPendingCount + " posBufferUpto=" + posBufferUpto + " payloadByteUpto=" + payloadByteUpto)// ; + // } + if (posPendingFP != -1) { + // if (DEBUG) { + // System.out.println(" seek pos to pendingFP=" + posPendingFP); + // } + posIn.seek(posPendingFP); + posPendingFP = -1; + + if (payPendingFP != -1) { + // if (DEBUG) { + // System.out.println(" seek pay to pendingFP=" + payPendingFP); + // } + payIn.seek(payPendingFP); + payPendingFP = -1; + } + + // Force buffer refill: + posBufferUpto = BLOCK_SIZE; + } + + if (posPendingCount > freq) { + skipPositions(); + posPendingCount = freq; + } + + if (posBufferUpto == BLOCK_SIZE) { + refillPositions(); + posBufferUpto = 0; + } + position += posDeltaBuffer[posBufferUpto]; + + if (indexHasPayloads) { + payloadLength = payloadLengthBuffer[posBufferUpto]; + payload.bytes = payloadBytes; + payload.offset = payloadByteUpto; + payload.length = payloadLength; + payloadByteUpto += payloadLength; + } + + if (indexHasOffsets) { + startOffset = lastStartOffset + offsetStartDeltaBuffer[posBufferUpto]; + endOffset = startOffset + offsetLengthBuffer[posBufferUpto]; + lastStartOffset = startOffset; + } + + posBufferUpto++; + posPendingCount--; + // if (DEBUG) { + // System.out.println(" return pos=" + position); + // } + return position; + } + + @Override + public int startOffset() { + return startOffset; + } + + @Override + public int endOffset() { + return endOffset; + } + + @Override + public BytesRef getPayload() { + // if (DEBUG) { + // System.out.println(" FPR.getPayload payloadLength=" + payloadLength + " payloadByteUpto=" + payloadByteUpto); + // } + if (payloadLength == 0) { + return null; + } else { + return payload; + } + } + } +} diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsWriter.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsWriter.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsWriter.java 1969-12-31 19:00:00.000000000 -0500 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/block/BlockPostingsWriter.java 2012-08-18 10:36:18.765767186 -0400 @@ -0,0 +1,559 @@ +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.ArrayList; +import java.util.List; + +import org.apache.lucene.codecs.CodecUtil; +import org.apache.lucene.codecs.PostingsWriterBase; +import org.apache.lucene.codecs.TermStats; +import org.apache.lucene.index.CorruptIndexException; +import org.apache.lucene.index.FieldInfo; +import org.apache.lucene.index.FieldInfo.IndexOptions; +import org.apache.lucene.index.IndexFileNames; +import org.apache.lucene.index.SegmentWriteState; +import org.apache.lucene.store.IndexOutput; +import org.apache.lucene.store.RAMOutputStream; +import org.apache.lucene.util.ArrayUtil; +import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.IOUtils; +import org.apache.lucene.util.packed.PackedInts; + + +/** + * Concrete class that writes docId(maybe frq,pos,offset,payloads) list + * with postings format. + * + * Postings list for each term will be stored separately. + * + * @see BlockSkipWriter for details about skipping setting and postings layout. + * + */ +final class BlockPostingsWriter extends PostingsWriterBase { + + static final int maxSkipLevels = 10; + + final static String TERMS_CODEC = "BlockPostingsWriterTerms"; + final static String DOC_CODEC = "BlockPostingsWriterDoc"; + final static String POS_CODEC = "BlockPostingsWriterPos"; + final static String PAY_CODEC = "BlockPostingsWriterPay"; + + // Increment version to change it: + final static int VERSION_START = 0; + final static int VERSION_CURRENT = VERSION_START; + + final IndexOutput docOut; + final IndexOutput posOut; + final IndexOutput payOut; + + private IndexOutput termsOut; + + // How current field indexes postings: + private boolean fieldHasFreqs; + private boolean fieldHasPositions; + private boolean fieldHasOffsets; + private boolean fieldHasPayloads; + + // Holds starting file pointers for each term: + private long docTermStartFP; + private long posTermStartFP; + private long payTermStartFP; + + final int[] docDeltaBuffer; + final int[] freqBuffer; + private int docBufferUpto; + + final int[] posDeltaBuffer; + final int[] payloadLengthBuffer; + final int[] offsetStartDeltaBuffer; + final int[] offsetLengthBuffer; + private int posBufferUpto; + + private byte[] payloadBytes; + private int payloadByteUpto; + + private int lastBlockDocID; + private long lastBlockPosFP; + private long lastBlockPayFP; + private int lastBlockPosBufferUpto; + private int lastBlockStartOffset; + private int lastBlockPayloadByteUpto; + + private int lastDocID; + private int lastPosition; + private int lastStartOffset; + private int docCount; + + final byte[] encoded; + + private final ForUtil forUtil; + private final BlockSkipWriter skipWriter; + + public BlockPostingsWriter(SegmentWriteState state, float acceptableOverheadRatio) throws IOException { + super(); + + docOut = state.directory.createOutput(IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, BlockPostingsFormat.DOC_EXTENSION), + state.context); + IndexOutput posOut = null; + IndexOutput payOut = null; + boolean success = false; + try { + CodecUtil.writeHeader(docOut, DOC_CODEC, VERSION_CURRENT); + forUtil = new ForUtil(acceptableOverheadRatio, docOut); + if (state.fieldInfos.hasProx()) { + posDeltaBuffer = new int[MAX_DATA_SIZE]; + posOut = state.directory.createOutput(IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, BlockPostingsFormat.POS_EXTENSION), + state.context); + CodecUtil.writeHeader(posOut, POS_CODEC, VERSION_CURRENT); + + if (state.fieldInfos.hasPayloads()) { + payloadBytes = new byte[128]; + payloadLengthBuffer = new int[MAX_DATA_SIZE]; + } else { + payloadBytes = null; + payloadLengthBuffer = null; + } + + if (state.fieldInfos.hasOffsets()) { + offsetStartDeltaBuffer = new int[MAX_DATA_SIZE]; + offsetLengthBuffer = new int[MAX_DATA_SIZE]; + } else { + offsetStartDeltaBuffer = null; + offsetLengthBuffer = null; + } + + if (state.fieldInfos.hasPayloads() || state.fieldInfos.hasOffsets()) { + payOut = state.directory.createOutput(IndexFileNames.segmentFileName(state.segmentInfo.name, state.segmentSuffix, BlockPostingsFormat.PAY_EXTENSION), + state.context); + CodecUtil.writeHeader(payOut, PAY_CODEC, VERSION_CURRENT); + } + } else { + posDeltaBuffer = null; + payloadLengthBuffer = null; + offsetStartDeltaBuffer = null; + offsetLengthBuffer = null; + payloadBytes = null; + } + this.payOut = payOut; + this.posOut = posOut; + success = true; + } finally { + if (!success) { + IOUtils.closeWhileHandlingException(docOut, posOut, payOut); + } + } + + docDeltaBuffer = new int[MAX_DATA_SIZE]; + freqBuffer = new int[MAX_DATA_SIZE]; + + // TODO: should we try skipping every 2/4 blocks...? + skipWriter = new BlockSkipWriter(maxSkipLevels, + BLOCK_SIZE, + state.segmentInfo.getDocCount(), + docOut, + posOut, + payOut); + + encoded = new byte[MAX_ENCODED_SIZE]; + } + + public BlockPostingsWriter(SegmentWriteState state) throws IOException { + this(state, PackedInts.COMPACT); + } + + @Override + public void start(IndexOutput termsOut) throws IOException { + this.termsOut = termsOut; + CodecUtil.writeHeader(termsOut, TERMS_CODEC, VERSION_CURRENT); + termsOut.writeVInt(BLOCK_SIZE); + } + + @Override + public void setField(FieldInfo fieldInfo) { + IndexOptions indexOptions = fieldInfo.getIndexOptions(); + fieldHasFreqs = indexOptions.compareTo(IndexOptions.DOCS_AND_FREQS) >= 0; + fieldHasPositions = indexOptions.compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS) >= 0; + fieldHasOffsets = indexOptions.compareTo(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS) >= 0; + fieldHasPayloads = fieldInfo.hasPayloads(); + skipWriter.setField(fieldHasPositions, fieldHasOffsets, fieldHasPayloads); + } + + @Override + public void startTerm() { + docTermStartFP = docOut.getFilePointer(); + if (fieldHasPositions) { + posTermStartFP = posOut.getFilePointer(); + if (fieldHasPayloads || fieldHasOffsets) { + payTermStartFP = payOut.getFilePointer(); + } + } + lastDocID = 0; + lastBlockDocID = -1; + // if (DEBUG) { + // System.out.println("FPW.startTerm startFP=" + docTermStartFP); + // } + skipWriter.resetSkip(); + } + + @Override + public void startDoc(int docID, int termDocFreq) throws IOException { + // if (DEBUG) { + // System.out.println("FPW.startDoc docID["+docBufferUpto+"]=" + docID); + // } + // Have collected a block of docs, and get a new doc. + // Should write skip data as well as postings list for + // current block. + if (lastBlockDocID != -1 && docBufferUpto == 0) { + // if (DEBUG) { + // System.out.println(" bufferSkip at writeBlock: lastDocID=" + lastBlockDocID + " docCount=" + (docCount-1)); + // } + skipWriter.bufferSkip(lastBlockDocID, docCount, lastBlockPosFP, lastBlockPayFP, lastBlockPosBufferUpto, lastBlockStartOffset, lastBlockPayloadByteUpto); + } + + final int docDelta = docID - lastDocID; + + if (docID < 0 || (docCount > 0 && docDelta <= 0)) { + throw new CorruptIndexException("docs out of order (" + docID + " <= " + lastDocID + " ) (docOut: " + docOut + ")"); + } + + docDeltaBuffer[docBufferUpto] = docDelta; + // if (DEBUG) { + // System.out.println(" docDeltaBuffer[" + docBufferUpto + "]=" + docDelta); + // } + if (fieldHasFreqs) { + freqBuffer[docBufferUpto] = termDocFreq; + } + docBufferUpto++; + docCount++; + + if (docBufferUpto == BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" write docDelta block @ fp=" + docOut.getFilePointer()); + // } + forUtil.writeBlock(docDeltaBuffer, encoded, docOut); + if (fieldHasFreqs) { + // if (DEBUG) { + // System.out.println(" write freq block @ fp=" + docOut.getFilePointer()); + // } + forUtil.writeBlock(freqBuffer, encoded, docOut); + } + // NOTE: don't set docBufferUpto back to 0 here; + // finishDoc will do so (because it needs to see that + // the block was filled so it can save skip data) + } + + + lastDocID = docID; + lastPosition = 0; + lastStartOffset = 0; + } + + /** Add a new position & payload */ + @Override + public void addPosition(int position, BytesRef payload, int startOffset, int endOffset) throws IOException { + // if (DEBUG) { + // System.out.println("FPW.addPosition pos=" + position + " posBufferUpto=" + posBufferUpto + (fieldHasPayloads ? " payloadByteUpto=" + payloadByteUpto: "")); + // } + posDeltaBuffer[posBufferUpto] = position - lastPosition; + if (fieldHasPayloads) { + if (payload == null || payload.length == 0) { + // no payload + payloadLengthBuffer[posBufferUpto] = 0; + } else { + payloadLengthBuffer[posBufferUpto] = payload.length; + if (payloadByteUpto + payload.length > payloadBytes.length) { + payloadBytes = ArrayUtil.grow(payloadBytes, payloadByteUpto + payload.length); + } + System.arraycopy(payload.bytes, payload.offset, payloadBytes, payloadByteUpto, payload.length); + payloadByteUpto += payload.length; + } + } + + if (fieldHasOffsets) { + assert startOffset >= lastStartOffset; + assert endOffset >= startOffset; + offsetStartDeltaBuffer[posBufferUpto] = startOffset - lastStartOffset; + offsetLengthBuffer[posBufferUpto] = endOffset - startOffset; + lastStartOffset = startOffset; + } + + posBufferUpto++; + lastPosition = position; + if (posBufferUpto == BLOCK_SIZE) { + // if (DEBUG) { + // System.out.println(" write pos bulk block @ fp=" + posOut.getFilePointer()); + // } + forUtil.writeBlock(posDeltaBuffer, encoded, posOut); + + if (fieldHasPayloads) { + forUtil.writeBlock(payloadLengthBuffer, encoded, payOut); + payOut.writeVInt(payloadByteUpto); + payOut.writeBytes(payloadBytes, 0, payloadByteUpto); + payloadByteUpto = 0; + } + if (fieldHasOffsets) { + forUtil.writeBlock(offsetStartDeltaBuffer, encoded, payOut); + forUtil.writeBlock(offsetLengthBuffer, encoded, payOut); + } + posBufferUpto = 0; + } + } + + @Override + public void finishDoc() throws IOException { + // Since we don't know df for current term, we had to buffer + // those skip data for each block, and when a new doc comes, + // write them to skip file. + if (docBufferUpto == BLOCK_SIZE) { + lastBlockDocID = lastDocID; + if (posOut != null) { + if (payOut != null) { + lastBlockPayFP = payOut.getFilePointer(); + } + lastBlockPosFP = posOut.getFilePointer(); + lastBlockPosBufferUpto = posBufferUpto; + lastBlockStartOffset = lastStartOffset; + lastBlockPayloadByteUpto = payloadByteUpto; + } + // if (DEBUG) { + // System.out.println(" docBufferUpto="+docBufferUpto+" now get lastBlockDocID="+lastBlockDocID+" lastBlockPosFP=" + lastBlockPosFP + " lastBlockPosBufferUpto=" + lastBlockPosBufferUpto + " lastBlockPayloadByteUpto=" + lastBlockPayloadByteUpto); + // } + docBufferUpto = 0; + } + } + + private static class PendingTerm { + public final long docStartFP; + public final long posStartFP; + public final long payStartFP; + public final int skipOffset; + public final int lastPosBlockOffset; + + public PendingTerm(long docStartFP, long posStartFP, long payStartFP, int skipOffset, int lastPosBlockOffset) { + this.docStartFP = docStartFP; + this.posStartFP = posStartFP; + this.payStartFP = payStartFP; + this.skipOffset = skipOffset; + this.lastPosBlockOffset = lastPosBlockOffset; + } + } + + private final List pendingTerms = new ArrayList(); + + /** Called when we are done adding docs to this term */ + @Override + public void finishTerm(TermStats stats) throws IOException { + assert stats.docFreq > 0; + + // TODO: wasteful we are counting this (counting # docs + // for this term) in two places? + assert stats.docFreq == docCount: stats.docFreq + " vs " + docCount; + + // if (DEBUG) { + // System.out.println("FPW.finishTerm docFreq=" + stats.docFreq); + // } + + // if (DEBUG) { + // if (docBufferUpto > 0) { + // System.out.println(" write doc/freq vInt block (count=" + docBufferUpto + ") at fp=" + docOut.getFilePointer() + " docTermStartFP=" + docTermStartFP); + // } + // } + + // vInt encode the remaining doc deltas and freqs: + for(int i=0;i 0) { + // System.out.println(" write pos vInt block (count=" + posBufferUpto + ") at fp=" + posOut.getFilePointer() + " posTermStartFP=" + posTermStartFP + " hasPayloads=" + fieldHasPayloads + " hasOffsets=" + fieldHasOffsets); + // } + // } + + // totalTermFreq is just total number of positions(or payloads, or offsets) + // associated with current term. + assert stats.totalTermFreq != -1; + if (stats.totalTermFreq > BLOCK_SIZE) { + // record file offset for last pos in last block + lastPosBlockOffset = (int) (posOut.getFilePointer() - posTermStartFP); + } else { + lastPosBlockOffset = -1; + } + if (posBufferUpto > 0) { + posOut.writeVInt(posBufferUpto); + + // TODO: should we send offsets/payloads to + // .pay...? seems wasteful (have to store extra + // vLong for low (< BLOCK_SIZE) DF terms = vast vast + // majority) + + // vInt encode the remaining positions/payloads/offsets: + int lastPayloadLength = -1; + int payloadBytesReadUpto = 0; + for(int i=0;iBLOCK_SIZE encoded values. + */ + static final int MAX_ENCODED_SIZE = BLOCK_SIZE * 4; + + /** + * Upper limit of the number of values that might be decoded in a single call to + * {@link #readBlock(IndexInput, byte[], int[])}. Although values after + * 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}).

*
    - *
  • FreqFile (.frq) --> Header, <TermFreqs, SkipData> TermCount
  • + *
  • FreqFile (.frq) --> Header, <TermFreqs, SkipData?> TermCount
  • *
  • Header --> {@link CodecUtil#writeHeader CodecHeader}
  • *
  • TermFreqs --> <TermFreq> DocFreq
  • *
  • TermFreq --> DocDelta[, Freq?]
  • diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsWriter.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsWriter.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsWriter.java 2012-06-22 14:43:39.039403304 -0400 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40PostingsWriter.java 2012-07-19 12:56:23.535537739 -0400 @@ -185,8 +185,6 @@ int lastDocID; int df; - /** Adds a new doc in this term. If this returns null - * then we just skip consuming positions/payloads. */ @Override public void startDoc(int docID, int termDocFreq) throws IOException { // if (DEBUG) System.out.println("SPW: startDoc seg=" + segment + " docID=" + docID + " tf=" + termDocFreq + " freqOut.fp=" + freqOut.getFilePointer()); diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListReader.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListReader.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListReader.java 2012-08-16 15:11:15.427291283 -0400 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListReader.java 2012-08-18 09:15:10.957814833 -0400 @@ -59,30 +59,36 @@ private int skipInterval[]; // skipInterval of each level private int[] numSkipped; // number of docs skipped per level - private int[] skipDoc; // doc id of current skip entry per level + protected int[] skipDoc; // doc id of current skip entry per level private int lastDoc; // doc id of last read skip entry with docId <= target private long[] childPointer; // child pointer of current skip entry per level private long lastChildPointer; // childPointer of last read skip entry with docId <= target private boolean inputIsBuffered; + private final int skipMultiplier; - public MultiLevelSkipListReader(IndexInput skipStream, int maxSkipLevels, int skipInterval) { + protected MultiLevelSkipListReader(IndexInput skipStream, int maxSkipLevels, int skipInterval, int skipMultiplier) { this.skipStream = new IndexInput[maxSkipLevels]; this.skipPointer = new long[maxSkipLevels]; this.childPointer = new long[maxSkipLevels]; this.numSkipped = new int[maxSkipLevels]; this.maxNumberOfSkipLevels = maxSkipLevels; this.skipInterval = new int[maxSkipLevels]; + this.skipMultiplier = skipMultiplier; this.skipStream [0]= skipStream; this.inputIsBuffered = (skipStream instanceof BufferedIndexInput); this.skipInterval[0] = skipInterval; for (int i = 1; i < maxSkipLevels; i++) { // cache skip intervals - this.skipInterval[i] = this.skipInterval[i - 1] * skipInterval; + this.skipInterval[i] = this.skipInterval[i - 1] * skipMultiplier; } skipDoc = new int[maxSkipLevels]; } + // skipMultiplier and skipInterval are the same: + protected MultiLevelSkipListReader(IndexInput skipStream, int maxSkipLevels, int skipInterval) { + this(skipStream, maxSkipLevels, skipInterval, skipInterval); + } /** Returns the id of the doc to which the last call of {@link #skipTo(int)} * has skipped. */ @@ -187,7 +193,12 @@ /** Loads the skip levels */ private void loadSkipLevels() throws IOException { - numberOfSkipLevels = MathUtil.log(docCount, skipInterval[0]); + if (docCount <= skipInterval[0]) { + numberOfSkipLevels = 1; + } else { + numberOfSkipLevels = 1+MathUtil.log(docCount/skipInterval[0], skipMultiplier); + } + if (numberOfSkipLevels > maxNumberOfSkipLevels) { numberOfSkipLevels = maxNumberOfSkipLevels; } diff -rubBN -x .svn -x build -x '*.pk' lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListWriter.java pforbranch/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListWriter.java --- lucene.trunk/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListWriter.java 2012-08-16 15:11:15.427291283 -0400 +++ pforbranch/lucene/core/src/java/org/apache/lucene/codecs/MultiLevelSkipListWriter.java 2012-08-18 09:15:11.305814673 -0400 @@ -26,6 +26,8 @@ /** * This abstract class writes skip lists with multiple levels. * + *
    + *
      * 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 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) / (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" )); // -----------------------------------------------------------------