Learn-to-Compress / headers / rank.h
rank.h
Raw
#ifndef RANK_H_
#define RANK_H_


#include "popcount.h"
/*
class Rank{
public:
    int* rank_lut_;
    int basic_block_size_=64;
void set_basic_block_size(int basic_block){
    basic_block_size_ = basic_block;
}
int rank( int pos, uint64_t *bits_  ){//basic_block_size_ is like 64

    int block_id = pos/basic_block_size_;
    int offset = pos & (basic_block_size_ - 1);
    //num_bits_ is the block size
    return (rank_lut_[block_id] + popcountLinear(bits_, block_id , offset + 1));
}

void initRankLut(int num_bits_, uint64_t *bits_  ) {
        int num_blocks = num_bits_ / basic_block_size_ + 1;
        rank_lut_ = new int[num_blocks];

        int cumu_rank = 0;
        for (int i = 0; i < num_blocks - 1; i++) {
            rank_lut_[i] = cumu_rank;
            cumu_rank += popcountLinear(bits_, i, basic_block_size_);
        }
        rank_lut_[num_blocks - 1] = cumu_rank;
}

};
*/

int rank( int pos, uint64_t *bits_ ,int*rank_lut_,int basic_block_size_ =64){//basic_block_size_ is like 64

    int block_id = pos/basic_block_size_;
    int offset = pos & (basic_block_size_ - 1);
    //num_bits_ is the block size
    return (rank_lut_[block_id] + popcountLinear(bits_, block_id , offset + 1));
}

void initRankLut(int num_bits_, uint64_t *bits_ ,int*rank_lut_ ,int basic_block_size_=64) {
        int num_blocks = ceil((double)num_bits_ / (double)basic_block_size_ );
        int cumu_rank = 0;
        for (int i = 0; i < num_blocks - 1; i++) {
            rank_lut_[i] = cumu_rank;
            cumu_rank += popcountLinear(bits_, i, basic_block_size_);
        }
        rank_lut_[num_blocks - 1] = cumu_rank;

}


#endif // RANK_H_