X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FcreaImageIOTreeNode.h;fp=src%2FcreaImageIOTreeNode.h;h=2905c1a8a0e2784d201da383fe54c2697919afd7;hb=3a22e19184c369b130d4caa992a8e98e50c7a0ee;hp=0000000000000000000000000000000000000000;hpb=916a5e3008de7387aaf45e9d4e4ebbe6503205c3;p=creaImageIO.git diff --git a/src/creaImageIOTreeNode.h b/src/creaImageIOTreeNode.h new file mode 100644 index 0000000..2905c1a --- /dev/null +++ b/src/creaImageIOTreeNode.h @@ -0,0 +1,157 @@ +#ifndef __creaImageIOTreeNode_h_INCLUDED__ +#define __creaImageIOTreeNode_h_INCLUDED__ + +#include +#include +#include +#include +#include + + +namespace creaImageIO +{ + + namespace tree + { + /** + * \ingroup 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(); + + /// Initializes the attribute map i.e. creates the entries + void InitializeAttributeMap(); + + /// 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 + int RemoveChildrenFromList(Node*); + + + /// Get the Attributes Map + AttributeMapType& GetAttributeMap() { return mAttributeMap; } + + /// Get the Attributes Map + const AttributeMapType& GetAttributeMap() const { return mAttributeMap; } + + /// Get the Attribute for a specific key + const std::string& GetAttribute(const std::string& k) const; + + /// Get the Attribute for a specific key without OS dependance (not implemented) + // TODO : backslash OS uniformity + const std::string& GetCleanAttribute(const std::string& k) const; + + /// Set an Attribute for a specific key + void SetAttribute(const std::string& k, const std::string& v); + + /// Set an Attribute for a specific key(unsafe mode) + void UnsafeSetAttribute(const std::string& k, const std::string& v) + { mAttributeMap[k] = v; } + + /// Get Descriptor for an Attribute + const AttributeDescriptor& GetAttributeDescriptor(const std::string& k)const; + + /// Returns true if 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(boost::shared_ptr d) {mData.reset(); mData = d; }//{ if (mData) delete mData; mData = d; } + + /// Sorts the children of the node + void SortChildren(const LexicographicalComparator&); + + /// Print the node + virtual void Print() const; + + /// Get the Label of the node + std::string GetLabel() const; + + + private: + /// The parent of the node + Node* mParent; + /// The list of children + ChildrenListType mChildren; + /// The map of attributes + AttributeMapType mAttributeMap; + /// User data + boost::shared_ptr mData; + /// Are the children loaded ? + bool mChildrenLoaded; + /// The number of children + // int mNumberOfChildren; + + }; // class Node + //===================================================================== + + } // namespace tree + + +} // namespace creaImageIO + + + +#endif // #ifndef __creaImageIOTreeNode_h_INCLUDED__