[kutil] Allow for specialization in kutil::map

Restructure kutil::map to allow specialization to alter storage as well
as the public API.
This commit is contained in:
2020-09-13 15:41:03 -07:00
parent 5f27727e52
commit 245f260d67
3 changed files with 150 additions and 66 deletions

View File

@@ -1,59 +1,61 @@
#include "kutil/map.h"
#include "catch.hpp"
TEST_CASE( "map insertion", "[containers] [vector]" )
{
using clock = std::chrono::system_clock;
unsigned seed = clock::now().time_since_epoch().count();
std::default_random_engine rng {seed};
std::uniform_int_distribution<int> distrib {0, 10000};
using Catch::rng;
std::uniform_int_distribution<int> distrib {0, 10000};
TEST_CASE( "map insertion", "[containers] [map]" )
{
std::vector<int> ints;
for (int i = 0; i < 1000; ++i)
ints.push_back(i);
size_t sizes[] = {1, 2, 3, 5, 100};
for (size_t s : sizes) {
kutil::map<int, int> v;
std::vector<int> r;
std::shuffle(ints.begin(), ints.end(), rng());
for (int i = 0; i < s; ++i) {
int j = distrib(rng);
r.push_back(j);
v.insert(j, j);
v.insert(ints[i], ints[i]);
}
for (int i : r) {
int *p = v.find(i);
for (int i = 0; i < s; ++i) {
int *p = v.find(ints[i]);
CAPTURE( s );
CAPTURE( i );
CAPTURE( ints[i] );
CAPTURE( kutil::hash(ints[i]) );
CHECK( p );
CHECK( *p == i );
CHECK( *p == ints[i] );
}
}
}
TEST_CASE( "map deletion", "[containers] [vector]" )
TEST_CASE( "map deletion", "[containers] [map]" )
{
using clock = std::chrono::system_clock;
unsigned seed = clock::now().time_since_epoch().count();
std::default_random_engine rng {seed};
std::uniform_int_distribution<int> distrib {0, 10000};
std::vector<int> ints;
for (int i = 0; i < 1000; ++i)
ints.push_back(i);
size_t sizes[] = {1, 2, 3, 5, 100};
for (size_t s : sizes) {
kutil::map<int, int> v;
std::vector<int> r;
std::shuffle(ints.begin(), ints.end(), rng());
for (int i = 0; i < s; ++i) {
int j = distrib(rng);
r.push_back(j);
v.insert(j, j);
v.insert(ints[i], ints[i]);
}
for (int i = 0; i < s; i += 2) {
v.erase(r[i]);
v.erase(ints[i]);
}
for (int i = 0; i < s; ++i) {
int *p = v.find(r[i]);
int *p = v.find(ints[i]);
CAPTURE( s );
CAPTURE( i );
CAPTURE( ints[i] );
CAPTURE( kutil::hash(ints[i]) );
if ( i%2 )
CHECK( p );
else
@@ -61,3 +63,33 @@ TEST_CASE( "map deletion", "[containers] [vector]" )
}
}
}
TEST_CASE( "map with pointer vals", "[containers] [map]" )
{
kutil::map<int, int*> v;
int is[4] = { 0, 0, 0, 0 };
for (int i = 0; i < 4; ++i)
v.insert(i*7, &is[i]);
for (int i = 0; i < 4; ++i) {
int *p = v.find(i*7);
CHECK( p == &is[i] );
}
CHECK( v.find(3) == nullptr );
}
TEST_CASE( "map with uint64_t keys", "[containers] [map]" )
{
kutil::map<uint64_t, int> v;
int is[4] = { 2, 3, 5, 7 };
for (uint64_t i = 0; i < 4; ++i)
v.insert(i+1, is[i]);
for (uint64_t i = 0; i < 4; ++i) {
int *p = v.find(i+1);
CHECK( *p == is[i] );
}
CHECK( v.find(30) == nullptr );
}