[project] Lose the battle between tabs & spaces

I'm a tabs guy. I like tabs, it's an elegant way to represent
indentation instead of brute-forcing it. But I have to admit that the
world seems to be going towards spaces, and tooling tends not to play
nice with tabs. So here we go, changing the whole repo to spaces since
I'm getting tired of all the inconsistent formatting.
This commit is contained in:
F in Chat for Tabs
2021-08-01 17:46:16 -07:00
committed by Justin C. Miller
parent d36b2d8057
commit 8f529046a9
161 changed files with 7958 additions and 7958 deletions

View File

@@ -5,17 +5,17 @@ using namespace kutil;
TEST_CASE( "constexpr hash", "[hash]" )
{
const unsigned hash1 = static_cast<unsigned>("hash1!"_h);
CHECK(hash1 == 210);
const unsigned hash1 = static_cast<unsigned>("hash1!"_h);
CHECK(hash1 == 210);
const unsigned hash2 = static_cast<unsigned>("hash1!"_h);
CHECK(hash1 == hash2);
const unsigned hash2 = static_cast<unsigned>("hash1!"_h);
CHECK(hash1 == hash2);
const unsigned hash3 = static_cast<unsigned>("not hash1!"_h);
CHECK(hash1 != hash3);
CHECK(hash3 == 37);
const unsigned hash3 = static_cast<unsigned>("not hash1!"_h);
CHECK(hash1 != hash3);
CHECK(hash3 == 37);
const unsigned hash4 = static_cast<unsigned>("another thing that's longer"_h);
CHECK(hash1 != hash4);
CHECK(hash4 == 212);
const unsigned hash4 = static_cast<unsigned>("another thing that's longer"_h);
CHECK(hash1 != hash4);
CHECK(hash4 == 212);
}

View File

@@ -1,13 +1,13 @@
#pragma once
struct unsortableT {
int value;
int value;
};
struct sortableT {
int value;
int compare(const sortableT &other) const {
return value - other.value;
}
int value;
int compare(const sortableT &other) const {
return value - other.value;
}
};

View File

