1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-08 18:40:55 +03:00
occt/src/MAT/MAT_TList.gxx
msv 23c2ae55c7 0031120: Memory leak in BRepOffsetAPI_MakeOffset
Add destructor of MAT2d_Mat2d - full removal of edges and bisectors.
2019-12-17 15:51:06 +03:00

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;
}