This commit is contained in:
Joe Thornber
2013-12-11 17:28:14 +00:00
parent 927f611aad
commit 8049d369a9
12 changed files with 123 additions and 90 deletions

View File

@ -21,6 +21,7 @@
#include "persistent-data/math_utils.h"
#include "persistent-data/data-structures/btree.h"
#include "persistent-data/data-structures/btree_counter.h"
#include "persistent-data/data-structures/btree_damage_visitor.h"
#include "persistent-data/data-structures/array_block.h"
@ -275,10 +276,9 @@ namespace persistent_data {
template <typename ValueVisitor, typename DamageVisitor>
void visit_values(ValueVisitor &value_visitor,
DamageVisitor &damage_visitor) const {
block_counter counter;
block_value_visitor<ValueVisitor> bvisitor(*this, value_visitor);
block_damage_visitor<DamageVisitor> dvisitor(damage_visitor, entries_per_block_);
btree_visit_values(block_tree_, counter, bvisitor, dvisitor);
btree_visit_values(block_tree_, bvisitor, dvisitor);
// check that all blocks were seen
unsigned h = bvisitor.get_highest_seen();
@ -288,6 +288,26 @@ namespace persistent_data {
}
}
//--------------------------------
struct ablock_counter {
ablock_counter(block_counter &bc)
: bc_(bc) {
}
void visit(btree_detail::node_location const &loc, block_address b) {
bc_.inc(b);
}
private:
block_counter &bc_;
};
void count_metadata_blocks(block_counter &bc) const {
ablock_counter vc(bc);
count_btree_blocks(block_tree_, bc, vc);
}
private:
struct resizer {

View File

@ -136,11 +136,9 @@ namespace persistent_data {
typedef run<block_address> run64;
typedef boost::optional<run64> maybe_run64;
btree_damage_visitor(block_counter &counter,
ValueVisitor &value_visitor,
btree_damage_visitor(ValueVisitor &value_visitor,
DamageVisitor &damage_visitor)
: counter_(counter),
avoid_repeated_visits_(true),
: avoid_repeated_visits_(true),
value_visitor_(value_visitor),
damage_visitor_(damage_visitor) {
}
@ -243,8 +241,6 @@ namespace persistent_data {
bool already_visited(node const &n) {
block_address b = n.get_location();
counter_.inc(b);
if (avoid_repeated_visits_) {
if (seen_.count(b) > 0)
return true;
@ -441,7 +437,6 @@ namespace persistent_data {
//--------------------------------
block_counter &counter_;
bool avoid_repeated_visits_;
ValueVisitor &value_visitor_;
@ -458,11 +453,10 @@ namespace persistent_data {
template <unsigned Levels, typename ValueTraits, typename ValueVisitor, typename DamageVisitor>
void btree_visit_values(btree<Levels, ValueTraits> const &tree,
block_counter &counter,
ValueVisitor &value_visitor,
DamageVisitor &damage_visitor) {
btree_detail::btree_damage_visitor<ValueVisitor, DamageVisitor, Levels, ValueTraits>
v(counter, value_visitor, damage_visitor);
v(value_visitor, damage_visitor);
tree.visit_depth_first(v);
}
}