@@ -26,169 +26,169 @@ extern bool ASSERT_EXPECTED;
extern bool ASSERT_HAPPENED;
std::vector<size_t> sizes = {
16000, 8000, 4000, 4000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 150,
150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 48, 48, 48, 13 };
16000, 8000, 4000, 4000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 150,
150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 48, 48, 48, 13 };
void segfault_handler(int signum, siginfo_t *info, void *ctxp)
{
uintptr_t start = reinterpret_cast<uintptr_t>(mem_base);
uintptr_t end = start + mem_size;
uintptr_t addr = reinterpret_cast<uintptr_t>(info->si_addr);
uintptr_t start = reinterpret_cast<uintptr_t>(mem_base);
uintptr_t end = start + mem_size;
uintptr_t addr = reinterpret_cast<uintptr_t>(info->si_addr);
if (addr < start || addr >= end) {
CAPTURE( start );
CAPTURE( end );
CAPTURE( addr );
FAIL("Segfaulted outside memory area");
}
if (addr < start || addr >= end) {
CAPTURE( start );
CAPTURE( end );
CAPTURE( addr );
FAIL("Segfaulted outside memory area");
}
signalled_at = info->si_addr;
signalled += 1;
if (mprotect(signalled_at, max_block, PROT_READ|PROT_WRITE)) {
perror("mprotect");
exit(100);
}
signalled_at = info->si_addr;
signalled += 1;
if (mprotect(signalled_at, max_block, PROT_READ|PROT_WRITE)) {
perror("mprotect");
exit(100);
}
}
TEST_CASE( "Buddy blocks tests", "[memory buddy]" )
{
using clock = std::chrono::system_clock;
unsigned seed = clock::now().time_since_epoch().count();
std::default_random_engine rng(seed);
using clock = std::chrono::system_clock;
unsigned seed = clock::now().time_since_epoch().count();
std::default_random_engine rng(seed);
mem_base = aligned_alloc(max_block, mem_size);
mem_base = aligned_alloc(max_block, mem_size);
// Catch segfaults so we can track memory access
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_NODEFER|SA_SIGINFO;
sigact.sa_sigaction = segfault_handler;
sigaction(SIGSEGV, &sigact, nullptr);
// Catch segfaults so we can track memory access
struct sigaction sigact;
memset(&sigact, 0, sizeof(sigact));
sigemptyset(&sigact.sa_mask);
sigact.sa_flags = SA_NODEFER|SA_SIGINFO;
sigact.sa_sigaction = segfault_handler;
sigaction(SIGSEGV, &sigact, nullptr);
// Protect our memory arena so we trigger out fault handler
REQUIRE( mprotect(mem_base, max_block*4, PROT_NONE) == 0 );
// Protect our memory arena so we trigger out fault handler
REQUIRE( mprotect(mem_base, max_block*4, PROT_NONE) == 0 );
heap_allocator mm(
reinterpret_cast<uintptr_t>(mem_base),
max_block * 4);
heap_allocator mm(
reinterpret_cast<uintptr_t>(mem_base),
max_block * 4);
// Initial creation should not have allocated
CHECK( signalled == 0 );
signalled = 0;
// Initial creation should not have allocated
CHECK( signalled == 0 );
signalled = 0;
// Allocating too much should assert
ASSERT_EXPECTED = true;
void *p = mm.allocate(max_block - hs + 1);
REQUIRE( ASSERT_HAPPENED );
ASSERT_HAPPENED = false;
// Allocating too much should assert
ASSERT_EXPECTED = true;
void *p = mm.allocate(max_block - hs + 1);
REQUIRE( ASSERT_HAPPENED );
ASSERT_HAPPENED = false;
// Allocating should signal just at the first page.
p = mm.allocate(max_block - hs);
CHECK( p == offset_pointer(mem_base, hs) );
CHECK( signalled == 1 );
CHECK( signalled_at == mem_base );
signalled = 0;
// Allocating should signal just at the first page.
p = mm.allocate(max_block - hs);
CHECK( p == offset_pointer(mem_base, hs) );
CHECK( signalled == 1 );
CHECK( signalled_at == mem_base );
signalled = 0;
// Freeing and allocating should not allocate
mm.free(p);
p = mm.allocate(max_block - hs);
CHECK( p == offset_pointer(mem_base, hs) );
CHECK( signalled == 0 );
signalled = 0;
// Freeing and allocating should not allocate
mm.free(p);
p = mm.allocate(max_block - hs);
CHECK( p == offset_pointer(mem_base, hs) );
CHECK( signalled == 0 );
signalled = 0;
mm.free(p);
CHECK( signalled == 0 );
signalled = 0;
mm.free(p);
CHECK( signalled == 0 );
signalled = 0;
// Blocks should be:
// 22: 0-4M
// Blocks should be:
// 22: 0-4M
std::vector<void *> allocs(6);
for (int i = 0; i < 6; ++i)
allocs[i] = mm.allocate(150); // size 8
std::vector<void *> allocs(6);
for (int i = 0; i < 6; ++i)
allocs[i] = mm.allocate(150); // size 8
// Should not have grown
CHECK( signalled == 0 );
signalled = 0;
// Should not have grown
CHECK( signalled == 0 );
signalled = 0;
// Blocks should be:
// 22: [0-4M]
// 21: [0-2M], 2-4M
// 20: [0-1M], 1-2M
// 19: [0-512K], 512K-1M
// 18: [0-256K], 256-512K
// 17: [0-128K], 128-256K
// 16: [0-64K], 64-128K
// 15: [0-32K], 32K-64K
// 14: [0-16K], 16K-32K
// 13: [0-8K], 8K-16K
// 12: [0-4K], 4K-8K
// 11: [0-2K], 2K-4K
// 10: [0-1K, 1-2K]
// 9: [0, 512, 1024], 1536
// 8: [0, 256, 512, 768, 1024, 1280]
// Blocks should be:
// 22: [0-4M]
// 21: [0-2M], 2-4M
// 20: [0-1M], 1-2M
// 19: [0-512K], 512K-1M
// 18: [0-256K], 256-512K
// 17: [0-128K], 128-256K
// 16: [0-64K], 64-128K
// 15: [0-32K], 32K-64K
// 14: [0-16K], 16K-32K
// 13: [0-8K], 8K-16K
// 12: [0-4K], 4K-8K
// 11: [0-2K], 2K-4K
// 10: [0-1K, 1-2K]
// 9: [0, 512, 1024], 1536
// 8: [0, 256, 512, 768, 1024, 1280]
// We have free memory at 1526 and 2K, but we should get 4K
void *big = mm.allocate(4000); // size 12
// We have free memory at 1526 and 2K, but we should get 4K
void *big = mm.allocate(4000); // size 12
CHECK( signalled == 0 );
signalled = 0;
CHECK( signalled == 0 );
signalled = 0;
REQUIRE( big == offset_pointer(mem_base, 4096 + hs) );
mm.free(big);
REQUIRE( big == offset_pointer(mem_base, 4096 + hs) );
mm.free(big);
// free up 512
mm.free(allocs[3]);
mm.free(allocs[4]);
// free up 512
mm.free(allocs[3]);
mm.free(allocs[4]);
// Blocks should be:
// ...
// 9: [0, 512, 1024], 1536
// 8: [0, 256, 512], 768, 1024, [1280]
// Blocks should be:
// ...
// 9: [0, 512, 1024], 1536
// 8: [0, 256, 512], 768, 1024, [1280]
// A request for a 512-block should not cross the buddy divide
big = mm.allocate(500); // size 9
REQUIRE( big >= offset_pointer(mem_base, 1536 + hs) );
mm.free(big);
// A request for a 512-block should not cross the buddy divide
big = mm.allocate(500); // size 9
REQUIRE( big >= offset_pointer(mem_base, 1536 + hs) );
mm.free(big);
mm.free(allocs[0]);
mm.free(allocs[1]);
mm.free(allocs[2]);
mm.free(allocs[5]);
allocs.clear();
mm.free(allocs[0]);
mm.free(allocs[1]);
mm.free(allocs[2]);
mm.free(allocs[5]);
allocs.clear();
std::shuffle(sizes.begin(), sizes.end(), rng);
std::shuffle(sizes.begin(), sizes.end(), rng);
allocs.reserve(sizes.size());
for (size_t size : sizes)
allocs.push_back(mm.allocate(size));
allocs.reserve(sizes.size());
for (size_t size : sizes)
allocs.push_back(mm.allocate(size));
std::shuffle(allocs.begin(), allocs.end(), rng);
for (void *p: allocs)
mm.free(p);
allocs.clear();
std::shuffle(allocs.begin(), allocs.end(), rng);
for (void *p: allocs)
mm.free(p);
allocs.clear();
big = mm.allocate(max_block / 2 + 1);
big = mm.allocate(max_block / 2 + 1);
// If everything was freed / joined correctly, that should not have allocated
CHECK( signalled == 0 );
signalled = 0;
// If everything was freed / joined correctly, that should not have allocated
CHECK( signalled == 0 );
signalled = 0;
// And we should have gotten back the start of memory
CHECK( big == offset_pointer(mem_base, hs) );
// And we should have gotten back the start of memory
CHECK( big == offset_pointer(mem_base, hs) );
// Allocating again should signal at the next page.
void *p2 = mm.allocate(max_block - hs);
CHECK( p2 == offset_pointer(mem_base, max_block + hs) );
CHECK( signalled == 1 );
CHECK( signalled_at == offset_pointer(mem_base, max_block) );
signalled = 0;
// Allocating again should signal at the next page.
void *p2 = mm.allocate(max_block - hs);
CHECK( p2 == offset_pointer(mem_base, max_block + hs) );
CHECK( signalled == 1 );
CHECK( signalled_at == offset_pointer(mem_base, max_block) );
signalled = 0;
mm.free(p2);
CHECK( signalled == 0 );
signalled = 0;
mm.free(p2);
CHECK( signalled == 0 );
signalled = 0;
free(mem_base);
free(mem_base);
}

