43#include <gtest/gtest.h>
75 auto *node =
new Node(key);
80 std::vector<Node*>
make_nodes(
const std::vector<int>& keys)
82 std::vector<Node*>
nodes;
103 Node *node = make_node(42);
114 std::vector<int> keys = {50, 25, 75, 10, 30, 60, 90};
115 auto nodes = make_nodes(keys);
117 for (
auto *node :
nodes)
141 auto nodes = make_nodes({50, 25, 75, 10, 30});
142 for (
auto *node :
nodes)
156 std::vector<int> keys = {50, 25, 75, 10, 30, 60, 90};
157 auto nodes = make_nodes(keys);
159 for (
auto *node :
nodes)
163 std::vector<int>
removal = {30, 10, 90, 50, 25, 75, 60};
166 EXPECT_NE(tree.remove(key),
nullptr) <<
"Failed to remove " << key;
167 EXPECT_TRUE(tree.verify()) <<
"Verify failed after removing " << key;
180 auto nodes = make_nodes({50, 25, 75, 10, 30, 60, 90});
181 for (
auto *node :
nodes)
185 std::vector<int>
expected = {10, 25, 30, 50, 60, 75, 90};
189 Node *selected = tree.select(i);
190 ASSERT_NE(selected,
nullptr) <<
"select(" << i <<
") returned null";
197 auto nodes = make_nodes({10, 20, 30, 40, 50});
198 for (
auto *node :
nodes)
207 std::vector<int>
expected = {10, 20, 40, 50};
210 Node *selected = tree.select(i);
219 for (
int i = 0; i < 100; ++i)
220 tree.insert(make_node(i * 2));
226 for (
size_t i = 0; i < 100; ++i)
228 Node *selected = tree.select(i);
240 auto nodes = make_nodes({10, 20, 30, 40, 50});
241 for (
auto *node :
nodes)
258 auto nodes = make_nodes({10, 20, 30, 40, 50});
259 for (
auto *node :
nodes)
262 auto [pos, node] = tree.position(25);
269 auto nodes = make_nodes({10, 20, 30, 40, 50});
270 for (
auto *node :
nodes)
273 auto [pos, node] = tree.find_position(30);
281 auto nodes = make_nodes({10, 20, 30, 40, 50});
282 for (
auto *node :
nodes)
286 auto [pos, node] = tree.find_position(25);
296 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
297 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
298 EXPECT_NE(tree.insert_dup(make_node(42)),
nullptr);
310 auto nodes = make_nodes({10, 20, 30, 40, 50});
311 for (
auto *node :
nodes)
315 tree.split_pos(2,
t1,
t2);
333 auto nodes = make_nodes({10, 20, 30});
334 for (
auto *node :
nodes)
338 tree.split_pos(0,
t1,
t2);
346 auto nodes = make_nodes({10, 20, 30});
347 for (
auto *node :
nodes)
351 tree.split_pos(10,
t1,
t2);
363 auto nodes = make_nodes({10, 20, 30, 40, 50});
364 for (
auto *node :
nodes)
383 auto nodes = make_nodes({10, 20, 30});
384 for (
auto *node :
nodes)
396 auto nodes = make_nodes({10, 20, 30});
397 for (
auto *node :
nodes)
403 tree2 = std::move(tree);
421 std::mt19937
rng(42);
422 std::uniform_int_distribution<int> dist(1, 1000);
446 for (
size_t i = 0; i < keys.size(); ++i)
471 std::set<int> reference;
472 std::vector<RbNodeRk<int>*> all_nodes;
474 std::mt19937
rng(12345);
475 std::uniform_int_distribution<int>
key_dist(1, 5000);
476 std::uniform_int_distribution<int>
op_dist(0, 2);
478 auto make = [&all_nodes](
int k) {
480 all_nodes.push_back(n);
486 for (
int i = 0; i <
NUM_OPS; ++i)
493 auto *node = make(key);
507 bool ref_found = (reference.count(key) > 0);
520 for (
auto *n : all_nodes)
527 std::vector<RbNodeRk<int>*>
nodes;
531 for (
int i = 0; i <
N; ++i)
534 nodes.push_back(node);
542 for (
int i = 0; i <
N; i += 100)
549 for (
auto *n :
nodes)
559 auto nodes = make_nodes({50, 25, 75, 10, 30});
560 for (
auto *node :
nodes)
567 std::vector<int>
expected = {10, 25, 30, 50, 75};
577 ::testing::InitGoogleTest(&
argc,
argv);
WeightedDigraph::Node Node
T & insert(const T &item)
Insert a new item by copy.
T remove()
Remove the first item of the list.
Node * select(size_t i) const
Select i-th node in order.
Node * search(const Key &key) const noexcept
Search for a key.
Node * insert(Node *p) noexcept
Insert a node.
size_t size() const noexcept
Get number of nodes O(1)
Node * remove(const Key &key) noexcept
Remove node with given key.
bool verify() const noexcept
Verify tree properties.
size_t size() const noexcept
Count the number of elements of the list.
Extended Red-Black node with subtree counter.
iterator end() noexcept
Return an STL-compatible end iterator.
iterator begin() noexcept
Return an STL-compatible iterator to the first element.
Node * make_node(int key)
std::vector< Node * > make_nodes(const std::vector< int > &keys)
std::vector< Node * > allocated_nodes
DynArray< Graph::Node * > nodes
Main namespace for Aleph-w library functions.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Red-Black binary search tree with nodes without virtual destructor and with subtree counters for sele...
TEST_F(TdRbTreeRkTest, EmptyTree)
Red-Black tree with rank (order statistics).
Top-down Red-Black tree with rank support.