ClickHouse/dbms/src/Interpreters/tests/hash_map3.cpp

92 lines
1.9 KiB
C++
Raw Normal View History

2014-02-02 10:42:56 +00:00
#include <iostream>
#define DBMS_HASH_MAP_DEBUG_RESIZES
#define DBMS_HASH_MAP_COUNT_COLLISIONS
#include <string.h>
#include <malloc.h>
#include <utility>
#include <DB/Core/Types.h>
#include <DB/Core/Exception.h>
#include <DB/Core/ErrorCodes.h>
2014-02-03 03:09:50 +00:00
#include <DB/IO/ReadHelpers.h>
#include <DB/Core/StringRef.h>
2014-02-02 10:42:56 +00:00
#include <DB/Common/HashTable/HashMap.h>
2014-02-02 10:42:56 +00:00
template
<
typename Key,
typename Mapped,
typename Hash = DefaultHash<Key>,
typename Grower = HashTableGrower,
typename Allocator = HashTableAllocator
2014-02-02 10:42:56 +00:00
>
class HashMapWithDump : public HashMap<Key, Mapped, Hash, Grower, Allocator>
2014-02-02 10:42:56 +00:00
{
public:
void dump() const
{
for (size_t i = 0; i < this->grower.bufSize(); ++i)
2014-02-03 03:09:50 +00:00
{
if (this->buf[i].isZero(*this))
2014-02-03 03:09:50 +00:00
std::cerr << "[ ]";
else
std::cerr << '[' << this->buf[i].getValue().first.data << ", " << this->buf[i].getValue().second << ']';
2014-02-03 03:09:50 +00:00
}
2014-02-02 10:42:56 +00:00
std::cerr << std::endl;
}
};
struct TrivialHash
{
size_t operator() (UInt64 x) const { return x; }
size_t operator() (StringRef x) const { return DB::parse<UInt64>(x.data); }
2014-02-02 10:42:56 +00:00
};
struct Grower : public HashTableGrower
2014-02-02 10:42:56 +00:00
{
static const size_t initial_size_degree = 2;
Grower() { size_degree = initial_size_degree; }
void increaseSize() { ++size_degree; }
2014-02-02 10:42:56 +00:00
};
int main(int argc, char ** argv)
{
typedef HashMapWithDump<
StringRef,
2014-02-03 03:09:50 +00:00
UInt64,
TrivialHash,
Grower,
HashTableAllocatorWithStackMemory<4 * 24> > Map;
2014-02-02 10:42:56 +00:00
Map map;
map.dump();
2014-02-03 03:09:50 +00:00
std::cerr << "size: " << map.size() << std::endl;
map[StringRef("1", 1)] = 1;
2014-02-02 10:42:56 +00:00
map.dump();
2014-02-03 03:09:50 +00:00
std::cerr << "size: " << map.size() << std::endl;
map[StringRef("9", 1)] = 1;
2014-02-02 10:42:56 +00:00
map.dump();
2014-02-03 03:09:50 +00:00
std::cerr << "size: " << map.size() << std::endl;
2014-02-02 10:42:56 +00:00
std::cerr << "Collisions: " << map.getCollisions() << std::endl;
map[StringRef("3", 1)] = 2;
2014-02-02 10:42:56 +00:00
map.dump();
2014-02-03 03:09:50 +00:00
std::cerr << "size: " << map.size() << std::endl;
2014-02-02 10:42:56 +00:00
std::cerr << "Collisions: " << map.getCollisions() << std::endl;
for (auto x : map)
2014-02-03 03:09:50 +00:00
std::cerr << x.first.toString() << " -> " << x.second << std::endl;
2014-02-02 10:42:56 +00:00
return 0;
}