68 lines
1.5 KiB
C++
68 lines
1.5 KiB
C++
#ifndef INVENTORY_OBJECT_TREE_HH_
|
|
#define INVENTORY_OBJECT_TREE_HH_
|
|
#include "dbobjectptr.hh"
|
|
#include "dbobjecttreeptr.hh"
|
|
#include "dbcontainer.hh"
|
|
#include "cxx-semantics.hh"
|
|
#include <vector>
|
|
#include <functional>
|
|
|
|
namespace inventory {
|
|
namespace db {
|
|
class DBSession;
|
|
}
|
|
|
|
namespace datamodel {
|
|
|
|
template <class Object>
|
|
class DBObjectTree : public DBObjectTreePtrBase<Object> {
|
|
public:
|
|
template <class T>
|
|
using SubtreeContainer = std::vector<DBObjectTreePtr<T>>;
|
|
|
|
typedef DBContainerPtr<Object, SubtreeContainer>
|
|
SubtreeContainerPtr;
|
|
|
|
class SubtreeVisitor :
|
|
public semantics::visitor<DBObjectPtr<Object>, int, int> {};
|
|
|
|
// visibility outside of DBObjectTree
|
|
typedef SubtreeVisitor Visitor;
|
|
|
|
DBObjectTree() {
|
|
m_object.reset(new Object);
|
|
m_object->id = (int)(Object::Id::ROOT);
|
|
}
|
|
|
|
DBObjectTree(DBObjectPtr<Object> obj)
|
|
: m_object(obj) {}
|
|
|
|
DBObjectTree(DBObjectPtr<Object> obj, DBObjectTreePtr<Object> suptree)
|
|
: m_object(obj), m_suptree(suptree) {}
|
|
|
|
DBObjectPtr<Object> object() {
|
|
return m_object;
|
|
}
|
|
|
|
SubtreeContainerPtr subtree() {
|
|
return m_subtree;
|
|
}
|
|
|
|
void fetch_object(db::DBSession &);
|
|
void fetch_subtree(db::DBSession &);
|
|
|
|
void recurse_subtrees(db::DBSession &session, Visitor &visitor,
|
|
int max_level = -1, int level = 0);
|
|
|
|
private:
|
|
DBObjectPtr<Object> m_object;
|
|
|
|
DBObjectTreePtr<Object> m_suptree;
|
|
SubtreeContainerPtr m_subtree;
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|