]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOTreeNode.h
move directory
[creaImageIO.git] / src / creaImageIOTreeNode.h
diff --git a/src/creaImageIOTreeNode.h b/src/creaImageIOTreeNode.h
new file mode 100644 (file)
index 0000000..2905c1a
--- /dev/null
@@ -0,0 +1,157 @@
+#ifndef __creaImageIOTreeNode_h_INCLUDED__
+#define __creaImageIOTreeNode_h_INCLUDED__
+
+#include <creaImageIOTreeDescriptor.h>
+#include <creaImageIOTreeComparators.h>
+#include<boost/filesystem/operations.hpp>
+#include <vector>
+#include <map>
+
+
+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<std::string,std::string> 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<Node*> 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<class T> T GetData() const 
+      { if (mData!=0) return dynamic_cast<T>(mData); return 0; }
+
+      /// Sets the node data. Deletes existing data if any.
+         void SetData(boost::shared_ptr<NodeData> 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<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__