/*========================================================================= * * 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 itkRootTreeIterator_h #define itkRootTreeIterator_h #include "itkTreeIteratorBase.h" namespace itk { template class ITK_TEMPLATE_EXPORT RootTreeIterator : public TreeIteratorBase { public: /** Typedefs */ using Superclass = TreeIteratorBase; using TreeType = TTreeType; using ValueType = typename TTreeType::ValueType; using typename Superclass::TreeNodeType; using typename Superclass::NodeType; /** Constructor */ RootTreeIterator(TreeType * tree, const TreeNodeType * start = nullptr); /** Return the type of the iterator */ NodeType GetType() const override; /** Clone function */ TreeIteratorBase * Clone() override; protected: /** Return the next node */ const ValueType & Next() override; /** Return true if the next node exists */ bool HasNext() const override; private: /** Find the next node */ const TreeNodeType * FindNextNode() const; }; /** Constructor */ template RootTreeIterator::RootTreeIterator(TTreeType * tree, const TreeNodeType * start) : TreeIteratorBase(tree, start) { if (start) { this->m_Begin = const_cast *>(start); } this->m_Root = tree->GetRoot(); this->m_Position = this->m_Begin; } /** Return the type of the iterator */ template auto RootTreeIterator::GetType() const -> NodeType { return TreeIteratorBaseEnums::TreeIteratorBaseNode::ROOT; } /** Return true if the next node exists */ template bool RootTreeIterator::HasNext() const { if (const_cast(FindNextNode()) != nullptr) { return true; } return false; } /** Go to the next node */ template const typename RootTreeIterator::ValueType & RootTreeIterator::Next() { this->m_Position = const_cast(FindNextNode()); return this->m_Position->Get(); } /** Find the next node */ template const typename RootTreeIterator::TreeNodeType * RootTreeIterator::FindNextNode() const { if (this->m_Position == nullptr) { return nullptr; } if (this->m_Position == this->m_Root) { return nullptr; } return this->m_Position->GetParent(); } /** Clone function */ template TreeIteratorBase * RootTreeIterator::Clone() { auto * clone = new RootTreeIterator(const_cast(this->m_Tree), this->m_Position); *clone = *this; return clone; } } // end namespace itk #endif