// Created on: 2002-04-17 // Created by: Alexander Kartomin (akm) // Copyright (c) 2002-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 License 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. // Purpose: This is a base class for the List, Set, Queue and Stack // collections. It offers operations on abstract lists (of the // objects of class NCollection_ListNode). // Apart from this class being brand new (in TCollection said // collections were independent, only using the same class for // node representation), here is an important new feature - // the list length is continuously updated, so the method // Extent is quite quick. #ifndef NCollection_BaseList_HeaderFile #define NCollection_BaseList_HeaderFile #include #include #include typedef void (* NCollection_DelListNode) (NCollection_ListNode*, Handle(NCollection_BaseAllocator)& theAl); // ********************************************************** BaseList class class NCollection_BaseList { public: //! Memory allocation DEFINE_STANDARD_ALLOC DEFINE_NCOLLECTION_ALLOC public: class Iterator { public: // ******** Empty constructor Iterator (void) : myCurrent (NULL), myPrevious(NULL) {} // ******** Constructor with initialisation Iterator (const NCollection_BaseList& theList) : myCurrent (theList.myFirst), myPrevious(NULL) {} // ******** Initialisation void Init (const NCollection_BaseList& theList) { myCurrent = theList.myFirst; myPrevious = NULL; } // ******** Initialisation void Initialize (const NCollection_BaseList& theList) { Init(theList); } // ******** More Standard_Boolean More (void) const { return (myCurrent!=NULL); } // ******** Comparison operator Standard_Boolean operator== (const Iterator& theIt) const { return myCurrent == theIt.myCurrent; } //! Performs comparison of two iterators Standard_Boolean IsEqual (const Iterator& theOther) const { return *this == theOther; } protected: void Init (const NCollection_BaseList& theList, NCollection_ListNode * const thePrev) { myCurrent = thePrev ? thePrev -> Next() : (NCollection_ListNode *)theList.PLast(); myPrevious = thePrev; } public: NCollection_ListNode * myCurrent; // Pointer to the current node NCollection_ListNode * myPrevious;// Pointer to the previous one friend class NCollection_BaseList; }; // End of nested class Iterator public: // ---------- PUBLIC METHODS ------------ // ******** Extent // Purpose: Returns the number of nodes in the list Standard_Integer Extent (void) const { return myLength; } // ******** IsEmpty // Purpose: Query if the list is empty Standard_Boolean IsEmpty (void) const { return (myFirst == NULL); } // ******** Allocator //! Returns attached allocator const Handle(NCollection_BaseAllocator)& Allocator() const { return myAllocator; } // ******** Destructor // Purpose: defines virtual interface virtual ~NCollection_BaseList (void) {} protected: // --------- PROTECTED METHODS ---------- // ******** Constructor // Purpose: Initializes an empty list NCollection_BaseList (const Handle(NCollection_BaseAllocator)& theAllocator=0L) : myFirst(NULL), myLast(NULL), myLength(0) { myAllocator = (theAllocator.IsNull() ? NCollection_BaseAllocator::CommonBaseAllocator() : theAllocator); } // ******** PClear // Purpose: deletes all nodes Standard_EXPORT void PClear (NCollection_DelListNode fDel); // ******** PFirst // Purpose: Returns pointer to the first node const NCollection_ListNode* PFirst (void) const { return myFirst; } // ******** PLast // Purpose: Returns pointer to the last node const NCollection_ListNode* PLast (void) const { return myLast; } // ******** PAppend // Purpose: Appends theNode at the end Standard_EXPORT void PAppend (NCollection_ListNode* theNode); // ******** PAppend // Purpose: Appends theNode at the end, returns iterator to the previous void PAppend (NCollection_ListNode* theNode, Iterator& theIt) { NCollection_ListNode * aPrev = myLast; PAppend (theNode); theIt.Init (* this, aPrev); } // ******** PAppend // Purpose: Appends theOther list at the end (clearing it) Standard_EXPORT void PAppend (NCollection_BaseList& theOther); // ******** PPrepend // Purpose: Prepends theNode at the beginning Standard_EXPORT void PPrepend (NCollection_ListNode* theNode); // ******** PPrepend // Purpose: Prepends theOther list at the beginning (clearing it) Standard_EXPORT void PPrepend (NCollection_BaseList& theOther); // ******** PRemoveFirst // Purpose: Removes first node Standard_EXPORT void PRemoveFirst (NCollection_DelListNode fDel); // ******** PRemove // Purpose: Removes the node pointed by theIter[ator] Standard_EXPORT void PRemove (Iterator& theIter, NCollection_DelListNode fDel); // ******** PInsertBefore // Purpose: Inserts theNode before one pointed by theIter[ator] Standard_EXPORT void PInsertBefore (NCollection_ListNode* theNode, Iterator& theIter); // ******** PInsertBefore // Purpose: Inserts theOther list before the node pointed by theIter[ator] Standard_EXPORT void PInsertBefore (NCollection_BaseList& theOther, Iterator& theIter); // ******** PInsertAfter // Purpose: Inserts theNode after one pointed by theIter[ator] Standard_EXPORT void PInsertAfter (NCollection_ListNode* theNode, Iterator& theIter); // ******** PInsertAfter // Purpose: Inserts theOther list after the node pointed by theIter[ator] Standard_EXPORT void PInsertAfter (NCollection_BaseList& theOther, Iterator& theIter); // ******** PReverse // Purpose: Reverse the list Standard_EXPORT void PReverse (); protected: // ------------ PROTECTED FIELDS ------------ Handle(NCollection_BaseAllocator) myAllocator; NCollection_ListNode * myFirst; // Pointer to the head NCollection_ListNode * myLast; // Pointer to the tail Standard_Integer myLength; // Actual length // ------------ FRIEND CLASSES ------------ friend class Iterator; }; #endif