bool get(uint64_t i) const { assert ( i < n ); uint64_t const block = i / blocksize; i -= block*blocksize; uint64_t const blockptr = getBlockPointer(block); uint64_t const wordoff = (blockptr / (8*sizeof(uint64_t))); uint64_t const bitoff = blockptr % (8*sizeof(uint64_t)); ::libmaus2::util::GetObject<uint64_t const *> GO(data.begin() + wordoff); ::libmaus2::gamma::GammaDecoder < ::libmaus2::util::GetObject<uint64_t const *> > GD(GO); if ( bitoff ) GD.decodeWord(bitoff); GD.decodeWord(rankaccbits); // 1 bit accumulator bool sym = GD.decodeWord(1); uint64_t rl = GD.decode()+1; while ( i >= rl ) { i -= rl; sym = ! sym; rl = GD.decode()+1; } return sym; }
bool get(uint64_t i) const { assert ( i < n ); uint64_t const block = i / blocksize; i -= block*blocksize; uint64_t const blockptr = getBlockPointer(block); uint64_t const byteoff = (blockptr / (8*sizeof(uint64_t)))*8; uint64_t const bitoff = blockptr % (8*sizeof(uint64_t)); in.clear(); in.seekg(baseoffset + byteoff); ::libmaus::aio::SynchronousGenericInput<uint64_t> SGI(in,8,std::numeric_limits<uint64_t>::max(),false /* checkmod */); ::libmaus::gamma::GammaDecoder < ::libmaus::aio::SynchronousGenericInput<uint64_t> > GD(SGI); if ( bitoff ) GD.decodeWord(bitoff); GD.decodeWord(rankaccbits); // 1 bit accumulator bool sym = GD.decodeWord(1); uint64_t rl = GD.decode()+1; while ( i >= rl ) { i -= rl; sym = ! sym; rl = GD.decode()+1; } return sym; }
uint64_t rankm1(uint64_t i) const { assert ( i <= n ); uint64_t const block = i / blocksize; i -= block*blocksize; uint64_t const blockptr = getBlockPointer(block); uint64_t const wordoff = (blockptr / (8*sizeof(uint64_t))); uint64_t const bitoff = blockptr % (8*sizeof(uint64_t)); ::libmaus2::util::GetObject<uint64_t const *> GO(data.begin() + wordoff); ::libmaus2::gamma::GammaDecoder < ::libmaus2::util::GetObject<uint64_t const *> > GD(GO); if ( bitoff ) GD.decodeWord(bitoff); uint64_t r = GD.decodeWord(rankaccbits); // 1 bit accumulator bool sym = GD.decodeWord(1); uint64_t rl = GD.decode()+1; // std::cerr << "sym=" << sym << " rl=" << rl << std::endl; while ( i >= rl ) { if ( sym ) r += rl; i -= rl; sym = ! sym; rl = GD.decode()+1; // std::cerr << "sym=" << sym << " rl=" << rl << std::endl; } if ( sym ) return r+i; else return r; }
uint64_t inverseSelect1(uint64_t i, unsigned int & rsym) const { assert ( i < n ); uint64_t const block = i / blocksize; i -= block*blocksize; uint64_t const blockptr = getBlockPointer(block); uint64_t const wordoff = (blockptr / (8*sizeof(uint64_t))); uint64_t const bitoff = blockptr % (8*sizeof(uint64_t)); ::libmaus2::util::GetObject<uint64_t const *> GO(data.begin() + wordoff); ::libmaus2::gamma::GammaDecoder < ::libmaus2::util::GetObject<uint64_t const *> > GD(GO); if ( bitoff ) GD.decodeWord(bitoff); uint64_t r = GD.decodeWord(rankaccbits); // 1 bit accumulator bool sym = GD.decodeWord(1); uint64_t rl = GD.decode()+1; while ( i >= rl ) { if ( sym ) r += rl; i -= rl; sym = ! sym; rl = GD.decode()+1; } rsym = sym; if ( sym ) return r+i+1; else return r; }