mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
[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:
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user