/* Copyright 2015 Google Inc. All Rights Reserved.

   https://github.com/google/brotli/blob/master/LICENSE

   Distributed under MIT license.
   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
*/

package net.sourceforge.plantuml.brotli;

import java.io.InputStream;

final class State {
	byte[] ringBuffer;
	byte[] contextModes;
	byte[] contextMap;
	byte[] distContextMap;
	byte[] output;
	byte[] byteBuffer; // BitReader

	short[] shortBuffer; // BitReader

	int[] intBuffer; // BitReader
	int[] rings;
	int[] blockTrees;
	int[] hGroup0;
	int[] hGroup1;
	int[] hGroup2;

	long accumulator64; // BitReader: pre-fetched bits.

	int runningState; // Default value is 0 == Decode.UNINITIALIZED
	int nextRunningState;
	int accumulator32; // BitReader: pre-fetched bits.
	int bitOffset; // BitReader: bit-reading position in accumulator.
	int halfOffset; // BitReader: offset of next item in intBuffer/shortBuffer.
	int tailBytes; // BitReader: number of bytes in unfinished half.
	int endOfStreamReached; // BitReader: input stream is finished.
	int metaBlockLength;
	int inputEnd;
	int isUncompressed;
	int isMetadata;
	int literalBlockLength;
	int numLiteralBlockTypes;
	int commandBlockLength;
	int numCommandBlockTypes;
	int distanceBlockLength;
	int numDistanceBlockTypes;
	int pos;
	int maxDistance;
	int distRbIdx;
	int trivialLiteralContext;
	int literalTreeIndex;
	int literalTree;
	int j;
	int insertLength;
	int contextMapSlice;
	int distContextMapSlice;
	int contextLookupOffset1;
	int contextLookupOffset2;
	int treeCommandOffset;
	int distanceCode;
	int numDirectDistanceCodes;
	int distancePostfixMask;
	int distancePostfixBits;
	int distance;
	int copyLength;
	int copyDst;
	int maxBackwardDistance;
	int maxRingBufferSize;
	int ringBufferSize;
	int expectedTotalSize;
	int outputOffset;
	int outputLength;
	int outputUsed;
	int bytesWritten;
	int bytesToWrite;

	InputStream input; // BitReader

	State() {
		this.ringBuffer = new byte[0];
		this.rings = new int[10];
		this.rings[0] = 16;
		this.rings[1] = 15;
		this.rings[2] = 11;
		this.rings[3] = 4;
	}
}
