/*========================================================================= * * 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 itkChildTreeIterator_hxx #define itkChildTreeIterator_hxx namespace itk { template ChildTreeIterator::ChildTreeIterator(TTreeType * tree, const TreeNodeType * start) : TreeIteratorBase(tree, start) { m_ListPosition = 0; m_ParentNode = this->m_Position; this->m_Position = m_ParentNode->GetChild(m_ListPosition); this->m_Begin = this->m_Position; } template ChildTreeIterator::ChildTreeIterator(const TreeIteratorBase & iterator) : TreeIteratorBase(iterator.GetTree(), iterator.GetNode()) { m_ListPosition = 0; m_ParentNode = this->m_Position; this->m_Position = m_ParentNode->GetChild(m_ListPosition); } template bool ChildTreeIterator::GoToChild(ChildIdentifier number) { if (m_ParentNode->GetChild(number) == nullptr) { return false; } m_ListPosition = 0; m_ParentNode = m_ParentNode->GetChild(number); this->m_Position = m_ParentNode->GetChild(m_ListPosition); this->m_Begin = this->m_Position; return true; } template bool ChildTreeIterator::GoToParent() { TreeNodeType * parent = m_ParentNode->GetParent(); if (parent == nullptr) { return false; } m_ListPosition = 0; m_ParentNode = parent; this->m_Position = m_ParentNode->GetChild(m_ListPosition); this->m_Begin = this->m_Position; return true; } template auto ChildTreeIterator::GetType() const -> NodeType { return TreeIteratorBaseEnums::TreeIteratorBaseNode::CHILD; } template bool ChildTreeIterator::HasNext() const { if (m_ListPosition < m_ParentNode->CountChildren() - 1) { return true; } else { return false; } } template auto ChildTreeIterator::Next() -> const ValueType & { ++m_ListPosition; this->m_Position = m_ParentNode->GetChild(m_ListPosition); if (this->m_Position == nullptr) { return this->m_Root->Get(); // value irrelevant, but we have to return something } return this->m_Position->Get(); } template TreeIteratorBase * ChildTreeIterator::Clone() { auto * clone = new ChildTreeIterator(const_cast(this->m_Tree), this->m_Position); *clone = *this; return clone; } } // namespace itk #endif