public long readVLong()

in lucene-directory-v2/src/main/java/jetbrains/exodus/lucene2/XodusDirectory.java [1146:1244]


        public long readVLong() throws IOException {
            var pageOffset = (int) position & (pageSize - 1);
            var pageAddress = fileAddress + position - pageOffset;

            final long remaining = Math.min(end - position, pageSize - pageOffset);

            if (9 <= remaining) {
                readPageIfNeeded(pageAddress);

                int positionOffset = 0;
                try {
                    byte b = page[pageOffset];
                    positionOffset++;

                    if (b >= 0) {
                        return b;
                    }

                    pageOffset++;
                    long i = b & 0x7FL;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 7;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 14;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 21;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 28;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 35;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 42;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 49;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7FL) << 56;
                    if (b >= 0) {
                        return i;
                    }
                } finally {
                    movePosition(positionOffset);
                }

                throw new IOException("Invalid vLong detected (negative values disallowed)");
            } else {
                return super.readVLong();
            }
        }