#include #define DBMS_HASH_MAP_DEBUG_RESIZES #define DBMS_HASH_MAP_COUNT_COLLISIONS #include #include #include #include #include #include #include #include template < typename Key, typename Mapped, typename Hash = DefaultHash, typename Grower = HashTableGrower<>, typename Allocator = HashTableAllocator > class HashMapWithDump : public HashMap { public: void dump() const { for (size_t i = 0; i < this->grower.bufSize(); ++i) { if (this->buf[i].isZero(*this)) std::cerr << "[ ]"; else std::cerr << '[' << this->buf[i].getValue().first.data << ", " << this->buf[i].getValue().second << ']'; } std::cerr << std::endl; } }; struct SimpleHash { size_t operator() (UInt64 x) const { return x; } size_t operator() (StringRef x) const { return DB::parse(x.data); } }; struct Grower : public HashTableGrower<2> { void increaseSize() { ++size_degree; } }; int main(int, char **) { using Map = HashMapWithDump< StringRef, UInt64, SimpleHash, Grower, HashTableAllocatorWithStackMemory<4 * 24>>; Map map; map.dump(); std::cerr << "size: " << map.size() << std::endl; map[StringRef("1", 1)] = 1; map.dump(); std::cerr << "size: " << map.size() << std::endl; map[StringRef("9", 1)] = 1; map.dump(); std::cerr << "size: " << map.size() << std::endl; std::cerr << "Collisions: " << map.getCollisions() << std::endl; map[StringRef("3", 1)] = 2; map.dump(); std::cerr << "size: " << map.size() << std::endl; std::cerr << "Collisions: " << map.getCollisions() << std::endl; for (auto x : map) std::cerr << x.getKey().toString() << " -> " << x.getMapped() << std::endl; return 0; }