0030692: Data Exchange - introduce base framework RWMesh for importing mesh data...
[occt.git] / src / XCAFPrs / XCAFPrs_DocumentIdIterator.hxx
1 // Author: Kirill Gavrilov
2 // Copyright (c) 2017-2019 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _XCAFPrs_DocumentIdIterator_HeaderFile
16 #define _XCAFPrs_DocumentIdIterator_HeaderFile
17
18 #include <XCAFPrs_Style.hxx>
19
20 #include <TDF_ChildIterator.hxx>
21 #include <TDF_Label.hxx>
22 #include <TopLoc_Location.hxx>
23
24 //! Auxiliary tool for iterating through Path identification string.
25 class XCAFPrs_DocumentIdIterator
26 {
27 public:
28   //! Main constructor.
29   XCAFPrs_DocumentIdIterator (const TCollection_AsciiString& thePath)
30   : myPath (thePath), myPosition (0)
31   {
32     Next();
33   }
34
35   //! Return TRUE if iterator points to a value.
36   bool More() const { return !mySubId.IsEmpty(); }
37
38   //! Return current value.
39   const TCollection_AsciiString& Value() const { return mySubId; }
40
41   //! Find the next value.
42   void Next();
43
44 private:
45
46   // Disable assignment operator.
47   XCAFPrs_DocumentIdIterator& operator= (const XCAFPrs_DocumentIdIterator& );
48
49 private:
50   const TCollection_AsciiString& myPath;     //!< full path
51   TCollection_AsciiString        mySubId;    //!< current value
52   Standard_Integer               myPosition; //!< last processed new-line symbol
53 };
54
55 // =======================================================================
56 // function : Next
57 // purpose  :
58 // =======================================================================
59 inline void XCAFPrs_DocumentIdIterator::Next()
60 {
61   for (Standard_Integer aCharIndex = myPosition + 1; aCharIndex <= myPath.Length(); ++aCharIndex)
62   {
63     if (myPath.Value (aCharIndex) == '/')
64     {
65       // intermediate items have trailing dot and separator before the next item
66       const Standard_Integer aLen = aCharIndex - myPosition - 2;
67       if (aLen < 1)
68       {
69         return; // assert - should never happen for valid IDs!
70       }
71
72       mySubId = myPath.SubString (myPosition + 1, aCharIndex - 2);
73       myPosition = aCharIndex;
74       return;
75     }
76   }
77   if (myPosition < myPath.Length())
78   {
79     // last item has only trailing dot
80     mySubId = myPath.SubString (myPosition + 1, myPath.Length() - 1);
81     myPosition = myPath.Length();
82   }
83   else
84   {
85     mySubId.Clear();
86     myPosition = myPath.Length();
87   }
88 }
89
90 #endif // _XCAFPrs_DocumentIdIterator_HeaderFile