package com.intellij.flex.uiDesigner.abc; import com.intellij.util.containers.ObjectIntHashMap; import java.nio.ByteBuffer; class PoolPart { private final ObjectIntHashMap<ByteArray> map; private final ByteArray key = createByteArray(); private final ByteArray[] list; int totalBytes; PoolPart(int poolPartLength) { map = new ObjectIntHashMap<>(poolPartLength); list = new ByteArray[poolPartLength - 1]; } ByteArray createByteArray() { return new ByteArray(); } int store(DataBuffer data, int start, int end) { ByteArray a = createByteArray(); a.data = data; a.start = start; a.end = end; a.init(); int index = map.size() + 1; map.put(a, index); list[index - 1] = a; totalBytes += end - start; return index; } int contains(DataBuffer data, int start, int end) { key.clear(); key.data = data; key.start = start; key.end = end; key.init(); return map.get(key); } void writeTo(ByteBuffer buffer) { writeTo(buffer, 1); } void writeTo(ByteBuffer buffer, int f) { final int size = map.size(); writeU32(buffer, size == 0 ? 0 : size + f); for (int i = 0; i < size; i++) { ByteArray a = list[i]; a.data.writeTo(buffer, a.start, a.end); } } static void writeU32(ByteBuffer buffer, long v) { if (v < 128 && v >= 0) { buffer.put((byte)v); } else if (v < 16384 && v >= 0) { buffer.put((byte)(v & 0x7F | 0x80)); buffer.put((byte)(v >> 7)); } else if (v < 2097152 && v >= 0) { buffer.put((byte)(v & 0x7F | 0x80)); buffer.put((byte)(v >> 7 | 0x80)); buffer.put((byte)(v >> 14)); } else if (v < 268435456 && v >= 0) { buffer.put((byte)(v & 0x7F | 0x80)); buffer.put((byte)(v >> 7 | 0x80)); buffer.put((byte)(v >> 14 | 0x80)); buffer.put((byte)(v >> 21)); } else { buffer.put((byte)(v & 0x7F | 0x80)); buffer.put((byte)(v >> 7 | 0x80)); buffer.put((byte)(v >> 14 | 0x80)); buffer.put((byte)(v >> 21 | 0x80)); buffer.put((byte)(v >> 28)); } } }