From 7d49496c3b3c0d55fad761a356f2c4372924c6ce Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Tue, 14 May 2013 11:27:55 +0100 Subject: [PATCH] BTreeDamageVisitorTests --- unit-tests/btree_damage_visitor_t.cc | 56 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/unit-tests/btree_damage_visitor_t.cc b/unit-tests/btree_damage_visitor_t.cc index ed8f6aa..ef6a2ce 100644 --- a/unit-tests/btree_damage_visitor_t.cc +++ b/unit-tests/btree_damage_visitor_t.cc @@ -227,11 +227,20 @@ namespace { return *nodes_; } - unsigned nth_node(node_array const &nodes, unsigned target, bool leaf) const { + static bool is_leaf(node_info::ptr n) { + return n->leaf; + } + + static bool is_internal(node_info::ptr n) { + return !n->leaf; + } + + template + unsigned nth_node(node_array const &nodes, unsigned target, Predicate const &pred) const { unsigned i; for (i = 0; i < nodes.size(); i++) - if (nodes[i]->leaf == leaf) { + if (pred(nodes[i])) { if (!target) break; else @@ -244,42 +253,33 @@ namespace { return i; } - unsigned get_nr_leaf_nodes() { + template + unsigned get_nr_nodes(Predicate const &pred) { node_array const &nodes = get_nodes(); - unsigned nr_leaf = 0; + unsigned nr = 0; for (unsigned i = 0; i < nodes.size(); i++) - if (nodes[i]->leaf) - nr_leaf++; + if (pred(nodes[i])) + nr++; - return nr_leaf; - } - - // FIXME: remove duplication - unsigned get_nr_internal_nodes() { - node_array const &nodes = get_nodes(); - - unsigned nr_internal = 0; - - for (unsigned i = 0; i < nodes.size(); i++) - if (!nodes[i]->leaf) - nr_internal++; - - return nr_internal; + return nr; } node_info::ptr get_leaf_node(unsigned index) { node_array const &nodes = get_nodes(); - unsigned ni = nth_node(nodes, index, true); + + unsigned ni = nth_node(nodes, index, is_leaf); return nodes[ni]; } node_info::ptr random_leaf_node() { node_array const &nodes = get_nodes(); - unsigned nr_leaf = get_nr_leaf_nodes(); + unsigned nr_leaf = get_nr_nodes(is_leaf); unsigned target = random() % nr_leaf; - unsigned i = nth_node(nodes, target, true); + + + unsigned i = nth_node(nodes, target, is_leaf); return nodes[i]; } @@ -287,9 +287,9 @@ namespace { node_info::ptr random_internal_node() { node_array const &nodes = get_nodes(); - unsigned nr_internal = get_nr_internal_nodes(); + unsigned nr_internal = get_nr_nodes(is_internal); unsigned target = random() % nr_internal; - unsigned i = nth_node(nodes, target, false); + unsigned i = nth_node(nodes, target, is_internal); return nodes[i]; } @@ -297,9 +297,9 @@ namespace { node_array get_random_leaf_nodes(unsigned count) { node_array const &nodes = get_nodes(); - unsigned nr_leaf = get_nr_leaf_nodes(); + unsigned nr_leaf = get_nr_nodes(is_leaf); unsigned target = random() % (nr_leaf - count); - unsigned i = nth_node(nodes, target, true); + unsigned i = nth_node(nodes, target, is_leaf); node_array v; @@ -432,7 +432,7 @@ TEST_F(BTreeDamageVisitorTests, damaged_last_leaf) insert_values(10000); commit(); - node_info::ptr n = get_leaf_node(get_nr_leaf_nodes() - 1); + node_info::ptr n = get_leaf_node(get_nr_nodes(is_leaf) - 1); block_address begin = *n->keys.begin_; trash_block(n->b);