enumerator(succinct::bit_vector const& bv, uint64_t offset, uint64_t universe, uint64_t n, global_parameters const& params) : m_params(params) , m_size(n) , m_universe(universe) , m_bv(&bv) { succinct::bit_vector::enumerator it(bv, offset); m_partitions = read_gamma_nonzero(it); if (m_partitions == 1) { m_cur_partition = 0; m_cur_begin = 0; m_cur_end = n; uint64_t universe_bits = ceil_log2(universe); m_cur_base = it.take(universe_bits); auto ub = 0; if (n > 1) { uint64_t universe_delta = read_delta(it); ub = universe_delta ? universe_delta : (universe - m_cur_base - 1); } m_partition_enum = base_sequence_enumerator (*m_bv, it.position(), ub + 1, n, m_params); m_cur_upper_bound = m_cur_base + ub; } else { m_endpoint_bits = read_gamma(it); uint64_t cur_offset = it.position(); m_sizes = compact_elias_fano::enumerator(bv, cur_offset, n, m_partitions - 1, params); cur_offset += compact_elias_fano::bitsize(params, n, m_partitions - 1); m_upper_bounds = compact_elias_fano::enumerator(bv, cur_offset, universe, m_partitions + 1, params); cur_offset += compact_elias_fano::bitsize(params, universe, m_partitions + 1); m_endpoints_offset = cur_offset; uint64_t endpoints_size = m_endpoint_bits * (m_partitions - 1); cur_offset += endpoints_size; m_sequences_offset = cur_offset; } m_position = size(); slow_move(); }
int BinaryFileReader::read_delta() { return read_binary(read_gamma() - 1); }
virtual void on_init() { read_gamma(full_file_name("gamma.txt")); }