#include #define DBMS_HASH_MAP_DEBUG_RESIZES #define DBMS_HASH_MAP_COUNT_COLLISIONS #include #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 TrivialHash { size_t operator() (UInt64 x) const { return x; } size_t operator() (StringRef x) const { return DB::parse(x.data); } }; struct Grower : public HashTableGrower { static const size_t initial_size_degree = 2; Grower() { size_degree = initial_size_degree; } void increaseSize() { ++size_degree; } }; int main(int argc, char ** argv) { typedef HashMapWithDump< StringRef, UInt64, TrivialHash, Grower, HashTableAllocatorWithStackMemory<4 * 24> > Map; 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.first.toString() << " -> " << x.second << std::endl; return 0; }