View File

@@ -13,142 +13,142 @@ const int test_list_size = 100;
template <typename T>
class ListVectorCompare :
public Catch::MatcherBase<std::vector<list_node<T>>>
public Catch::MatcherBase<std::vector<list_node<T>>>
{
public:
using item = list_node<T>;
using vector = std::vector<item>;
using item = list_node<T>;
using vector = std::vector<item>;
ListVectorCompare(const linked_list<T> &list, bool reversed) :
m_list(list), m_reverse(reversed) {}
ListVectorCompare(const linked_list<T> &list, bool reversed) :
m_list(list), m_reverse(reversed) {}
virtual bool match (vector const& vec) const override
{
size_t index = m_reverse ? vec.size() - 1 : 0;
for (const T *i : m_list) {
if (i != &vec[index]) return false;
index += m_reverse ? -1 : 1;
}
return true;
}
virtual bool match (vector const& vec) const override
{
size_t index = m_reverse ? vec.size() - 1 : 0;
for (const T *i : m_list) {
if (i != &vec[index]) return false;
index += m_reverse ? -1 : 1;
}
return true;
}
virtual std::string describe() const override
{
return "is the same as the given linked list";
}
virtual std::string describe() const override
{
return "is the same as the given linked list";
}
private:
const linked_list<T> &m_list;
bool m_reverse;
const linked_list<T> &m_list;
bool m_reverse;
};
template <typename T>
class IsSorted :
public Catch::MatcherBase<linked_list<T>>
public Catch::MatcherBase<linked_list<T>>
{
public:
using item = list_node<T>;
using list = linked_list<T>;
using item = list_node<T>;
using list = linked_list<T>;
IsSorted() {}
IsSorted() {}
virtual bool match (list const& l) const override
{
int big = std::numeric_limits<int>::min();
for (const T *i : l) {
if (i->value < big) return false;
big = i->value;
}
return true;
}
virtual bool match (list const& l) const override
{
int big = std::numeric_limits<int>::min();
for (const T *i : l) {
if (i->value < big) return false;
big = i->value;
}
return true;
}
virtual std::string describe() const override
{
return "is sorted";
}
virtual std::string describe() const override
{
return "is sorted";
}
};
template <typename T>
class ListContainsMatcher :
public Catch::MatcherBase<linked_list<T>>
public Catch::MatcherBase<linked_list<T>>
{
public:
using item = list_node<T>;
using list = linked_list<T>;
using item = list_node<T>;
using list = linked_list<T>;
ListContainsMatcher(const item &needle) : m_needle(needle) {}
ListContainsMatcher(const item &needle) : m_needle(needle) {}
virtual bool match (list const& l) const override
{
for (const T *i : l)
if (i == &m_needle) return true;
return false;
}
virtual bool match (list const& l) const override
{
for (const T *i : l)
if (i == &m_needle) return true;
return false;
}
virtual std::string describe() const override
{
return "contains the given item";
}
virtual std::string describe() const override
{
return "contains the given item";
}
const item &m_needle;
const item &m_needle;
};
template <typename T>
ListVectorCompare<T> IsSameAsList(const linked_list<T> &list, bool reversed = false)
{
return ListVectorCompare<T>(list, reversed);
return ListVectorCompare<T>(list, reversed);
}
template <typename T>
ListContainsMatcher<T> ListContains(const list_node<T> &item)
{
return ListContainsMatcher<T>(item);
return ListContainsMatcher<T>(item);
}
TEST_CASE( "Linked list tests", "[containers] [list]" )
{
linked_list<unsortableT> ulist;
linked_list<unsortableT> ulist;
int value = 0;
std::vector<list_node<unsortableT>> unsortables(test_list_size);
for (auto &i : unsortables) {
i.value = value++;
ulist.push_back(&i);
}
CHECK( ulist.length() == test_list_size );
CHECK_THAT( unsortables, IsSameAsList(ulist) );
int value = 0;
std::vector<list_node<unsortableT>> unsortables(test_list_size);
for (auto &i : unsortables) {
i.value = value++;
ulist.push_back(&i);
}
CHECK( ulist.length() == test_list_size );
CHECK_THAT( unsortables, IsSameAsList(ulist) );
linked_list<unsortableT> ulist_reversed;
linked_list<unsortableT> ulist_reversed;
for (auto &i : unsortables) {
ulist.remove(&i);
ulist_reversed.push_front(&i);
}
for (auto &i : unsortables) {
ulist.remove(&i);
ulist_reversed.push_front(&i);
}
CHECK( ulist_reversed.length() == test_list_size );
CHECK_THAT( unsortables, IsSameAsList(ulist_reversed, true) );
CHECK( ulist_reversed.length() == test_list_size );
CHECK_THAT( unsortables, IsSameAsList(ulist_reversed, true) );
auto &removed = unsortables[test_list_size / 2];
ulist_reversed.remove(&removed);
CHECK( ulist_reversed.length() == test_list_size - 1 );
CHECK_THAT( ulist_reversed, !ListContains(removed) );
auto &removed = unsortables[test_list_size / 2];
ulist_reversed.remove(&removed);
CHECK( ulist_reversed.length() == test_list_size - 1 );
CHECK_THAT( ulist_reversed, !ListContains(removed) );
}
TEST_CASE( "Sorted list tests", "[containers] [list]" )
{
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> gen(1, 1000);
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> gen(1, 1000);
linked_list<sortableT> slist;
CHECK( slist.length() == 0 );
linked_list<sortableT> slist;
CHECK( slist.length() == 0 );
std::vector<list_node<sortableT>> sortables(test_list_size);
for (auto &i : sortables) {
i.value = gen(rng);
slist.sorted_insert(&i);
}
CHECK( slist.length() == test_list_size );
CHECK_THAT( slist, IsSorted<sortableT>() );
std::vector<list_node<sortableT>> sortables(test_list_size);
for (auto &i : sortables) {
i.value = gen(rng);
slist.sorted_insert(&i);
}
CHECK( slist.length() == test_list_size );
CHECK_THAT( slist, IsSorted<sortableT>() );
}

