// Created on: 2002-04-10 // 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. #ifndef NCollection_BaseSequence_HeaderFile #define NCollection_BaseSequence_HeaderFile #include "Standard.hxx" #include "NCollection_BaseAllocator.hxx" #include "NCollection_DefineAlloc.hxx" // **************************************** Class SeqNode ******************** class NCollection_SeqNode { public: // define new operator for use with NCollection allocators DEFINE_NCOLLECTION_ALLOC public: NCollection_SeqNode() noexcept : myNext(nullptr), myPrevious(nullptr) { } NCollection_SeqNode* Next() const noexcept { return myNext; } NCollection_SeqNode* Previous() const noexcept { return myPrevious; } void SetNext(NCollection_SeqNode* theNext) noexcept { myNext = theNext; } void SetPrevious(NCollection_SeqNode* thePrev) noexcept { myPrevious = thePrev; } private: NCollection_SeqNode* myNext; NCollection_SeqNode* myPrevious; }; typedef void (*NCollection_DelSeqNode)(NCollection_SeqNode*, occ::handle& theAl); /** * Purpose: This is a base class for the Sequence. It deals with * an indexed bidirectional list of NCollection_SeqNode's. */ class NCollection_BaseSequence { public: //! Memory allocation DEFINE_STANDARD_ALLOC DEFINE_NCOLLECTION_ALLOC public: class Iterator { public: //! Empty constructor Iterator() noexcept : myCurrent(nullptr), myPrevious(nullptr) { } //! Constructor with initialisation Iterator(const NCollection_BaseSequence& theSeq, const bool isStart) noexcept { Init(theSeq, isStart); } //! Initialisation void Init(const NCollection_BaseSequence& theSeq, const bool isStart = true) noexcept { myCurrent = (isStart ? theSeq.myFirstItem : nullptr); myPrevious = (isStart ? nullptr : theSeq.myLastItem); } //! Switch to previous element; note that it will reset void Previous() noexcept { myCurrent = myPrevious; if (myCurrent) myPrevious = myCurrent->Previous(); } protected: NCollection_SeqNode* myCurrent; //!< Pointer to the current node NCollection_SeqNode* myPrevious; //!< Pointer to the previous node friend class NCollection_BaseSequence; }; public: // Methods PUBLIC // bool IsEmpty() const noexcept { return (mySize == 0); } //! Number of items (legacy int-returning API). int Length() const noexcept { return static_cast(mySize); } //! Size - number of items. size_t Size() const noexcept { return mySize; } //! Returns attached allocator const occ::handle& Allocator() const noexcept { return myAllocator; } protected: // Methods PROTECTED // NCollection_BaseSequence(const occ::handle& theAllocator) : myFirstItem(nullptr), myLastItem(nullptr), myCurrentItem(nullptr), myCurrentIndex(0), mySize(0) { myAllocator = (theAllocator.IsNull() ? NCollection_BaseAllocator::CommonBaseAllocator() : theAllocator); } //! Destructor virtual ~NCollection_BaseSequence() = default; Standard_EXPORT void ClearSeq(NCollection_DelSeqNode fDel); Standard_EXPORT void PAppend(NCollection_SeqNode*); Standard_EXPORT void PAppend(NCollection_BaseSequence& S); Standard_EXPORT void PPrepend(NCollection_SeqNode*); Standard_EXPORT void PPrepend(NCollection_BaseSequence& S); Standard_EXPORT void PInsertAfter(Iterator& thePosition, NCollection_SeqNode*); Standard_EXPORT void PInsertAfter(const size_t Index, NCollection_SeqNode*); Standard_EXPORT void PInsertAfter(const size_t Index, NCollection_BaseSequence& S); Standard_EXPORT void PSplit(const size_t Index, NCollection_BaseSequence& Sub); Standard_EXPORT void RemoveSeq(Iterator& thePosition, NCollection_DelSeqNode fDel); Standard_EXPORT void RemoveSeq(const size_t Index, NCollection_DelSeqNode fDel); Standard_EXPORT void RemoveSeq(const size_t From, const size_t To, NCollection_DelSeqNode fDel); Standard_EXPORT void PReverse() noexcept; Standard_EXPORT void PExchange(const size_t I, const size_t J); Standard_EXPORT NCollection_SeqNode* Find(const size_t) const noexcept; protected: // Fields PROTECTED // occ::handle myAllocator; NCollection_SeqNode* myFirstItem; NCollection_SeqNode* myLastItem; NCollection_SeqNode* myCurrentItem; size_t myCurrentIndex; size_t mySize; private: // Methods PRIVATE // NCollection_BaseSequence(const NCollection_BaseSequence& Other) = delete; void Nullify() noexcept { myFirstItem = myLastItem = myCurrentItem = nullptr; myCurrentIndex = mySize = 0; } friend class Iterator; }; #endif