// Created on: 1992-05-13 // Copyright (c) 1992-1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and / or modify it // under the terms of the GNU Lesser General Public version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. // Revised: Wed Oct,21 1992 // By : Mireille MERCIEN #include #include typedef PCollection_AVLNodeStack Stack; typedef PCollection_HAVLSearchTree Tree; typedef Handle(PCollection_HAVLSearchTree) Handle(Tree); typedef PCollection_AVLNode Node; typedef Handle(PCollection_AVLNode) Handle(Node); //----------------------------------------------------------------------------- PCollection_AVLIterator:: PCollection_AVLIterator ( const Handle(Tree)& aTree) { CurrentStack = new Stack; // Create an empty Stack Handle(Node) Root = aTree->GetRoot(); // Current node = root of tree if (Root.IsNull()) { HasMore = False; } else { HasMore = True; // CURRENTSTACK MANAGEMENT Append( Root); } } //----------------------------------------------------------------------------- Boolean PCollection_AVLIterator::More () const { return HasMore; } //----------------------------------------------------------------------------- Handle(Node) PCollection_AVLIterator::Value () const { if (!HasMore) NoSuchObject::Raise(); return CurrentNode; } //----------------------------------------------------------------------------- void PCollection_AVLIterator::Clear () { CurrentNode.Nullify(); CurrentStack.Nullify(); HasMore = False; } //----------------------------------------------------------------------------- void PCollection_AVLIterator::Next () { if (!HasMore) NoMoreObject::Raise(); Handle(Node) Right = CurrentNode->RightChild(); // WHAT ARE THE FOLLOWING ELEMENTS ? if ( Right.IsNull()) { RecursiveRemove(CurrentNode); // MAYBE IT'S THE END if (CurrentStack->IsEmpty()) HasMore = False; else CurrentNode = CurrentStack->Top(); } else { Append (Right); } } // PRIVATE TOOLS TO ITERATE void PCollection_AVLIterator::Append ( const Handle(Node)& Root) { RecursiveAppend( Root); CurrentNode = CurrentStack->Top(); } void PCollection_AVLIterator::RecursiveAppend(const Handle(Node)& ANode) { if (!ANode.IsNull()) { CurrentStack->Push(ANode); Handle(Node) Left = ANode->LeftChild(); RecursiveAppend( Left); } } void PCollection_AVLIterator::RecursiveRemove(const Handle(Node)& theNode) { CurrentStack->Pop(); if (CurrentStack->IsEmpty()) return; Handle(Node) NewNode = CurrentStack->Top(); if (theNode == NewNode->RightChild()) { RecursiveRemove(NewNode); } }