View File

@@ -14,19 +14,19 @@ log::area_t hash2 = "test_area2"_h;
TEST_CASE( "logger writing", "[logger]" )
{
log::logger logger(test_log_buffer, sizeof(test_log_buffer));
logger.register_area(hash1, name1, log::level::debug);
logger.register_area(hash2, name2, log::level::debug);
CHECK( hash1 != hash2 );
log::logger logger(test_log_buffer, sizeof(test_log_buffer));
logger.register_area(hash1, name1, log::level::debug);
logger.register_area(hash2, name2, log::level::debug);
CHECK( hash1 != hash2 );
const char *check1 = logger.area_name(hash1);
const char *check2 = logger.area_name(hash2);
const char *check1 = logger.area_name(hash1);
const char *check2 = logger.area_name(hash2);
CHECK( check1 == name1 );
CHECK( check2 == name2 );
CHECK( check1 == name1 );
CHECK( check2 == name2 );
log::debug(hash1, "This is a thing %016lx", 35);
log::info(hash2, "This is a string %s", "foo");
log::warn(hash1, "This is a thing %016lx", 682);
log::error(hash2, "This is a string %s", "bar");
log::debug(hash1, "This is a thing %016lx", 35);
log::info(hash2, "This is a string %s", "foo");
log::warn(hash1, "This is a thing %016lx", 682);
log::error(hash2, "This is a string %s", "bar");
}

