diff --git a/cpp/BTree.h b/cpp/BTree.h index 206d0bc89..1513ba9ab 100644 --- a/cpp/BTree.h +++ b/cpp/BTree.h @@ -6,6 +6,8 @@ #include #include #include "Key.h" +#include +#include // type 'a t = // Empty @@ -105,13 +107,48 @@ typename Node::Tree add(const Key& key, const Value& value, const ty } template -Value find(const typename boost::shared_ptr >& tree, const Key& key){ +boost::optional find(const typename boost::shared_ptr >& tree, const Key& key){ if(tree->key_ == key) return tree->value_; - if(key < tree->key_) + if(key < tree->key_ && tree->left_ != NULL) return find(tree->left_, key); - else + else if(tree->right_ != NULL) return find(tree->right_,key); + return boost::none; +} + +template +typename Node::Tree begin(const typename Node::Tree& tree) { + if(tree->left_ !=NULL){ + return begin(tree->left_); + } + else { + return tree; + } +} + +template +typename Node::Tree end(const typename Node::Tree& tree) { + if(tree->right_ !=NULL){ + return begin(tree->right_); + } + else { + return tree; + } +} + +template +void walk(const typename boost::shared_ptr >& tree, std::string s) { + if(tree->left_ !=NULL) { + walk(tree->left_, s+"->l"); + } + Key k = tree->key_; + std::stringstream ss; + ss << tree->height_; + k.print(ss.str() +" "+ s); + if(tree->right_ !=NULL) { + walk(tree->right_, s+"->r"); + } } } diff --git a/cpp/testBTree.cpp b/cpp/testBTree.cpp new file mode 100644 index 000000000..93c33b3ab --- /dev/null +++ b/cpp/testBTree.cpp @@ -0,0 +1,55 @@ +/* + * testBNode.cpp + * + * Created on: Feb 3, 2010 + * Author: cbeall3 + */ + +#include +#include +#include "Key.h" +#include "BTree.h" + +using namespace std; +using namespace gtsam; + +typedef pair Range; +//typedef boost::shared_ptr > Tree; +typedef Node::Tree RangeTree; + + +/* ************************************************************************* */ +TEST( BNode, constructor ) +{ + RangeTree tree; + CHECK(tree==NULL) + LONGS_EQUAL(0,height(tree)) + + // check the height of tree after adding an element + RangeTree tree1 = add(Symbol('x',1), Range(1,2), tree); + LONGS_EQUAL(1,height(tree1)) + + boost::optional range1 = find(tree1, Symbol('x',1)); + CHECK(range1 == Range(1,2)); + + RangeTree tree2 = add(Symbol('x',5), Range(5,6), tree1); + RangeTree tree3 = add(Symbol('x',3), Range(3,4), tree2); + + boost::optional range2 = find(tree3, Symbol('x',5)); + boost::optional range3 = find(tree3, Symbol('x',3)); + + CHECK(range2 == Range(5,6)); + CHECK(range3 == Range(3,4)); + + // this causes Bus Error. + //RangeTree tree4 = add(Symbol('x',2), Range(3,4), tree3); + + //walk(tree4, "root"); +} + +/* ************************************************************************* */ +int main() { + TestResult tr; + return TestRegistry::runAllTests(tr); +} +/* ************************************************************************* */