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 }