private void readDeltaValues(int firstByte)
            throws IOException
    {
        // extract the number of fixed bits
        int fixedBits = (firstByte >>> 1) & 0x1f;
        if (fixedBits != 0) {
            fixedBits = LongDecode.decodeBitWidth(fixedBits);
        }

        // extract the blob run length
        int length = (firstByte & 0x01) << 8;
        length |= input.read();

        // read the first value stored as vint
        long firstVal = LongDecode.readVInt(signed, input);

        // store first value to result buffer
        literals[numLiterals++] = firstVal;

        // if fixed bits is 0 then all values have fixed delta
        long prevVal;
        if (fixedBits == 0) {
            // read the fixed delta value stored as vint (deltas can be negative even
            // if all number are positive)
            long fixedDelta = LongDecode.readSignedVInt(input);

            // add fixed deltas to adjacent values
            for (int i = 0; i < length; i++) {
                literals[numLiterals++] = literals[numLiterals - 2] + fixedDelta;
            }
        }
        else {
            long deltaBase = LongDecode.readSignedVInt(input);
            // add delta base and first value
            literals[numLiterals++] = firstVal + deltaBase;
            prevVal = literals[numLiterals - 1];
            length -= 1;

            // write the unpacked values, add it to previous value and store final
            // value to result buffer. if the delta base value is negative then it
            // is a decreasing sequence else an increasing sequence
            packer.unpack(literals, numLiterals, length, fixedBits, input);
            while (length > 0) {
                if (deltaBase < 0) {
                    literals[numLiterals] = prevVal - literals[numLiterals];
                }
                else {
                    literals[numLiterals] = prevVal + literals[numLiterals];
                }
                prevVal = literals[numLiterals];
                length--;
                numLiterals++;
            }
        }
    }
private void readDeltaValues ( int firstByte ) throws IOException { int fixedBits = ( firstByte > > > 1 ) & 0x1f ; if ( fixedBits != 0 ) { fixedBits = LongDecode . decodeBitWidth ( fixedBits ) ; } int length = ( firstByte & 0x01 ) << 8 ; length |= input . read ( ) ; long firstVal = LongDecode . readVInt ( signed , input ) ; literals [ numLiterals ++ ] = firstVal ; long prevVal ; if ( fixedBits == 0 ) { long fixedDelta = LongDecode . readSignedVInt ( input ) ; for ( int i = 0 ; i < length ; i ++ ) { literals [ numLiterals ++ ] = literals [ numLiterals - 2 ] + fixedDelta ; } } else { long deltaBase = LongDecode . readSignedVInt ( input ) ; literals [ numLiterals ++ ] = firstVal + deltaBase ; prevVal = literals [ numLiterals - 1 ] ; length -= 1 ; packer . unpack ( literals , numLiterals , length , fixedBits , input ) ; while ( length > 0 ) { if ( deltaBase < 0 ) { literals [ numLiterals ] = prevVal - literals [ numLiterals ] ; } else { literals [ numLiterals ] = prevVal + literals [ numLiterals ] ; } prevVal = literals [ numLiterals ] ; length -- ; numLiterals ++ ; } } }
This comes from the Apache Hive ORC code