38#include <gtest/gtest.h>
39#include <gsl/gsl_rng.h>
59 return std::string(256,
'\xFF');
68template <
class Key,
class Type>
78template <
class Key,
class Type>
89class SkipListTest :
public ::testing::Test
94 SL* skiplist =
nullptr;
95 std::vector<SL::Node*> allocated_nodes;
102 void TearDown()
override
105 for (
auto* node : allocated_nodes)
107 allocated_nodes.clear();
114 int level = skiplist->generateRandomLevel();
116 allocated_nodes.push_back(node);
123 allocated_nodes.push_back(node);
151 skiplist->set_seed(123);
152 int level1 = skiplist->generateRandomLevel();
153 skiplist->set_seed(123);
154 int level2 = skiplist->generateRandomLevel();
171 skiplist->insert(node);
179 for (
int i = 1; i <= 10; ++i)
182 skiplist->insert(node);
188 auto* first = skiplist->get_first();
195 for (
int i = 10; i >= 1; --i)
198 skiplist->insert(node);
204 auto* first = skiplist->get_first();
211 std::vector<int> keys = {5, 2, 8, 1, 9, 3, 7, 4, 6, 10};
216 skiplist->insert(node);
222 auto* current = skiplist->get_first();
224 while (current !=
nullptr && current->get_key() <
INT_MAX)
228 current = current->get_next();
239 auto* result = skiplist->search(42);
246 skiplist->insert(node);
248 auto*
found = skiplist->search(42);
257 skiplist->insert(node);
259 EXPECT_EQ(skiplist->search(41),
nullptr);
260 EXPECT_EQ(skiplist->search(43),
nullptr);
262 EXPECT_EQ(skiplist->search(100),
nullptr);
267 for (
int i = 1; i <= 100; ++i)
270 skiplist->insert(node);
274 for (
int i = 1; i <= 100; ++i)
276 auto*
found = skiplist->search(i * 2);
283 for (
int i = 1; i <= 100; ++i)
285 auto*
found = skiplist->search(i * 2 - 1);
286 EXPECT_EQ(
found,
nullptr) <<
"Key " << i * 2 - 1 <<
" should not exist";
296 auto* result = skiplist->
remove(42);
303 skiplist->insert(node);
311 EXPECT_EQ(skiplist->search(42),
nullptr);
317 skiplist->insert(node);
319 EXPECT_EQ(skiplist->remove(41),
nullptr);
320 EXPECT_EQ(skiplist->remove(43),
nullptr);
323 EXPECT_NE(skiplist->search(42),
nullptr);
328 for (
int i = 1; i <= 5; ++i)
331 skiplist->insert(node);
340 auto* first = skiplist->get_first();
347 for (
int i = 1; i <= 5; ++i)
350 skiplist->insert(node);
364 for (
int i = 1; i <= 5; ++i)
367 skiplist->insert(node);
383 for (
int i = 1; i <= 10; ++i)
386 skiplist->insert(node);
390 std::vector<int>
order = {5, 1, 9, 3, 7, 2, 8, 4, 6, 10};
391 for (
int key :
order)
406 for (
int i = 0; i < 1000; ++i)
408 int level = skiplist->generateRandomLevel();
421 for (
int i = 0; i <
trials; ++i)
423 int level = skiplist->generateRandomLevel();
461 for (
int i = 1; i <= 5; ++i)
464 skiplist->insert(node);
468 (
void)skiplist->remove(2);
469 (
void)skiplist->remove(4);
473 skiplist->insert(
node6);
474 skiplist->insert(
node7);
493 for (
int i = 0; i <
N; ++i)
496 skiplist->insert(node);
502 for (
int i = 0; i <
N; ++i)
504 auto*
found = skiplist->search(i);
509 for (
int i = 0; i <
N; i += 2)
518 for (
int i = 0; i <
N; ++i)
520 auto*
found = skiplist->search(i);
522 EXPECT_EQ(
found,
nullptr) <<
"Key " << i <<
" should have been removed";
524 EXPECT_NE(
found,
nullptr) <<
"Key " << i <<
" should still exist";
532class SkipListStringTest :
public ::testing::Test
537 SL* skiplist =
nullptr;
538 std::vector<SL::Node*> allocated_nodes;
540 void SetUp()
override
545 void TearDown()
override
547 for (
auto* node : allocated_nodes)
549 allocated_nodes.clear();
553 SL::Node*
create_node(
const std::string& key,
int data = 0)
555 int level = skiplist->generateRandomLevel();
557 allocated_nodes.push_back(node);
568 skiplist->insert(
node2);
569 skiplist->insert(
node1);
570 skiplist->insert(
node3);
575 auto* first = skiplist->get_first();
580 auto*
found = skiplist->search(
"banana");
584 EXPECT_EQ(skiplist->search(
"date"),
nullptr);
593 SL::Iterator it(*skiplist);
601 skiplist->insert(node);
603 SL::Iterator it(*skiplist);
616 for (
int i = 1; i <= 5; ++i)
619 skiplist->insert(node);
625 for (SL::Iterator it(*skiplist); it.has_curr(); it.next())
637 for (
int i = 1; i <= 5; ++i)
640 skiplist->insert(node);
646 for (
auto it = skiplist->begin(); it != skiplist->end(); ++it)
657 for (
int i = 1; i <= 3; ++i)
660 skiplist->insert(node);
663 SL::Iterator it(*skiplist);
675 for (
int i = 1; i <= 3; ++i)
678 skiplist->insert(node);
681 SL::Iterator it1(*skiplist);
684 SL::Iterator it2 = it1;
695 skiplist->insert(node);
697 SL::Iterator it1(*skiplist);
698 SL::Iterator it2(*skiplist);
710 for (
int i = 1; i <= 3; ++i)
713 skiplist->insert(node);
716 SL::Iterator it(*skiplist);
724 SL::Iterator it2 = it++;
731 SL::Iterator it(*skiplist);
744 for (
int i = 0; i <
N; ++i)
747 skiplist->insert(node);
752 for (SL::Iterator it(*skiplist); it.has_curr(); it.next())
765 ::testing::InitGoogleTest(&
argc,
argv);
TEST_F(StaticArenaFixture, simple_fail)
T remove()
Remove the first item of the list.
const Key & get_key() const noexcept
int getLevel() const noexcept
const Type & get_data() const noexcept
Skip List - a probabilistic ordered data structure.
bool checkSkipList() const noexcept
Verify skip list invariants (for debugging).
Main namespace for Aleph-w library functions.
size_t size(Node *root) noexcept
DynList< T > maps(const C &c, Op op)
Classic map operation.
Itor::difference_type count(const Itor &beg, const Itor &end, const T &value)
Count elements equal to a value.
EepicNode * allocate_node(const string &str)
Skip list: probabilistic sorted linked structure.