Implemented serialization machinery.
This commit is contained in:
parent
5a4ba7516c
commit
c630eb2a70
@ -44,10 +44,10 @@ MPHTable::~MPHTable() {
|
||||
}
|
||||
|
||||
void MPHTable::clear() {
|
||||
delete [] g_;
|
||||
if (!deserialized_) delete [] g_;
|
||||
g_ = NULL;
|
||||
g_size_ = 0;
|
||||
delete [] ranktable_;
|
||||
if (!deserialized_) delete [] ranktable_;
|
||||
ranktable_ = NULL;
|
||||
ranktable_size_ = 0;
|
||||
// TODO(davi) implement me
|
||||
@ -115,7 +115,7 @@ void MPHTable::Assigning(
|
||||
vector<bool> marked_vertices(n_ + 1);
|
||||
// Initialize vector of half nibbles with all bits set.
|
||||
g_size_ = static_cast<uint32_t>(ceil(n_/4.0));
|
||||
delete [] g_;
|
||||
if (!deserialized_) delete [] g_;
|
||||
g_ = NULL;
|
||||
uint8_t* g = new uint8_t[g_size_];
|
||||
memset(g, std::numeric_limits<uint8_t>::max(), g_size_);
|
||||
@ -169,7 +169,7 @@ void MPHTable::Ranking() {
|
||||
uint32_t size = k_ >> 2U;
|
||||
ranktable_size_ = static_cast<uint32_t>(
|
||||
ceil(n_ / static_cast<double>(k_)));
|
||||
delete [] ranktable_;
|
||||
if (!deserialized_) delete [] ranktable_;
|
||||
ranktable_ = NULL;
|
||||
uint32_t* ranktable = new uint32_t[ranktable_size_];
|
||||
memset(ranktable, 0, ranktable_size_*sizeof(uint32_t));
|
||||
@ -228,6 +228,7 @@ bool MPHTable::deserialize(const char* serialized_memory) {
|
||||
g_ = reinterpret_cast<const uint8_t*>(serialized_memory + sizeof(MPHTable));
|
||||
ranktable_ = reinterpret_cast<const uint32_t*>(
|
||||
serialized_memory + sizeof(MPHTable) + g_size_);
|
||||
deserialized_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,8 @@ class MPHTable {
|
||||
public:
|
||||
MPHTable(double c = 1.23, uint8_t b = 7) :
|
||||
c_(c), b_(b), m_(0), n_(0), k_(0), r_(0),
|
||||
g_(NULL), g_size_(0), ranktable_(NULL), ranktable_size_(0) { }
|
||||
g_(NULL), g_size_(0), ranktable_(NULL), ranktable_size_(0),
|
||||
deserialized_(false) { }
|
||||
~MPHTable();
|
||||
|
||||
template <class SeededHashFcn, class ForwardIterator>
|
||||
@ -76,6 +77,8 @@ class MPHTable {
|
||||
// perfect hash function graph.
|
||||
uint32_t hash_seed_[3];
|
||||
|
||||
bool deserialized_;
|
||||
|
||||
static const uint8_t valuemask[];
|
||||
static void set_2bit_value(uint8_t *d, uint32_t i, uint8_t v) {
|
||||
d[(i >> 2)] &= ((v << ((i & 3) << 1)) | valuemask[i & 3]);
|
||||
@ -113,6 +116,7 @@ bool MPHTable::Reset(ForwardIterator begin, ForwardIterator end) {
|
||||
Assigning(edges, queue);
|
||||
std::vector<TriGraph::Edge>().swap(edges);
|
||||
Ranking();
|
||||
deserialized_ = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -33,5 +33,10 @@ int main(int argc, char** argv) {
|
||||
cerr << endl;
|
||||
sort(ids.begin(), ids.end());
|
||||
for (vector<int>::size_type i = 0; i < ids.size(); ++i) assert(ids[i] == static_cast<vector<int>::value_type>(i));
|
||||
|
||||
char* serialized = new char[mph_table.serialize_bytes_needed()];
|
||||
mph_table.serialize(serialized);
|
||||
SimpleMPHTable<string> other_mph_table;
|
||||
other_mph_table.deserialize(serialized);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user