aboutsummaryrefslogtreecommitdiffstats
path: root/vespajlib/src/main
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-03-22 11:29:46 +0100
committerGitHub <noreply@github.com>2023-03-22 11:29:46 +0100
commit39ef03dbfea4665dbe06b187d8d9d19d65e6d660 (patch)
tree13476d4f80f2b22a506a9bb9a37f96b22c39f03c /vespajlib/src/main
parentc9d4237920fbfcc644579a2cdf0fcd01bfff2b6c (diff)
parentf217406ad77df0047364e27b607117dcc8953eaf (diff)
Merge pull request #26518 from vespa-engine/havardpe/decode-index
added DecodeIndex utility class
Diffstat (limited to 'vespajlib/src/main')
-rw-r--r--vespajlib/src/main/java/com/yahoo/slime/DecodeIndex.java51
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;
+ }
+}