mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-08 18:40:55 +03:00
410 lines
10 KiB
Plaintext
410 lines
10 KiB
Plaintext
// Created on: 1992-06-24
|
|
// Created by: Gilles DEBARBOUILLE
|
|
// 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.
|
|
|
|
//=======================================================================
|
|
//function : MAT_TList
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
MAT_TList::MAT_TList()
|
|
{
|
|
thecurrentindex = 0;
|
|
thenumberofitems = 0;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : First
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::First()
|
|
{
|
|
thecurrentnode = thefirstnode;
|
|
thecurrentindex = 1;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Last
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Last()
|
|
{
|
|
thecurrentnode = thelastnode;
|
|
thecurrentindex = thenumberofitems;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Init
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Init(const Item& anitem)
|
|
{
|
|
First();
|
|
while(More())
|
|
{
|
|
if(anitem == thecurrentnode->GetItem()) break;
|
|
Next();
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Next
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Next()
|
|
{
|
|
if(!IsEmpty())
|
|
{
|
|
thecurrentnode = thecurrentnode->Next();
|
|
thecurrentindex = (thecurrentindex % thenumberofitems) + 1;
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Previous
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Previous()
|
|
{
|
|
if(!IsEmpty())
|
|
{
|
|
thecurrentnode = thecurrentnode->Previous();
|
|
thecurrentindex = ((thecurrentindex+thenumberofitems-2)%thenumberofitems)+1;
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : More
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean MAT_TList::More() const
|
|
{
|
|
return (!thecurrentnode.IsNull());
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Current
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::Current() const
|
|
{
|
|
return thecurrentnode->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Current
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Current(const Item& anitem) const
|
|
{
|
|
thecurrentnode->SetItem(anitem);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : FirstItem
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::FirstItem() const
|
|
{
|
|
return thefirstnode->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : LastItem
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::LastItem() const
|
|
{
|
|
return thelastnode->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : PreviousItem
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::PreviousItem() const
|
|
{
|
|
return thecurrentnode->Previous()->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : NextItem
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::NextItem() const
|
|
{
|
|
return thecurrentnode->Next()->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Brackets
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Item MAT_TList::Brackets (const Standard_Integer anindex)
|
|
{
|
|
if(thecurrentindex > anindex)
|
|
{
|
|
while(thecurrentindex != anindex)
|
|
{
|
|
thecurrentindex--;
|
|
thecurrentnode = thecurrentnode->Previous();
|
|
}
|
|
}
|
|
else if(thecurrentindex < anindex)
|
|
{
|
|
while(thecurrentindex != anindex)
|
|
{
|
|
thecurrentindex++;
|
|
thecurrentnode = thecurrentnode->Next();
|
|
}
|
|
}
|
|
return thecurrentnode->GetItem();
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Unlink
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Unlink()
|
|
{
|
|
Standard_Boolean previousisnull = thecurrentnode->Previous().IsNull();
|
|
Standard_Boolean nextisnull = thecurrentnode->Next().IsNull();
|
|
|
|
if(thecurrentindex)
|
|
{
|
|
if(!nextisnull)
|
|
{
|
|
thecurrentnode->Next()->Previous(thecurrentnode->Previous());
|
|
}
|
|
if (!previousisnull)
|
|
{
|
|
thecurrentnode->Previous()->Next(thecurrentnode->Next());
|
|
}
|
|
|
|
if(thecurrentindex == 1)
|
|
{
|
|
thefirstnode = thecurrentnode->Next();
|
|
}
|
|
else if(thecurrentindex == thenumberofitems)
|
|
{
|
|
thelastnode = thecurrentnode->Previous();
|
|
}
|
|
}
|
|
thenumberofitems--;
|
|
thecurrentindex--;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : LinkBefore
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::LinkBefore(const Item& anitem)
|
|
{
|
|
thenumberofitems++;
|
|
if(thecurrentindex)thecurrentindex++;
|
|
|
|
Handle(MAT_TListNode) previous;
|
|
|
|
Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
|
|
|
|
if(!(thecurrentnode->Previous()).IsNull())
|
|
{
|
|
previous = thecurrentnode->Previous();
|
|
previous->Next(node);
|
|
node->Previous(previous);
|
|
}
|
|
|
|
if(thecurrentindex == 2)
|
|
{
|
|
thefirstnode = node;
|
|
}
|
|
|
|
thecurrentnode->Previous(node);
|
|
node->Next(thecurrentnode);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : LinkAfter
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::LinkAfter(const Item& anitem)
|
|
{
|
|
thenumberofitems++;
|
|
Handle(MAT_TListNode) next;
|
|
|
|
Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
|
|
|
|
if(!(thecurrentnode->Next()).IsNull())
|
|
{
|
|
next = thecurrentnode->Next();
|
|
next->Previous(node);
|
|
node->Next(next);
|
|
}
|
|
|
|
if(thecurrentindex+1 ==thenumberofitems)
|
|
{
|
|
thelastnode = node;
|
|
}
|
|
|
|
thecurrentnode->Next(node);
|
|
node->Previous(thecurrentnode);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : FrontAdd
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::FrontAdd(const Item& anitem)
|
|
{
|
|
thenumberofitems++;
|
|
if(thecurrentindex)thecurrentindex++;
|
|
|
|
Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
|
|
|
|
if(!thefirstnode.IsNull())
|
|
{
|
|
thefirstnode->Previous(node);
|
|
node->Next(thefirstnode);
|
|
}
|
|
else
|
|
{
|
|
thelastnode = node;
|
|
}
|
|
|
|
thefirstnode = node;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : BackAdd
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::BackAdd(const Item& anitem)
|
|
{
|
|
thenumberofitems++;
|
|
Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
|
|
|
|
if(!thelastnode.IsNull())
|
|
{
|
|
thelastnode->Next(node);
|
|
node->Previous(thelastnode);
|
|
}
|
|
else
|
|
{
|
|
thefirstnode = node;
|
|
}
|
|
|
|
thelastnode = node;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Permute
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Permute()
|
|
{
|
|
Handle(MAT_TListNode) previous = thecurrentnode->Previous();
|
|
Handle(MAT_TListNode) current = thecurrentnode;
|
|
Handle(MAT_TListNode) next = thecurrentnode->Next();
|
|
Handle(MAT_TListNode) nextnext = next->Next();
|
|
Handle(MAT_TListNode) null;
|
|
|
|
if(!previous.IsNull())
|
|
{
|
|
previous->Next(next);
|
|
next->Previous(previous);
|
|
}
|
|
else
|
|
{
|
|
next->Previous(null);
|
|
}
|
|
next->Next(current);
|
|
current->Previous(next);
|
|
if(!nextnext.IsNull())
|
|
{
|
|
current->Next(nextnext);
|
|
nextnext->Previous(current);
|
|
}
|
|
else
|
|
{
|
|
current->Next(null);
|
|
}
|
|
if(thefirstnode == current) thefirstnode = next;
|
|
if(thelastnode == next) thelastnode = current;
|
|
thecurrentindex++;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Loop
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Loop() const
|
|
{
|
|
thelastnode->Next(thefirstnode);
|
|
thefirstnode->Previous(thelastnode);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : Dump
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void MAT_TList::Dump(const Standard_Integer ashift,
|
|
const Standard_Integer alevel)
|
|
{
|
|
for(First(); More(); Next()) Current()->Dump(ashift,alevel);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ~MAT_TList
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
MAT_TList::~MAT_TList()
|
|
{
|
|
Handle(MAT_TListNode) aNode = thefirstnode;
|
|
while (!aNode.IsNull())
|
|
{
|
|
Handle(MAT_TListNode) aNext = aNode->Next();
|
|
aNode->Next (NULL);
|
|
aNode->Previous (NULL);
|
|
aNode = aNext;
|
|
}
|
|
thecurrentnode.Nullify();
|
|
thefirstnode.Nullify();
|
|
thelastnode.Nullify();
|
|
thecurrentindex = 0;
|
|
thenumberofitems = 0;
|
|
}
|