1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-09 18:50:54 +03:00
occt/src/TCollection/TCollection_Sequence.gxx

163 lines
6.2 KiB
Plaintext

// Created on: 1992-09-24
// Created by: Mireille MERCIEN
// 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 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.
// ----------------------------------------------------------------------
// 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_Sequence::InsertAfter() - index is out of range");
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, "TCollection_Sequence::First() - sequence is empty");
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, "TCollection_Sequence::Last() - sequence is empty");
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::Value() - index is out of range");
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, "TCollection_Sequence::ChangeValue() - index is out of range");
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 ;
}