// Created on: 1992-09-24 // Created by: Mireille MERCIEN // Copyright (c) 1992-1999 Matra Datavision // Copyright (c) 1999-2012 OPEN CASCADE SAS // // The content of this file is subject to the Open CASCADE Technology Public // License Version 6.5 (the "License"). You may not use the content of this file // except in compliance with the License. Please obtain a copy of the License // at http://www.opencascade.org and read it completely before using this file. // // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. // // The Original Code and all software distributed under the License is // distributed on an "AS IS" basis, without warranty of any kind, and the // Initial Developer hereby disclaims all such warranties, including without // limitation, any warranties of merchantability, fitness for a particular // purpose or non-infringement. Please see the License for the specific terms // and conditions governing the rights and limitations under the License. // ---------------------------------------------------------------------- // Updated: Remi Lequette,J.P. TIRAULT February,23 1995 // we added a basic class BaseSequence where all // instantiations of Sequence inherit. // ---------------------------------------------------------------------- static void delnode(TCollection_SeqNode* p) { TCollection_SequenceNode* q = (TCollection_SequenceNode*) p; delete q; } // ---------------------------------- // Clear : Clear the Current Sequence // ---------------------------------- void TCollection_Sequence::Clear() { TCollection_BaseSequence::Clear((void*)&delnode); } //======================================================================= //function : Assign //purpose : //======================================================================= const TCollection_Sequence& TCollection_Sequence::Assign (const TCollection_Sequence& Other) { if (this == &Other) return *this; Clear(); TCollection_SequenceNode* current = (TCollection_SequenceNode*) Other.FirstItem; TCollection_SequenceNode* previous = NULL; TCollection_SequenceNode* newnode = NULL; FirstItem = NULL; while (current) { newnode = new TCollection_SequenceNode(current->Value(),previous,(TCollection_SeqNode*)0L); if (previous) previous->Next() = newnode; else FirstItem = newnode; current = (TCollection_SequenceNode *) current->Next(); previous = newnode; } LastItem = newnode; Size = Other.Size; CurrentItem = FirstItem; CurrentIndex = 1; return *this; } // ------------------------------------------------- // Append : Push an item at the end of the sequence // ------------------------------------------------- void TCollection_Sequence::Append(const SeqItem& T) { TCollection_SequenceNode* newnode = new TCollection_SequenceNode(T,(TCollection_SeqNode*)LastItem,(TCollection_SeqNode*)0L); PAppend ((void*)newnode); } // --------------------------------------------------------- // Prepend : Push an element at the begining of the sequence // --------------------------------------------------------- void TCollection_Sequence::Prepend(const SeqItem& T) { TCollection_SequenceNode* newnode = new TCollection_SequenceNode(T,(TCollection_SeqNode*)0L,(TCollection_SequenceNode*)FirstItem); PPrepend ((void*)newnode); } // ----------------------------------------------------------------- // InsertAfter : Insert an element after a given index in a sequence // ----------------------------------------------------------------- void TCollection_Sequence::InsertAfter(const Standard_Integer Index, const SeqItem& T) { Standard_OutOfRange_Raise_if ( Index < 0 || Index > Size, ""); TCollection_SequenceNode* newnode = new TCollection_SequenceNode(T,(TCollection_SeqNode*)0L,(TCollection_SeqNode*)0L); PInsertAfter (Index,(void*)newnode); } // --------------------------------------------------- // First : Returns the first element of the sequence // Raises an exeption if the sequence is empty // ---------------------------------------------------- const SeqItem& TCollection_Sequence::First() const { Standard_NoSuchObject_Raise_if(Size == 0,""); return ((TCollection_SequenceNode*) FirstItem)->Value(); } // ---------------------------------------------------- // Last : Returns the last element of the sequence // Raises an exeption if the sequence is empty // ---------------------------------------------------- const SeqItem& TCollection_Sequence::Last() const { Standard_NoSuchObject_Raise_if(Size == 0,""); return ((TCollection_SequenceNode*) LastItem)->Value(); } // ----------------------------------------- // Value : Return the value of a given index // ----------------------------------------- const SeqItem& TCollection_Sequence::Value(const Standard_Integer Index) const { Standard_OutOfRange_Raise_if(Index <= 0 || Index > Size,""); TCollection_Sequence* const aLocalTHIS = (TCollection_Sequence* const) this; aLocalTHIS->CurrentItem = (TCollection_SequenceNode*) Find(Index); aLocalTHIS->CurrentIndex = Index; return ((TCollection_SequenceNode*)CurrentItem)->Value(); } // ------------------------------------------------------- // ChangeValue : Return the modifiable value of a given index // ------------------------------------------------------- SeqItem & TCollection_Sequence::ChangeValue(const Standard_Integer Index) { Standard_OutOfRange_Raise_if(Index <= 0 || Index > Size,""); CurrentItem = (TCollection_SequenceNode*) Find(Index); CurrentIndex = Index; return ((TCollection_SequenceNode*)CurrentItem)->Value(); } void TCollection_Sequence::Remove(const Standard_Integer Index) { TCollection_BaseSequence::Remove(Index,(void*)&delnode); } // --------------------- // Remove a set of items // --------------------- void TCollection_Sequence::Remove(const Standard_Integer FromIndex, const Standard_Integer ToIndex) { TCollection_BaseSequence::Remove(FromIndex,ToIndex,(void*)&delnode); } //======================================================================= //function : SetValue //purpose : Sets a value to an index //======================================================================= void TCollection_Sequence::SetValue (const Standard_Integer Index, const SeqItem& I) { ChangeValue(Index) = I ; }