#ifndef __creaImageIOTreeNode_h_INCLUDED__ #define __creaImageIOTreeNode_h_INCLUDED__ #include #include #include #include namespace creaImageIO { namespace tree { //===================================================================== /// Forward declaration of Tree class Tree; //===================================================================== //===================================================================== /// Abstract class to store user data on a tree node struct NodeData { NodeData() {} virtual ~NodeData() {} }; //===================================================================== //===================================================================== /// Node of an attributed tree structure class Node { public: typedef std::map AttributeMapType; /// Ctor with parent Node(Node* parent); /// Ctor with parent and attributes map Node(Node* parent, const AttributeMapType& ); /// Virtual destructor virtual ~Node(); /// Returns the level descriptor of the node const LevelDescriptor& GetLevelDescriptor() const; /// Returns the tree to which the node belongs virtual Tree* GetTree() { return mParent->GetTree(); } /// Returns the tree to which the node belongs virtual const Tree* GetTree() const { return mParent->GetTree(); } /// Returns the level of the node in the tree virtual int GetLevel() const { return mParent->GetLevel()+1; } /// Returns the parent of the node Node* GetParent() const { return mParent; } /// Returns the number of children of the node. /// Warning : if the children are not loaded then might return 0 /// even if the node has children ! /// see TreeHandler::GetNumberOfChildren unsigned int GetNumberOfChildren() const { return mChildren.size(); } /// Returns true iff the node's children are loaded bool GetChildrenLoaded() const { return mChildrenLoaded; } /// Sets the node's children void SetChildrenLoaded(bool l) { mChildrenLoaded = l; } /// The type of children container typedef std::vector ChildrenListType; /// Returns the list of children ChildrenListType& GetChildrenList() { return mChildren; } /// Returns the list of children (const) const ChildrenListType& GetChildrenList() const { return mChildren; } /// Remove the given children from the children list void RemoveChildrenFromList(Node*); AttributeMapType& GetAttributeMap() { return mAttributeMap; } const AttributeMapType& GetAttributeMap() const { return mAttributeMap; } const std::string& GetAttribute(const std::string& k) const; const std::string& GetCleanAttribute(const std::string& k) const; const std::string& UnsafeGetAttribute(const std::string& k) const { return mAttributeMap.find(k)->second; } void SetAttribute(const std::string& k, const std::string& v); void UnsafeSetAttribute(const std::string& k, const std::string& v) { mAttributeMap[k] = v; } const AttributeDescriptor& GetAttributeDescriptor(const std::string& k) const; // { return GetTypeDescription().GetFieldDescription(k); } /// Returns true iff the KEY attributes of the node match those of the map provided bool Matches( const AttributeMapType& ) const; /// Returns the node data casted into the type T template T GetData() const { if (mData!=0) return dynamic_cast(mData); return 0; } /// Sets the node data. Deletes existing data if any. void SetData(NodeData* d) { if (mData) delete mData; mData = d; } /// Sorts the children of the node void SortChildren(const LexicographicalComparator&); /* virtual void Print() const; std::string GetLabel() const; int ImageGetRows() const; int ImageGetColumns() const; int ImageGetFrames() const; const std::string& ImageGetFullFileName() const { return UnsafeGetAttribute("FullFileName"); } */ private: /// The parent of the node Node* mParent; /// The list of children ChildrenListType mChildren; /// The map of attributes AttributeMapType mAttributeMap; /// User data NodeData* mData; /// Are the children loaded ? bool mChildrenLoaded; /// The number of children // int mNumberOfChildren; }; // class Node //===================================================================== } // namespace tree } // namespace creaImageIO #endif // #ifndef __creaImageIOTreeNode_h_INCLUDED__