Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/opencascade/MAT_TList.gxx is written in an unsupported language. File is not indexed.

0001 // Created on: 1992-06-24
0002 // Created by: Gilles DEBARBOUILLE
0003 // Copyright (c) 1992-1999 Matra Datavision
0004 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0005 //
0006 // This file is part of Open CASCADE Technology software library.
0007 //
0008 // This library is free software; you can redistribute it and/or modify it under
0009 // the terms of the GNU Lesser General Public License version 2.1 as published
0010 // by the Free Software Foundation, with special exception defined in the file
0011 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0012 // distribution for complete text of the license and disclaimer of any warranty.
0013 //
0014 // Alternatively, this file may be used under the terms of Open CASCADE
0015 // commercial license or contractual agreement.
0016 
0017 //=======================================================================
0018 //function : MAT_TList
0019 //purpose  : 
0020 //=======================================================================
0021 
0022 MAT_TList::MAT_TList()
0023 {
0024   thecurrentindex  = 0;
0025   thenumberofitems = 0;
0026 }
0027 
0028 //=======================================================================
0029 //function : First
0030 //purpose  : 
0031 //=======================================================================
0032 
0033 void MAT_TList::First()
0034 {
0035   thecurrentnode = thefirstnode;
0036   thecurrentindex = 1;
0037 }
0038 
0039 //=======================================================================
0040 //function : Last
0041 //purpose  : 
0042 //=======================================================================
0043 
0044 void MAT_TList::Last()
0045 {
0046   thecurrentnode = thelastnode;
0047   thecurrentindex = thenumberofitems;
0048 }
0049 
0050 //=======================================================================
0051 //function : Init
0052 //purpose  : 
0053 //=======================================================================
0054 
0055 void MAT_TList::Init(const Item& anitem)
0056 {
0057   First();
0058   while(More())
0059     {
0060       if(anitem == thecurrentnode->GetItem()) break;
0061       Next();
0062     }
0063 }
0064 
0065 //=======================================================================
0066 //function : Next
0067 //purpose  : 
0068 //=======================================================================
0069 
0070 void MAT_TList::Next()
0071 {
0072   if(!IsEmpty())
0073     {
0074       thecurrentnode = thecurrentnode->Next();
0075       thecurrentindex = (thecurrentindex % thenumberofitems) + 1;
0076     }
0077 }
0078 
0079 //=======================================================================
0080 //function : Previous
0081 //purpose  : 
0082 //=======================================================================
0083 
0084 void MAT_TList::Previous()
0085 {
0086   if(!IsEmpty())
0087     {
0088       thecurrentnode = thecurrentnode->Previous();
0089       thecurrentindex = ((thecurrentindex+thenumberofitems-2)%thenumberofitems)+1;
0090     }
0091 }
0092 
0093 //=======================================================================
0094 //function : More
0095 //purpose  : 
0096 //=======================================================================
0097 
0098 Standard_Boolean MAT_TList::More() const
0099 {
0100   return (!thecurrentnode.IsNull());
0101 }
0102 
0103 //=======================================================================
0104 //function : Current
0105 //purpose  : 
0106 //=======================================================================
0107 
0108 Item MAT_TList::Current() const
0109 {
0110   return thecurrentnode->GetItem();
0111 }
0112 
0113 //=======================================================================
0114 //function : Current
0115 //purpose  : 
0116 //=======================================================================
0117 
0118 void MAT_TList::Current(const Item& anitem) const
0119 {
0120   thecurrentnode->SetItem(anitem);
0121 }
0122 
0123 //=======================================================================
0124 //function : FirstItem
0125 //purpose  : 
0126 //=======================================================================
0127 
0128 Item MAT_TList::FirstItem() const
0129 {
0130   return thefirstnode->GetItem();
0131 }
0132 
0133 //=======================================================================
0134 //function : LastItem
0135 //purpose  : 
0136 //=======================================================================
0137 
0138 Item MAT_TList::LastItem() const
0139 {
0140   return thelastnode->GetItem();
0141 }
0142 
0143 //=======================================================================
0144 //function : PreviousItem
0145 //purpose  : 
0146 //=======================================================================
0147 
0148 Item MAT_TList::PreviousItem() const
0149 {
0150   return thecurrentnode->Previous()->GetItem();
0151 }
0152 
0153 //=======================================================================
0154 //function : NextItem
0155 //purpose  : 
0156 //=======================================================================
0157 
0158 Item MAT_TList::NextItem() const
0159 {
0160   return thecurrentnode->Next()->GetItem();
0161 }
0162 
0163 //=======================================================================
0164 //function : Brackets
0165 //purpose  : 
0166 //=======================================================================
0167 
0168 Item MAT_TList::Brackets (const Standard_Integer anindex)
0169 {
0170   if(thecurrentindex > anindex)
0171     {
0172       while(thecurrentindex != anindex)
0173         {
0174           thecurrentindex--;
0175           thecurrentnode = thecurrentnode->Previous();
0176         }
0177     }
0178   else if(thecurrentindex < anindex)
0179     {
0180       while(thecurrentindex != anindex)
0181         {
0182           thecurrentindex++;
0183           thecurrentnode = thecurrentnode->Next();
0184         }
0185     }
0186   return thecurrentnode->GetItem();
0187 }
0188 
0189 //=======================================================================
0190 //function : Unlink
0191 //purpose  : 
0192 //=======================================================================
0193 
0194 void MAT_TList::Unlink()
0195 {
0196   Standard_Boolean previousisnull = thecurrentnode->Previous().IsNull();
0197   Standard_Boolean nextisnull = thecurrentnode->Next().IsNull();
0198 
0199   if(thecurrentindex)
0200   {
0201     if(!nextisnull)
0202     {
0203       thecurrentnode->Next()->Previous(thecurrentnode->Previous());
0204     }
0205     if (!previousisnull)
0206     {
0207       thecurrentnode->Previous()->Next(thecurrentnode->Next());
0208     }
0209 
0210     if(thecurrentindex == 1)
0211     {
0212       thefirstnode = thecurrentnode->Next();
0213     }
0214     else if(thecurrentindex == thenumberofitems)
0215     {
0216       thelastnode = thecurrentnode->Previous();
0217     }
0218   }
0219   thenumberofitems--;
0220   thecurrentindex--;
0221 }
0222 
0223 //=======================================================================
0224 //function : LinkBefore
0225 //purpose  : 
0226 //=======================================================================
0227 
0228 void MAT_TList::LinkBefore(const Item& anitem)
0229 {
0230   thenumberofitems++;
0231   if(thecurrentindex)thecurrentindex++;
0232 
0233   Handle(MAT_TListNode) previous;
0234 
0235   Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
0236 
0237   if(!(thecurrentnode->Previous()).IsNull())
0238     {
0239       previous = thecurrentnode->Previous();
0240       previous->Next(node);
0241       node->Previous(previous);
0242     }
0243 
0244   if(thecurrentindex == 2)
0245     {
0246       thefirstnode = node;
0247     }
0248 
0249   thecurrentnode->Previous(node);
0250   node->Next(thecurrentnode);
0251 }
0252 
0253 //=======================================================================
0254 //function : LinkAfter
0255 //purpose  : 
0256 //=======================================================================
0257 
0258 void MAT_TList::LinkAfter(const Item& anitem)
0259 {
0260   thenumberofitems++;
0261   Handle(MAT_TListNode) next;
0262 
0263   Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
0264 
0265   if(!(thecurrentnode->Next()).IsNull())
0266     {
0267       next = thecurrentnode->Next();
0268       next->Previous(node);
0269       node->Next(next);
0270     }
0271 
0272   if(thecurrentindex+1 ==thenumberofitems)
0273     {
0274       thelastnode = node;
0275     }
0276 
0277   thecurrentnode->Next(node);
0278   node->Previous(thecurrentnode);
0279 }
0280 
0281 //=======================================================================
0282 //function : FrontAdd
0283 //purpose  : 
0284 //=======================================================================
0285 
0286 void MAT_TList::FrontAdd(const Item& anitem)
0287 {
0288   thenumberofitems++;
0289   if(thecurrentindex)thecurrentindex++;
0290 
0291   Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
0292 
0293   if(!thefirstnode.IsNull())
0294     {
0295       thefirstnode->Previous(node);
0296       node->Next(thefirstnode);
0297     }
0298   else
0299     {
0300       thelastnode = node;
0301     }
0302 
0303   thefirstnode = node;
0304 }
0305 
0306 //=======================================================================
0307 //function : BackAdd
0308 //purpose  : 
0309 //=======================================================================
0310 
0311 void MAT_TList::BackAdd(const Item& anitem)
0312 {
0313   thenumberofitems++;
0314   Handle(MAT_TListNode) node = new MAT_TListNode(anitem);
0315 
0316   if(!thelastnode.IsNull())
0317     {
0318       thelastnode->Next(node);
0319       node->Previous(thelastnode);
0320     }
0321   else
0322     {
0323       thefirstnode = node;
0324     }
0325 
0326   thelastnode = node;
0327 }
0328 
0329 //=======================================================================
0330 //function : Permute
0331 //purpose  : 
0332 //=======================================================================
0333 
0334 void MAT_TList::Permute()
0335 {
0336   Handle(MAT_TListNode) previous = thecurrentnode->Previous();
0337   Handle(MAT_TListNode) current  = thecurrentnode;
0338   Handle(MAT_TListNode) next     = thecurrentnode->Next();
0339   Handle(MAT_TListNode) nextnext = next->Next();
0340   Handle(MAT_TListNode) null;
0341 
0342   if(!previous.IsNull())
0343     {
0344       previous->Next(next);
0345       next->Previous(previous);
0346     }
0347   else
0348     {
0349       next->Previous(null);
0350     }
0351   next->Next(current);
0352   current->Previous(next);
0353   if(!nextnext.IsNull())
0354     {
0355       current->Next(nextnext);
0356       nextnext->Previous(current);
0357     }
0358   else
0359     {
0360       current->Next(null);
0361     }
0362   if(thefirstnode == current) thefirstnode = next;
0363   if(thelastnode  == next) thelastnode = current;
0364   thecurrentindex++;
0365 }
0366 
0367 //=======================================================================
0368 //function : Loop
0369 //purpose  : 
0370 //=======================================================================
0371 
0372 void MAT_TList::Loop() const
0373 {
0374   thelastnode->Next(thefirstnode);
0375   thefirstnode->Previous(thelastnode);
0376 }
0377 
0378 //=======================================================================
0379 //function : Dump
0380 //purpose  : 
0381 //=======================================================================
0382 
0383 void MAT_TList::Dump(const Standard_Integer ashift,
0384                      const Standard_Integer alevel)
0385 {
0386   for(First(); More(); Next()) Current()->Dump(ashift,alevel);
0387 }
0388 
0389 //=======================================================================
0390 //function : ~MAT_TList
0391 //purpose  : 
0392 //=======================================================================
0393 
0394 MAT_TList::~MAT_TList()
0395 {
0396   Handle(MAT_TListNode) aNode = thefirstnode;
0397   while (!aNode.IsNull())
0398   {
0399     Handle(MAT_TListNode) aNext = aNode->Next();
0400     aNode->Next (NULL);
0401     aNode->Previous (NULL);
0402     aNode = aNext;
0403   }
0404   thecurrentnode.Nullify();
0405   thefirstnode.Nullify();
0406   thelastnode.Nullify();
0407   thecurrentindex  = 0;
0408   thenumberofitems = 0;
0409 }