diff --git a/cxxmph/Makefile.am b/cxxmph/Makefile.am deleted file mode 100644 index fda6742..0000000 --- a/cxxmph/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -bin_PROGRAMS = cmph_hash_map_test - -INCLUDES = -I../src/ - -cmph_hash_map_test_LDADD = ../src/libcmph.la -cmph_hash_map_test_SOURCES = cmph_hash_map_test.cc diff --git a/cxxmph/cmph_hash_map.h b/cxxmph/cmph_hash_map.h deleted file mode 100644 index 55ef648..0000000 --- a/cxxmph/cmph_hash_map.h +++ /dev/null @@ -1,159 +0,0 @@ -#include -#include -#include // for std::pair - -#include - -// Save on repetitive typing. -#define CMPH_TMPL_SPEC template -#define CMPH_CLASS_SPEC cmph_hash_map -#define CMPH_METHOD_DECL(r, m) CMPH_TMPL_SPEC typename CMPH_CLASS_SPEC::r CMPH_CLASS_SPEC::m - -template , class EqualKey = std::equal_to, class Alloc = std::allocator > -class cmph_hash_map { - public: - typedef Key key_type; - typedef Data data_type; - typedef std::pair value_type; - typedef HashFcn hasher; - typedef EqualKey key_equal; - - typedef typename std::vector::pointer pointer; - typedef typename std::vector::reference reference; - typedef typename std::vector::const_reference const_reference; - typedef typename std::vector::size_type size_type; - typedef typename std::vector::difference_type difference_type; - typedef typename std::vector::iterator iterator; - typedef typename std::vector::const_iterator const_iterator; - - // For making macros simpler. - typedef void void_type; - typedef bool bool_type; - typedef std::pair insert_return_type; - - cmph_hash_map(); - ~cmph_hash_map(); - - iterator begin(); - iterator end(); - const_iterator begin() const; - const_iterator end() const; - size_type size() const; - bool empty() const; - void clear(); - void erase(iterator pos); - void erase(const key_type& k); - std::pair insert(const value_type& x); - iterator find(const key_type& k); - const_iterator find(const key_type& k) const; - data_type& operator[](const key_type &k); - - void pack() { rehash(); } - - private: - void rehash(); - std::vector values_; - cmph_t* cmph_; - typedef typename __gnu_cxx::hash_map slack_type; - slack_type slack_; -}; - -CMPH_TMPL_SPEC -bool operator==(const CMPH_CLASS_SPEC& lhs, const CMPH_CLASS_SPEC& rhs) { - return lhs.values_ == rhs.values_; -} - -CMPH_TMPL_SPEC CMPH_CLASS_SPEC::cmph_hash_map() : cmph_(NULL) { - rehash(); -} - -CMPH_TMPL_SPEC CMPH_CLASS_SPEC::~cmph_hash_map() { - if(cmph_) cmph_destroy(cmph_); -} - -CMPH_METHOD_DECL(insert_return_type, insert)(const value_type& x) { - iterator it = find(x.first); - if (it != end()) return std::make_pair(it, false); - values_.push_back(x); - slack_.insert(std::make_pair(x.first, values_.size() - 1)); - if ((slack_.size() > 10 && !cmph_) || - (cmph_ && slack_.size() > cmph_size(cmph_) * 2)) rehash(); - it = find(x.first); - // std::cerr << "inserted " << x.first.i_ << " at " << values_.begin() - it; - return std::make_pair(it, true); -} - -CMPH_METHOD_DECL(void_type, rehash)() { - if (values_.empty()) return; - slack_type().swap(slack_); - cmph_io_adapter_t* source = cmph_io_struct_vector_adapter( - &(values_[0]), sizeof(value_type), 0, sizeof(key_type), values_.size()); - cmph_config_t* cmph_config = cmph_config_new(source); - cmph_config_set_algo(cmph_config, CMPH_CHD); - // cmph_config_set_verbosity(cmph_config, 1); - if (cmph_) cmph_destroy(cmph_); - cmph_ = cmph_new(cmph_config); - cmph_config_destroy(cmph_config); - cmph_io_struct_vector_adapter_destroy(source); - std::vector new_values(values_.size()); - for (int i = 0; i < values_.size(); ++i) { - size_type id = cmph_search(cmph_, reinterpret_cast(&(values_[i].first)), sizeof(key_type)); - new_values[id] = values_[i]; - } - values_.swap(new_values); -} - -CMPH_METHOD_DECL(iterator, begin)() { return values_.begin(); } -CMPH_METHOD_DECL(iterator, end)() { return values_.end(); } -CMPH_METHOD_DECL(const_iterator, begin)() const { return values_.begin(); } -CMPH_METHOD_DECL(const_iterator, end)() const { return values_.end(); } -CMPH_METHOD_DECL(bool_type, empty)() const { return values_.empty(); } - -CMPH_METHOD_DECL(void_type, clear)() { - values_.clear(); - slack_.clear(); - cmph_destroy(cmph_); - cmph_ = NULL; -} - -CMPH_METHOD_DECL(void_type, erase)(iterator pos) { - values_.erase(pos); - rehash(); -} -CMPH_METHOD_DECL(void_type, erase)(const key_type& k) { - iterator it = find(k); - if (it == end()) return; - erase(it); -} - -CMPH_METHOD_DECL(const_iterator, find)(const key_type& k) const { - if (!slack_.empty()) { - typename slack_type::const_iterator it = slack_.find(k); - if (it != slack_.end()) return values_.begin() + it->second; - } - if (!cmph_) return end(); - size_type id = cmph_search(cmph_, reinterpret_cast(&k), - sizeof(key_type)); - if (key_equal()(values_[id].first, k)) { - return values_.begin() + id; - } - return end(); -} -CMPH_METHOD_DECL(iterator, find)(const key_type& k) { - if (!slack_.empty()) { - typename slack_type::const_iterator it = slack_.find(k); - if (it != slack_.end()) return values_.begin() + it->second; - } - if (!cmph_) return end(); - size_type id = cmph_search(cmph_, reinterpret_cast(&k), - sizeof(key_type)); - if (key_equal()(values_[id].first, k)) { - return values_.begin() + id; - } - return end(); -} - - -CMPH_METHOD_DECL(data_type&, operator[])(const key_type& k) { - return insert(std::make_pair(k, data_type())).first->second; -} diff --git a/cxxmph/cmph_hash_map_test.cc b/cxxmph/cmph_hash_map_test.cc deleted file mode 100644 index ad6961d..0000000 --- a/cxxmph/cmph_hash_map_test.cc +++ /dev/null @@ -1,19 +0,0 @@ -#include "cmph_hash_map.h" - -#include - -int main(int argc, char** argv) { - cmph_hash_map h; - h.insert(std::make_pair(-1,-1)); - for (cmph_hash_map::const_iterator it = h.begin(); it != h.end(); ++it) { - std::cout << it->first << " -> " << it->second << std::endl; - } - std::cout << "Search -1 gives " << h.find(-1)->second << std::endl; - for (int i = 0; i < 1000; ++i) h.insert(std::make_pair(i, i)); - for (int j = 0; j < 1000; ++j) { - for (int i = 1000; i > 0; --i) { - h.find(i - 1); - // std::cout << "Search " << i - 1 << " gives " << h.find(i - 1)->second << std::endl; - } - } -} diff --git a/cxxmph/mphtable.cc b/cxxmph/mphtable.cc deleted file mode 100644 index b4de79d..0000000 --- a/cxxmph/mphtable.cc +++ /dev/null @@ -1,37 +0,0 @@ -#include - -template struct bitcount { - enum { value = (n & mask ? 1:0) + bitcount> 1>::value }; -}; -template struct bitcount { enum { value = 0 }; }; - -template struct bitposition { - enum - -template class CompileTimeByteTable { - public: - CompileTimeByteTable : current(op::value) { } - int operator[] (int i) { return *(¤t + i); } -private: - unsigned char current; - CompileTimeByteTable next; -}; - -static CompileTimeByteTable<256, bitcount> BitcountTable; - - -#define mix(a,b,c) \ -{ \ - a -= b; a -= c; a ^= (c>>13); \ - b -= c; b -= a; b ^= (a<<8); \ - c -= a; c -= b; c ^= (b>>13); \ - a -= b; a -= c; a ^= (c>>12); \ - b -= c; b -= a; b ^= (a<<16); \ - c -= a; c -= b; c ^= (b>>5); \ - a -= b; a -= c; a ^= (c>>3); \ - b -= c; b -= a; b ^= (a<<10); \ - c -= a; c -= b; c ^= (b>>15); \ -} - - -static const int kMaskStepSelectTable = std::limit::max; diff --git a/cxxmph/mphtable.h b/cxxmph/mphtable.h deleted file mode 100644 index 50e2897..0000000 --- a/cxxmph/mphtable.h +++ /dev/null @@ -1,299 +0,0 @@ - -template -class MPHTable { - public: - typedef Key key_type; - - MPHTable(cmph_t* mphf); - ~MPHTable(); - - template - bool reset(Iterator begin, Iterator end); - - cmph_uint32 index(const key_type& x) const; - - private: - MPHTable(); - cmph_t* mphf; - - // Generates three hash values for k in a single pass. - static hash_vector(cmph_uint32 seed, const char* k, cmph_uint32 keylen, cmph_uint32* hashes) ; -}; - -unsigned int MPHTable::index(const key_type& key) const { - cmph_uint32 keylen = sizeof(key); - chd_ph_data_t* chd = reinterpret_cast(mphf->data); - cmph_uint32 hl[3]; - cmph_uint32 dispatch, position; - cmph_uint32 probe0, probe1; - cmph_uint32 f,g,h; - hash_vector(chd_ph->hl, reinterpret_cast(&key), keylen, hl); - g = hl[0] % chd_ph->nbuckets; - f = hl[1] % chd_ph->n; - g = hl[2] % (chd_ph->n - 1) + 1; - dispatch = compressed_seq_query(chd_ph->cs, g); - probe0_num = disp % chd_ph->n; - probe1_num = disp / chd_ph->n; - position = (cmph_uint32)((f + ((cmph_uint64)h)*probe0 + probe1) % chd_ph->n); - return position; -} - -void MPHTable::hash_vector(cmph_uint32 seed, const char* k, cmph_uint32 keylen, - cmph_uint32* hashes) { - cmph_uint32 len = keylen, length = keylen; - hashes[0] = hashes[1] = 0x9e3779b9; // the golden ratio; an arbitrary value - hashes[2] = seed; // the previous hash value - seed in our case - // consume most of the key - while (len >= 12) { - hashes[0] += ((cmph_uint32)k[0] +((cmph_uint32)k[1]<<8) +((cmph_uint32)k[2]<<16) +((cmph_uint32)k[3]<<24)); - hashes[1] += ((cmph_uint32)k[4] +((cmph_uint32)k[5]<<8) +((cmph_uint32)k[6]<<16) +((cmph_uint32)k[7]<<24)); - hashes[2] += ((cmph_uint32)k[8] +((cmph_uint32)k[9]<<8) +((cmph_uint32)k[10]<<16)+((cmph_uint32)k[11]<<24)); - mix(hashes[0],hashes[1],hashes[2]); - k += 12; len -= 12; - } - // Consumes the remaining 11 bytes - hashes[2] += length; - switch(len) { // all the case statements fall through - case 11: - hashes[2] +=((cmph_uint32)k[10]<<24); - case 10: - hashes[2] +=((cmph_uint32)k[9]<<16); - case 9: - hashes[2] +=((cmph_uint32)k[8]<<8); - /* the first byte of hashes[2] is reserved for the length */ - case 8: - hashes[1] +=((cmph_uint32)k[7]<<24); - case 7: - hashes[1] +=((cmph_uint32)k[6]<<16); - case 6: - hashes[1] +=((cmph_uint32)k[5]<<8); - case 5: - hashes[1] +=(cmph_uint8) k[4]; - case 4: - hashes[0] +=((cmph_uint32)k[3]<<24); - case 3: - hashes[0] +=((cmph_uint32)k[2]<<16); - case 2: - hashes[0] +=((cmph_uint32)k[1]<<8); - case 1: - hashes[0] +=(cmph_uint8)k[0]; - /* case 0: nothing left to add */ - } - mix(hashes[0],hashes[1],hashes[2]); -} - -cmph_uint32 MPHTable::select_query(select_t* sel, cmph_uint32 one_idx) { - cmph_uint8* bits_table = sel->bits_vec; - cmph_uint32* select_table = sel->select_table; - - cmph_uint32 vec_bit_idx, vec_byte_idx; - cmph_uint32 part_sum, old_part_sum; - - vec_bit_idx = select_table[one_idx >> NBITS_STEP_SELECT_TABLE]; // one_idx >> NBITS_STEP_SELECT_TABLE = one_idx/STEP_SELECT_TABLE - vec_byte_idx = vec_bit_idx >> 3; // vec_bit_idx / 8 - - one_idx &= MASK_STEP_SELECT_TABLE; // one_idx %= STEP_SELECT_TABLE == one_idx &= MASK_STEP_SELECT_TABLE - one_idx += rank_lookup_table[bits_table[vec_byte_idx] & ((1 << (vec_bit_idx & 0x7)) - 1)]; - part_sum = 0; - - do { - old_part_sum = part_sum; - part_sum += rank_lookup_table[bits_table[vec_byte_idx]]; - vec_byte_idx++; - } while (part_sum <= one_idx); - return select_lookup_table[bits_table[vec_byte_idx - 1]][one_idx - old_part_sum] + ((vec_byte_idx-1) << 3); -} - -/* -rank_lookup_table[i] simply gives the number of bits set to one in the byte of value i. -For example if i = 01010101 in binary then we have : -rank_lookup_table[i] = 4 -*/ - -static cmph_uint8 rank_lookup_table[256] ={ - 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 -, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 -, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 -, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 -, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 -, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 -, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 -, 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8 - }; - -/* -select_lookup_table[i][j] simply gives the index of the j'th bit set to one in the byte of value i. -For example if i=01010101 in binary then we have : -select_lookup_table[i][0] = 0, the first bit set to one is at position 0 -select_lookup_table[i][1] = 2, the second bit set to one is at position 2 -select_lookup_table[i][2] = 4, the third bit set to one is at position 4 -select_lookup_table[i][3] = 6, the fourth bit set to one is at position 6 -select_lookup_table[i][4] = 255, there is no more than 4 bits set to one in i, so we return escape value 255. -*/ -static cmph_uint8 select_lookup_table[256][8]={ -{ 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 255 , 255 , 255 , 255 , 255 } , -{ 3 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 255 , 255 , 255 , 255 } , -{ 4 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 255 , 255 , 255 , 255 } , -{ 3 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 255 , 255 , 255 , 255 } , -{ 2 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 255 , 255 , 255 } , -{ 5 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 255 , 255 , 255 , 255 } , -{ 3 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 255 , 255 , 255 , 255 } , -{ 2 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 255 , 255 , 255 } , -{ 4 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 255 , 255 , 255 , 255 } , -{ 2 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 255 , 255 , 255 } , -{ 3 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 255 , 255 , 255 } , -{ 2 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 5 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 255 , 255 } , -{ 6 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 6 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 6 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 6 , 255 , 255 , 255 , 255 } , -{ 3 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 6 , 255 , 255 , 255 , 255 } , -{ 2 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 6 , 255 , 255 , 255 } , -{ 4 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 6 , 255 , 255 , 255 , 255 } , -{ 2 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 6 , 255 , 255 , 255 } , -{ 3 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 6 , 255 , 255 , 255 } , -{ 2 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 6 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 6 , 255 , 255 } , -{ 5 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 6 , 255 , 255 , 255 , 255 } , -{ 2 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 6 , 255 , 255 , 255 } , -{ 3 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 6 , 255 , 255 , 255 } , -{ 2 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 6 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 6 , 255 , 255 } , -{ 4 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 6 , 255 , 255 , 255 } , -{ 2 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 6 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 6 , 255 , 255 } , -{ 3 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 6 , 255 , 255 } , -{ 2 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 6 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 5 , 6 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 255 } , -{ 7 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 2 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 7 , 255 , 255 , 255 , 255 } , -{ 3 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 7 , 255 , 255 , 255 , 255 } , -{ 2 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 7 , 255 , 255 , 255 } , -{ 4 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 7 , 255 , 255 , 255 , 255 } , -{ 2 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 7 , 255 , 255 , 255 } , -{ 3 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 7 , 255 , 255 , 255 } , -{ 2 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 7 , 255 , 255 } , -{ 5 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 7 , 255 , 255 , 255 , 255 } , -{ 2 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 7 , 255 , 255 , 255 } , -{ 3 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 7 , 255 , 255 , 255 } , -{ 2 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 7 , 255 , 255 } , -{ 4 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 7 , 255 , 255 , 255 } , -{ 2 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 7 , 255 , 255 } , -{ 3 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 7 , 255 , 255 } , -{ 2 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 7 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 5 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 7 , 255 } , -{ 6 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , -{ 1 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 6 , 7 , 255 , 255 , 255 , 255 } , -{ 2 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 6 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 2 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 6 , 7 , 255 , 255 , 255 } , -{ 3 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 6 , 7 , 255 , 255 , 255 } , -{ 2 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 3 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 6 , 7 , 255 , 255 } , -{ 4 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 6 , 7 , 255 , 255 , 255 } , -{ 2 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 6 , 7 , 255 , 255 } , -{ 3 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 6 , 7 , 255 , 255 } , -{ 2 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 6 , 7 , 255 , 255 } , -{ 1 , 2 , 3 , 4 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 6 , 7 , 255 } , -{ 5 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , -{ 1 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 6 , 7 , 255 , 255 , 255 } , -{ 2 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 2 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 6 , 7 , 255 , 255 } , -{ 3 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 6 , 7 , 255 , 255 } , -{ 2 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 6 , 7 , 255 , 255 } , -{ 1 , 2 , 3 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 6 , 7 , 255 } , -{ 4 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , -{ 1 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 6 , 7 , 255 , 255 } , -{ 2 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 6 , 7 , 255 , 255 } , -{ 1 , 2 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 6 , 7 , 255 } , -{ 3 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , -{ 1 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 6 , 7 , 255 } , -{ 2 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 6 , 7 , 255 } , -{ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 } }; - -cmph_uint32 MPHTable::compressed_seq_query(compressed_seq_t * cs, cmph_uint32 idx) -{ - cmph_uint32 enc_idx, enc_length; - cmph_uint32 rems_mask; - cmph_uint32 stored_value; - cmph_uint32 sel_res; - - assert(idx < cs->n); // FABIANO ADDED - - rems_mask = (1U << cs->rem_r) - 1U; - - if(idx == 0) { - enc_idx = 0; - sel_res = select_query(&cs->sel, idx); - } else { - sel_res = select_query(&cs->sel, idx - 1); - enc_idx = (sel_res - (idx - 1)) << cs->rem_r; - enc_idx += get_bits_value(cs->length_rems, idx-1, cs->rem_r, rems_mask); - sel_res = select_next_query(&cs->sel, sel_res); - }; - - enc_length = (sel_res - idx) << cs->rem_r; - enc_length += get_bits_value(cs->length_rems, idx, cs->rem_r, rems_mask); - enc_length -= enc_idx; - if(enc_length == 0) return 0; - - stored_value = get_bits_at_pos(cs->store_table, enc_idx, enc_length); - return stored_value + ((1U << enc_length) - 1U); -};