Use unordered_map instead of map for cache
This commit is contained in:
parent
b41853cd00
commit
4a5416dbec
@ -3,7 +3,7 @@
|
||||
#define MESSMER_BLOCKSTORE_IMPLEMENTATIONS_CACHING2_MAP_H_
|
||||
|
||||
#include <memory>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <cassert>
|
||||
|
||||
namespace blockstore {
|
||||
@ -60,7 +60,7 @@ private:
|
||||
}
|
||||
|
||||
//TODO Double indirection unique_ptr<Entry> and Entry has unique_ptr<Value>. Necessary?
|
||||
std::map<Key, std::unique_ptr<Entry>> _entries;
|
||||
std::unordered_map<Key, std::unique_ptr<Entry>> _entries;
|
||||
Entry _sentinel;
|
||||
};
|
||||
|
||||
|
@ -38,9 +38,6 @@ private:
|
||||
template<int SIZE> bool operator==(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs);
|
||||
template<int SIZE> bool operator!=(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs);
|
||||
|
||||
//operator< is defined, so that FixedSizeData objects can be used in std::map and std::set
|
||||
template<int SIZE> bool operator<(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs);
|
||||
|
||||
// ----- Implementation -----
|
||||
|
||||
template<int SIZE> constexpr unsigned int FixedSizeData<SIZE>::BINARY_LENGTH;
|
||||
@ -110,11 +107,6 @@ bool operator!=(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs)
|
||||
return !operator==(lhs, rhs);
|
||||
}
|
||||
|
||||
template<int SIZE>
|
||||
bool operator<(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs) {
|
||||
return 0 > std::memcmp(lhs.data(), rhs.data(), FixedSizeData<SIZE>::BINARY_LENGTH);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
17
utils/Key.h
17
utils/Key.h
@ -12,4 +12,21 @@ using Key = FixedSizeData<16>;
|
||||
|
||||
}
|
||||
|
||||
namespace std {
|
||||
//Allow using blockstore::Key in std::unordered_map / std::unordered_set
|
||||
template <> struct hash<blockstore::Key> {
|
||||
size_t operator()(const blockstore::Key &key) const {
|
||||
//Keys are random, so it is enough to use the first few bytes as a hash
|
||||
return *(size_t*)(key.data());
|
||||
}
|
||||
};
|
||||
|
||||
//Allow using blockstore::Key in std::map / std::set
|
||||
template <> struct less<blockstore::Key> {
|
||||
bool operator()(const blockstore::Key &lhs, const blockstore::Key &rhs) const {
|
||||
return 0 > std::memcmp(lhs.data(), rhs.data(), blockstore::Key::BINARY_LENGTH);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user