View File

@@ -7,20 +7,20 @@ bool ASSERT_EXPECTED = false;
bool ASSERT_HAPPENED = false;
void test_assert(const char *file, unsigned line, const char *message)
{
CAPTURE( file );
CAPTURE( line );
INFO( message );
REQUIRE( ASSERT_EXPECTED );
ASSERT_EXPECTED = false;
ASSERT_HAPPENED = true;
CAPTURE( file );
CAPTURE( line );
INFO( message );
REQUIRE( ASSERT_EXPECTED );
ASSERT_EXPECTED = false;
ASSERT_HAPPENED = true;
}
int main( int argc, char* argv[] ) {
kutil::assert_set_callback(test_assert);
kutil::assert_set_callback(test_assert);
int result = Catch::Session().run( argc, argv );
return result;
int result = Catch::Session().run( argc, argv );
return result;
}
namespace kutil {

View File

@@ -6,90 +6,90 @@ 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);
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::shuffle(ints.begin(), ints.end(), rng());
size_t sizes[] = {1, 2, 3, 5, 100};
for (size_t s : sizes) {
kutil::map<int, int> v;
std::shuffle(ints.begin(), ints.end(), rng());
for (int i = 0; i < s; ++i) {
v.insert(ints[i], ints[i]);
}
for (int i = 0; i < s; ++i) {
v.insert(ints[i], ints[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 == ints[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 == ints[i] );
}
}
}
TEST_CASE( "map deletion", "[containers] [map]" )
{
std::vector<int> ints;
for (int i = 0; i < 1000; ++i)
ints.push_back(i);
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::shuffle(ints.begin(), ints.end(), rng());
size_t sizes[] = {1, 2, 3, 5, 100};
for (size_t s : sizes) {
kutil::map<int, int> v;
std::shuffle(ints.begin(), ints.end(), rng());
for (int i = 0; i < s; ++i) {
v.insert(ints[i], ints[i]);
}
for (int i = 0; i < s; ++i) {
v.insert(ints[i], ints[i]);
}
for (int i = 0; i < s; i += 2) {
v.erase(ints[i]);
}
for (int i = 0; i < s; i += 2) {
v.erase(ints[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]) );
if ( i%2 )
CHECK( p );
else
CHECK( !p );
}
}
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]) );
if ( i%2 )
CHECK( p );
else
CHECK( !p );
}
}
}
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]);
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] );
}
for (int i = 0; i < 4; ++i) {
int *p = v.find(i*7);
CHECK( p == &is[i] );
}
CHECK( v.find(3) == nullptr );
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]);
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] );
}
for (uint64_t i = 0; i < 4; ++i) {
int *p = v.find(i+1);
CHECK( *p == is[i] );
}
CHECK( v.find(30) == nullptr );
CHECK( v.find(30) == nullptr );
}

View File

@@ -5,21 +5,21 @@
TEST_CASE( "sorted vector tests", "[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 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);
kutil::vector<sortableT> v;
kutil::vector<sortableT> v;
int sizes[] = {1, 2, 3, 5, 100};
for (int s : sizes) {
for (int i = 0; i < s; ++i) {
sortableT t { distrib(rng) };
v.sorted_insert(t);
}
int sizes[] = {1, 2, 3, 5, 100};
for (int s : sizes) {
for (int i = 0; i < s; ++i) {
sortableT t { distrib(rng) };
v.sorted_insert(t);
}
for (int i = 1; i < s; ++i)
CHECK( v[i].value >= v[i-1].value );
}
for (int i = 1; i < s; ++i)
CHECK( v[i].value >= v[i-1].value );
}
}