]> OCCT Git - occt-copy.git/commitdiff
0031920: Application Framework - speed up methods of getting label by entry and vise... CR0_DMUReviewer_IR-2019-08-30_CR31920
authornds <nds@opencascade.com>
Sat, 5 Dec 2020 17:12:18 +0000 (20:12 +0300)
committernds <nds@opencascade.com>
Sat, 5 Dec 2020 17:17:20 +0000 (20:17 +0300)
src/TDF/TDF_Tool.cxx
src/TDF/TDF_Tool.hxx

index f587c69603f60895ca6599c17964d82cf1e803ed..74f108402f8168012da9ed6c08fb0b82f049ca07 100644 (file)
@@ -366,6 +366,12 @@ void TDF_Tool::RelocateLabel
   TDF_Tool::Label(toRoot.Data(),labelTags,aTargetLabel,create);
 }
 
+static int MyCounter = 0;
+
+int TDF_Tool::Counter()
+{
+  return MyCounter;
+}
 
 //=======================================================================
 //function : Entry
@@ -376,7 +382,8 @@ void TDF_Tool::Entry
 (const TDF_Label& aLabel,
  TCollection_AsciiString& anEntry)
 {
-  anEntry.Clear();
+  MyCounter++;
+  /*anEntry.Clear();
   if (!aLabel.IsNull()) {
     TColStd_ListOfInteger Tags;
     TDF_Tool::TagList(aLabel, Tags);
@@ -392,10 +399,41 @@ void TDF_Tool::Entry
        Tags.RemoveFirst();
       }
     }
+  }*/
+  if (!aLabel.IsNull()) {
+    int aStrLen = 1; // initial "0" of a root label
+    TDF_Label aLab = aLabel;
+    for (; !aLab.IsRoot(); aLab = aLab.Father())
+    {
+      for (int aTag = aLab.Tag(); aTag > 9; aTag /= 10)
+        ++aStrLen;
+      aStrLen += 2; // one digit and separator
+    }
+    if (aStrLen == 1)
+    {
+      // an exceptional case for the root label, it ends with separator
+      static const TCollection_AsciiString THE_ROOT_ENTRY = TCollection_AsciiString('0') + TDF_TagSeparator;
+      anEntry = THE_ROOT_ENTRY;
+    }
+    else
+    {
+      anEntry = TCollection_AsciiString(aStrLen, TDF_TagSeparator);
+      Standard_Character* aPtr = const_cast<Standard_Character*>(anEntry.ToCString() + aStrLen - 1);
+      for (aLab = aLabel; !aLab.IsRoot(); aLab = aLab.Father())
+      {
+        int aTag = aLab.Tag();
+        for (; aTag > 9; --aPtr, aTag /= 10)
+          *aPtr = Standard_Character(aTag % 10) + '0';
+        *aPtr = Standard_Character(aTag) + '0';
+        aPtr -= 2;
+      }
+      *aPtr = '0';
+    }
   }
+  else
+    anEntry.Clear();
 }
 
-
 //=======================================================================
 //function : TagList
 //purpose  : Returns the entry of a label as a list of integers.
index f78245b4db3fa0a16d77d6052542d130d7a74356..ad7397b1c3608c56a2686bc38bab7a3f284cd8fd 100644 (file)
@@ -41,6 +41,7 @@ public:
 
   DEFINE_STANDARD_ALLOC
 
+  Standard_EXPORT static int Counter();
   
   //! Returns the number of labels of the tree,
   //! including <aLabel>. aLabel is also included in this figure.