Salome HOME
Fix bug in test on 24 cores CPU test
[modules/kernel.git] / src / DF / DF_Label.cxx
index e6971f5dfd41635ef8104cf45afe89825bad2f57..476a418cd31be321753341e4345a2958b3e04b75 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -190,7 +190,7 @@ bool DF_Label::ForgetAllAttributes(bool clearChildren) const
   std::vector<DF_Attribute*> va = GetAttributes();
   _node->_attributes.clear();
 
-  for(int i = 0, len = va.size(); i<len; i++) {
+  for(size_t i = 0, len = va.size(); i<len; i++) {
     va[i]->BeforeForget();
     delete va[i];
   }
@@ -246,8 +246,8 @@ std::vector<DF_Attribute*> DF_Label::GetAttributes() const
     sorted.push_back(p->first);
     
   sort(sorted.begin(), sorted.end());
-  int len = sorted.size();    
-  for(int i = 0; i<len; i++)
+  size_t len = sorted.size();
+  for(size_t i = 0; i<len; i++)
     attributes.push_back(_node->_attributes[sorted[i]]);
 
   return attributes;
@@ -326,10 +326,21 @@ DF_Label DF_Label::FindChild(int theTag, bool isCreate)
     if(_node->_lastChild->_tag < theTag) aPrevious = _node->_lastChild;
   }
   
-  if(!aPrevious) { 
-    aLabel = _node->_firstChild;
+  if ( !aPrevious && _node->_firstChild )
+  {
+    // IPAL54049: Operations on multiple study objects are very long
+    // Use _node->_firstChild->_previous to store the last found child
+    if ( _node->_firstChild->_previous &&
+         _node->_firstChild->_previous->_tag <= theTag )
+      aLabel = _node->_firstChild->_previous;
+    else
+      aLabel = _node->_firstChild;
+
     while(aLabel) {
-      if(aLabel->_tag == theTag) return DF_Label(aLabel);
+      if(aLabel->_tag == theTag) {
+        _node->_firstChild->_previous = aLabel;
+        return DF_Label(aLabel);
+      }
       if(aLabel->_tag > theTag) {
         aNext = aLabel;
         break;
@@ -473,7 +484,7 @@ DF_LabelNode::~DF_LabelNode()
   for(AI p = _attributes.begin(); p!=_attributes.end(); p++)
     va.push_back(p->second);
 
-  for(int i = 0, len = va.size(); i<len; i++) 
+  for(size_t i = 0, len = va.size(); i<len; i++) 
     delete va[i];
 
   _attributes.clear();
@@ -490,7 +501,7 @@ void DF_LabelNode::Reset()
   for(AI p = _attributes.begin(); p!=_attributes.end(); p++)
     va.push_back(p->second);
 
-  for(int i = 0, len = va.size(); i<len; i++) 
+  for(size_t i = 0, len = va.size(); i<len; i++) 
     delete va[i];
 
   _attributes.clear();