diff options
author | Håvard Pettersen <havardpe@yahooinc.com> | 2023-03-21 14:01:28 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@yahooinc.com> | 2023-03-21 15:05:06 +0000 |
commit | 4c93ec38f843e70ab756f537b158ea5c8e3f7cf8 (patch) | |
tree | 5849666635abea1755fc3a8c7c6966f108e9c75d /vespajlib/src/main | |
parent | 3075eced6674caef07fed92b9e311bdda67718a5 (diff) |
added DecodeIndex utility class
Diffstat (limited to 'vespajlib/src/main')
-rw-r--r-- | vespajlib/src/main/java/com/yahoo/slime/DecodeIndex.java | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/vespajlib/src/main/java/com/yahoo/slime/DecodeIndex.java b/vespajlib/src/main/java/com/yahoo/slime/DecodeIndex.java new file mode 100644 index 00000000000..17c7a86730e --- /dev/null +++ b/vespajlib/src/main/java/com/yahoo/slime/DecodeIndex.java @@ -0,0 +1,51 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.slime; + +/** + * Light-weight index structure describing the layout of a Slime value + * encoded in binary format. + **/ +final class DecodeIndex { + static final int initial_capacity = 16; + private long[] data = new long[initial_capacity]; + private int reserved = 0; + + private int adjustSize(int minSize) { + int capacity = initial_capacity; + while (capacity < minSize) { + capacity = capacity << 1; + } + return capacity; + } + + int reserve(int n) { + int offset = reserved; + if (reserved + n > data.length) { + long[] old = data; + data = new long[adjustSize(reserved + n)]; + System.arraycopy(old, 0, data, 0, reserved); + } + reserved += n; + return offset; + } + + int size() { return reserved; } + + void set(int idx, int byteOffset, int firstChild, int extBits) { + data[idx] = (long)(byteOffset & 0x7fff_ffff) << 33 | + (long)(firstChild & 0x7fff_ffff) << 2 | + extBits & 0x3; + } + + int getByteOffset(int idx) { + return (int)(data[idx] >> 33) & 0x7fff_ffff; + } + + int getFirstChild(int idx) { + return (int)(data[idx] >> 2) & 0x7fff_ffff; + } + + int getExtBits(int idx) { + return (int)data[idx] & 0x3; + } +} |