CoreInterface Tree Walker Example
From BRL-CAD
#include <iostream> #include <string> #include <brlcad/ConstDatabase.h> #include <brlcad/Combination.h> class CombinationsCb; void ListTreeNode(const BRLCAD::Combination::ConstTreeNode& node, const BRLCAD::ConstDatabase& database, CombinationsCb& callback); class CombinationsCb : public BRLCAD::ConstDatabase::ObjectCallback { public: CombinationsCb(const BRLCAD::ConstDatabase& database) : BRLCAD::ConstDatabase::ObjectCallback(), m_database(database), m_prefix() {} CombinationsCb(const BRLCAD::ConstDatabase& database, const std::string& prefix) : BRLCAD::ConstDatabase::ObjectCallback(), m_database(database), m_prefix(prefix) {} void Print(const char* name) { std::cout << m_prefix << name << std::endl; } virtual void operator()(const BRLCAD::Object& object) { const BRLCAD::Combination* comb = dynamic_cast<const BRLCAD::Combination*>(&object); if (comb != 0) ListTreeNode(comb->Tree(), m_database, CombinationsCb(m_database, m_prefix + '\t')); } private: const BRLCAD::ConstDatabase& m_database; std::string m_prefix; }; void ListTreeNode ( const BRLCAD::Combination::ConstTreeNode& node, const BRLCAD::ConstDatabase& database, CombinationsCb& callback ) { switch (node.Operation()) { case BRLCAD::Combination::ConstTreeNode::Union: case BRLCAD::Combination::ConstTreeNode::Intersection: case BRLCAD::Combination::ConstTreeNode::Subtraction: case BRLCAD::Combination::ConstTreeNode::ExclusiveOr: ListTreeNode(node.LeftOperand(), database, callback); ListTreeNode(node.RightOperand(), database, callback); break; case BRLCAD::Combination::ConstTreeNode::Not: ListTreeNode(node.Operand(), database, callback); break; case BRLCAD::Combination::ConstTreeNode::Leaf: callback.Print(node.Name()); database.Get(node.Name(), callback); } } int main ( int argc, char* argv[] ) { int ret = 0; if (argc < 2) { std::cout << "Usage: " << argv[0] << " <BRL-CAD Database>" << std::endl; ret = 1; } else { BRLCAD::ConstDatabase database; if (database.Load(argv[1])) { BRLCAD::ConstDatabase::TopObjectIterator it = database.FirstTopObject(); CombinationsCb callback(database); while (it.Good()) { std::cout << it.Name() << std::endl; database.Get(it.Name(), callback); ++it; } } else ret = 2; } return ret; }