diff --git a/Makefile.in b/Makefile.in index a623b06..180d474 100644 --- a/Makefile.in +++ b/Makefile.in @@ -80,6 +80,7 @@ SOURCE=\ persistent-data/data-structures/bitset.cc \ persistent-data/data-structures/bloom_filter.cc \ persistent-data/data-structures/btree.cc \ + persistent-data/data-structures/btree_damage_visitor.cc \ persistent-data/data-structures/btree_node_checker.cc \ persistent-data/error_set.cc \ persistent-data/file_utils.cc \ diff --git a/persistent-data/data-structures/btree_damage_visitor.cc b/persistent-data/data-structures/btree_damage_visitor.cc index d6a6dee..915335a 100644 --- a/persistent-data/data-structures/btree_damage_visitor.cc +++ b/persistent-data/data-structures/btree_damage_visitor.cc @@ -16,13 +16,13 @@ damage_tracker::bad_node() damaged_ = true; } -maybe_range64 +damage_tracker::maybe_run64 damage_tracker::good_internal(block_address begin) { - maybe_range64 r; + maybe_run64 r; if (damaged_) { - r = maybe_range64(range64(damage_begin_, begin)); + r = maybe_run64(run64(damage_begin_, begin)); damaged_ = false; } @@ -30,13 +30,13 @@ damage_tracker::good_internal(block_address begin) return r; } -maybe_range64 -damage_tracker::good_leaf(uint64_t begin, uint64_t end) +damage_tracker::maybe_run64 +damage_tracker::good_leaf(block_address begin, block_address end) { - maybe_range64 r; + maybe_run64 r; if (damaged_) { - r = maybe_range64(range64(damage_begin_, begin)); + r = maybe_run64(run64(damage_begin_, begin)); damaged_ = false; } @@ -44,13 +44,49 @@ damage_tracker::good_leaf(uint64_t begin, uint64_t end) return r; } -maybe_range64 +damage_tracker::maybe_run64 damage_tracker::end() { + maybe_run64 r; + if (damaged_) - return maybe_range64(damage_begin_); + r = maybe_run64(damage_begin_); else - return maybe_range64(); + r = maybe_run64(); + + damaged_ = false; + damage_begin_ = 0; + + return r; +} + +//---------------------------------------------------------------- + +path_tracker::path_tracker() +{ + // We push an empty path, to ensure there + // is always a current_path. + paths_.push_back(btree_path()); +} + +btree_path const * +path_tracker::next_path(btree_path const &p) +{ + if (p != current_path()) { + if (paths_.size() == 2) + paths_.pop_front(); + paths_.push_back(p); + + return &paths_.front(); + } + + return NULL; +} + +btree_path const & +path_tracker::current_path() const +{ + return paths_.back(); } //---------------------------------------------------------------- diff --git a/persistent-data/data-structures/btree_damage_visitor.h b/persistent-data/data-structures/btree_damage_visitor.h index 1ff16a8..0d2031a 100644 --- a/persistent-data/data-structures/btree_damage_visitor.h +++ b/persistent-data/data-structures/btree_damage_visitor.h @@ -38,57 +38,20 @@ namespace persistent_data { // trackers if you have a multilayer tree. class damage_tracker { public: - damage_tracker() - : damaged_(false), - damage_begin_(0) { - } + damage_tracker(); typedef run run64; typedef boost::optional maybe_run64; - void bad_node() { - damaged_ = true; - } + void bad_node(); - maybe_run64 good_internal(block_address begin) { - maybe_run64 r; - - if (damaged_) { - r = maybe_run64(run64(damage_begin_, begin)); - damaged_ = false; - } - - damage_begin_ = begin; - return r; - } + maybe_run64 good_internal(block_address begin); // remember 'end' is the one-past-the-end value, so // take the last key in the leaf and add one. - maybe_run64 good_leaf(block_address begin, block_address end) { - maybe_run64 r; + maybe_run64 good_leaf(block_address begin, block_address end); - if (damaged_) { - r = maybe_run64(run64(damage_begin_, begin)); - damaged_ = false; - } - - damage_begin_ = end; - return r; - } - - maybe_run64 end() { - maybe_run64 r; - - if (damaged_) - r = maybe_run64(damage_begin_); - else - r = maybe_run64(); - - damaged_ = false; - damage_begin_ = 0; - - return r; - } + maybe_run64 end(); private: bool damaged_; @@ -99,28 +62,12 @@ namespace persistent_data { // different sub tree (by looking at the btree_path). class path_tracker { public: - path_tracker() { - // We push an empty path, to ensure there - // is always a current_path. - paths_.push_back(btree_path()); - } + path_tracker(); // returns the old path if the tree has changed. - btree_path const *next_path(btree_path const &p) { - if (p != current_path()) { - if (paths_.size() == 2) - paths_.pop_front(); - paths_.push_back(p); + btree_path const *next_path(btree_path const &p); - return &paths_.front(); - } - - return NULL; - } - - btree_path const ¤t_path() const { - return paths_.back(); - } + btree_path const ¤t_path() const; private: std::list paths_;