Removed c++ stuff from the c master branch.
This commit is contained in:
parent
2a68958c1f
commit
084a940c2a
@ -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
|
|
@ -1,159 +0,0 @@
|
|||||||
#include <hash_map>
|
|
||||||
#include <vector>
|
|
||||||
#include <utility> // for std::pair
|
|
||||||
|
|
||||||
#include <cmph.h>
|
|
||||||
|
|
||||||
// Save on repetitive typing.
|
|
||||||
#define CMPH_TMPL_SPEC template <class Key, class Data, class HashFcn, class EqualKey, class Alloc>
|
|
||||||
#define CMPH_CLASS_SPEC cmph_hash_map<Key, Data, HashFcn, EqualKey, Alloc>
|
|
||||||
#define CMPH_METHOD_DECL(r, m) CMPH_TMPL_SPEC typename CMPH_CLASS_SPEC::r CMPH_CLASS_SPEC::m
|
|
||||||
|
|
||||||
template <class Key, class Data, class HashFcn = __gnu_cxx::hash<Key>, class EqualKey = std::equal_to<Key>, class Alloc = std::allocator<Data> >
|
|
||||||
class cmph_hash_map {
|
|
||||||
public:
|
|
||||||
typedef Key key_type;
|
|
||||||
typedef Data data_type;
|
|
||||||
typedef std::pair<Key, Data> value_type;
|
|
||||||
typedef HashFcn hasher;
|
|
||||||
typedef EqualKey key_equal;
|
|
||||||
|
|
||||||
typedef typename std::vector<value_type>::pointer pointer;
|
|
||||||
typedef typename std::vector<value_type>::reference reference;
|
|
||||||
typedef typename std::vector<value_type>::const_reference const_reference;
|
|
||||||
typedef typename std::vector<value_type>::size_type size_type;
|
|
||||||
typedef typename std::vector<value_type>::difference_type difference_type;
|
|
||||||
typedef typename std::vector<value_type>::iterator iterator;
|
|
||||||
typedef typename std::vector<value_type>::const_iterator const_iterator;
|
|
||||||
|
|
||||||
// For making macros simpler.
|
|
||||||
typedef void void_type;
|
|
||||||
typedef bool bool_type;
|
|
||||||
typedef std::pair<iterator, bool> 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<iterator, bool> 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<value_type> values_;
|
|
||||||
cmph_t* cmph_;
|
|
||||||
typedef typename __gnu_cxx::hash_map<Key, Data, HashFcn, EqualKey, Alloc> 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<value_type> new_values(values_.size());
|
|
||||||
for (int i = 0; i < values_.size(); ++i) {
|
|
||||||
size_type id = cmph_search(cmph_, reinterpret_cast<const char*>(&(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<const char*>(&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<const char*>(&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;
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
#include "cmph_hash_map.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
cmph_hash_map<int, int> h;
|
|
||||||
h.insert(std::make_pair(-1,-1));
|
|
||||||
for (cmph_hash_map<int, int>::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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
#include <numerical_limits>
|
|
||||||
|
|
||||||
template <int n, int mask = 1 << 7> struct bitcount {
|
|
||||||
enum { value = (n & mask ? 1:0) + bitcount<n, mask >> 1>::value };
|
|
||||||
};
|
|
||||||
template <int n> struct bitcount<n, 0> { enum { value = 0 }; };
|
|
||||||
|
|
||||||
template <int n, int current, int mask = 1 << 8> struct bitposition {
|
|
||||||
enum
|
|
||||||
|
|
||||||
template <int index = 0, typename op> class CompileTimeByteTable {
|
|
||||||
public:
|
|
||||||
CompileTimeByteTable : current(op<index>::value) { }
|
|
||||||
int operator[] (int i) { return *(¤t + i); }
|
|
||||||
private:
|
|
||||||
unsigned char current;
|
|
||||||
CompileTimeByteTable<next> 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<char>::max;
|
|
@ -1,299 +0,0 @@
|
|||||||
|
|
||||||
template <class Key>
|
|
||||||
class MPHTable {
|
|
||||||
public:
|
|
||||||
typedef Key key_type;
|
|
||||||
|
|
||||||
MPHTable(cmph_t* mphf);
|
|
||||||
~MPHTable();
|
|
||||||
|
|
||||||
template <class Iterator>
|
|
||||||
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<chd_ph_data_t*>(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<const char*>(&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);
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user