/*========================================================================= * * Copyright NumFOCUS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ #ifndef itkTreeNode_h #define itkTreeNode_h #include #include #include #include "itkObject.h" #include "itkObjectFactory.h" #include "itkIntTypes.h" namespace itk { /** \class TreeNode * \brief Represents a node in a tree. * * This class derives from the Object class. * * The class is templated over the type of the elements. * * \tparam TValue = Element type stored in the node * * \ingroup DataRepresentation * \ingroup ITKDeprecated */ template class ITK_TEMPLATE_EXPORT TreeNode : public Object { public: ITK_DISALLOW_COPY_AND_MOVE(TreeNode); /** Standard type alias */ using Superclass = Object; using Self = TreeNode; using Pointer = SmartPointer; using ConstPointer = SmartPointer; using ChildrenListType = std::vector; using ChildIdentifier = itk::OffsetValueType; /** Method for creation through the object factory. */ itkNewMacro(Self); /** \see LightObject::GetNameOfClass() */ itkOverrideGetNameOfClassMacro(TreeNode); /** Get the value of the node */ const TValue & Get() const; /** Set the current value of the node */ TValue Set(const TValue data); /** Get the child node */ Self * GetChild(ChildIdentifier number) const; /** Get the parent node */ Self * GetParent() const; /** Return true if the node has children */ bool HasChildren() const; /** Return true if the node has a parent */ bool HasParent() const; /** Set the parent of the node */ void SetParent(Self * n); /** Return the number of children */ ChildIdentifier CountChildren() const; /** Remove a node from the node */ bool Remove(Self * n); /** Get the number of children given a name and depth */ ChildIdentifier GetNumberOfChildren(unsigned int depth = 0, char * name = nullptr) const; /** Replace a given child by a new one */ bool ReplaceChild(Self * oldChild, Self * newChild); /** Return the child position given a node */ ChildIdentifier ChildPosition(const Self * node) const; /** Return the child position given a value */ ChildIdentifier ChildPosition(TValue node) const; /** Add a child to the node */ void AddChild(Self * node); /** Add a child to the node and specify the number in the children list */ virtual void AddChild(ChildIdentifier number, Self * node); /** Get the children list */ #if !defined(ITK_WRAPPING_PARSER) virtual ChildrenListType * GetChildren(unsigned int depth = 0, char * name = nullptr) const; #endif /** Get the internal list of children */ #if !defined(ITK_WRAPPING_PARSER) virtual ChildrenListType & GetChildrenList() { return m_Children; } #endif /** Set the data of the node */ // virtual void SetData(TValue data) {m_Data = data;} protected: TreeNode() = default; ~TreeNode() override; TValue m_Data{}; Self * m_Parent{ nullptr }; ChildrenListType m_Children{}; }; } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION # include "itkTreeNode.hxx" #endif #endif