Learn-to-Compress / headers / delta_my.h
delta_my.h
Raw
#ifndef delta_my_H_
#define delta_my_H_

#include "common.h"
#include "codecs.h"

namespace Codecset
{

    class delta_my : public IntegerCODEC
    {
    public:
        using IntegerCODEC::decodeArray;
        using IntegerCODEC::decodeArray8;
        using IntegerCODEC::encodeArray;
        using IntegerCODEC::encodeArray8;
        using IntegerCODEC::init;
        using IntegerCODEC::randomdecodeArray;
        using IntegerCODEC::randomdecodeArray8;
        using IntegerCODEC::summation;

        int block_num;
        int block_size;

        void init(int blocks, int blocksize, int extra)
        {
            block_num = blocks;
            block_size = blocksize;
        }
        // max_bit+number1+delta
        uint32_t *encodeArray(uint32_t *in, const size_t length, uint32_t *res, size_t nvalue)
        {
            uint8_t * out=reinterpret_cast<uint8_t*>(res);
            uint8_t * mark_out = out;
            out = encodeArray8(in,length,out,nvalue);
            res = reinterpret_cast<uint32_t*>(mark_out);
            uint32_t *tmp_res = reinterpret_cast<uint32_t*>(out);
            return tmp_res;
        }

        uint32_t *decodeArray(uint32_t *in, const size_t length, uint32_t *out, size_t nvalue)
        {
            uint8_t *tmpin = reinterpret_cast<uint8_t *>(in);
            return decodeArray8(tmpin, length, out, nvalue);
        }

        uint32_t randomdecodeArray(uint32_t *in, const size_t l, uint32_t *out, size_t nvalue)
        {
            std::cout<<"This method doesn't support random access."<<std::endl;
            return 0;
        }

        uint8_t *encodeArray8(uint32_t *in, const size_t length, uint8_t *res, size_t nvalue)
        {
            uint8_t *out = res;
            int *delta = new int[length];
            int max_delta=0;
            for(uint32_t i=0;i<length-1;i++){
                delta[i] = in[i+1]-in[i];
                if(abs(delta[i])>max_delta){
                    max_delta =  abs(delta[i]);
                }
            }
            int tmp_bit = bits(max_delta)+1;
            // std::cout<<tmp_bit<<std::endl;
            if(max_delta==0){
                tmp_bit=0;
            }
            
            out[0]=(uint8_t)tmp_bit;
            out++;
            out = write_delta_default(&in[0],out, 32, 1);
            if(tmp_bit==0){
                free(delta);
                return out;
            }
            if(tmp_bit>=32){
                out = write_delta_default(in,out,32,length);
            }
            else{
                out = write_delta(delta, out, tmp_bit, length-1);
            }
    
            free(delta);
            return out;
        }

        uint32_t *decodeArray8(uint8_t *in, const size_t length, uint32_t *out, size_t nvalue)
        {
            uint32_t* res = out;
            //start_index + bit + theta0 + theta1 + numbers + delta
            uint8_t* tmpin = in;
            uint8_t maxerror = tmpin[0];
            tmpin++;
            uint32_t base;
            memcpy(&base, tmpin, sizeof(base));
            tmpin += sizeof(uint32_t);
            if (maxerror) {
                res[0] = base;
                read_all_bit_Delta<uint32_t>(tmpin, 0, length - 1, maxerror, base, res + 1);
            }
            else {
                for (int j = 0;j < length;j++) {
                    res[j] = base;
                }
            }

            return out;

        }
        uint32_t randomdecodeArray8(uint8_t *in, const size_t l, uint32_t *out, size_t nvalue)
        {
            uint8_t* tmpin = in;
            uint8_t maxbits;
            memcpy(&maxbits, tmpin, sizeof(uint8_t));
            tmpin += sizeof(uint8_t);

            if (maxbits == sizeof(uint32_t) * 8) {
                uint32_t tmp_val = reinterpret_cast<uint32_t*>(tmpin)[l];
                return tmp_val;
            }

            uint32_t base;
            memcpy(&base, tmpin, sizeof(base));
            tmpin += sizeof(base);

            uint32_t tmp_val = base;
            if (maxbits) {
                tmp_val = read_Delta_int(tmpin, maxbits, l, base);
            }
            return tmp_val;

        }
        uint64_t summation( uint8_t *in, const size_t l, size_t nvalue){
    
            return 0;
        }
        uint32_t get_block_nums()
        {
            return 1;
        }
        void destroy()
        {
        }
        std::string name() const
        {
            return "delta_my";
        }
    };
}

#endif