0022815: Missing delete operator for placement new
[occt.git] / src / TDF / TDF_LabelNode.hxx
1 // File:        TDF_LabelNode.hxx
2 //              ------------------
3 // Author:      DAUTRY Philippe
4 //              <fid@fox.paris1.matra-dtv.fr>
5 // Copyright:   Matra Datavision 1997
6
7 // Version:     0.0
8 // History:     Version Date            Purpose
9 //              0.0     Feb  6 1997     Creation
10
11 //#include <TDF_Data.hxx>
12
13 #ifndef TDF_LabelNode_HeaderFile
14 #define TDF_LabelNode_HeaderFile
15
16 #include <TCollection_AsciiString.hxx>
17 #include <TDF_Attribute.hxx>
18 #include <TDF_LabelNodePtr.hxx>
19 #include <NCollection_IncAllocator.hxx>
20
21 class TDF_Attribute;
22 class TDF_AttributeIterator;
23 class TDF_ChildIterator;
24 class TDF_Data;
25 class Handle_TDF_Data;
26 class TDF_Label;
27
28 #define KEEP_LOCAL_ROOT
29
30 enum {
31   TDF_LabelNodeImportMsk = (int) 0x80000000, // Because the sign bit (HP).
32   TDF_LabelNodeAttModMsk = 0x40000000,
33   TDF_LabelNodeMayModMsk = 0x20000000,
34   TDF_LabelNodeFlagsMsk = (TDF_LabelNodeImportMsk \
35                          | TDF_LabelNodeAttModMsk \
36                          | TDF_LabelNodeMayModMsk)
37 };
38
39 //=======================================================================
40 //class: TDF_LabelNode
41 //=======================================================================
42
43 class TDF_LabelNode {
44
45   public :
46
47   // Public Methods
48   // --------------------------------------------------------------------------
49
50   // Father access
51   inline TDF_LabelNode* Father() const
52     { return myFather; };
53
54   // Brother access
55   inline TDF_LabelNode* Brother() const
56     { return myBrother; };
57
58   // Child access
59   inline TDF_LabelNode* FirstChild() const
60     { return myFirstChild; };
61
62     // Attribute access
63   inline const Handle(TDF_Attribute)& FirstAttribute() const
64     { return myFirstAttribute; };
65
66   // Tag access
67   inline Standard_Integer Tag() const
68     { return myTag; };
69
70   // Depth access
71   inline Standard_Integer Depth() const
72     { return (myFlags & ~TDF_LabelNodeFlagsMsk); };
73
74   // IsRoot
75   inline Standard_Boolean IsRoot() const
76     { return myFather == NULL; };
77
78   // Data
79   Standard_EXPORT TDF_Data * Data() const;
80
81   // Flag AttributesModified access
82   inline void AttributesModified(const Standard_Boolean aStatus)
83     {
84       myFlags = (aStatus) ?
85         (myFlags | TDF_LabelNodeAttModMsk) :
86           (myFlags & ~TDF_LabelNodeAttModMsk);
87       if (aStatus) AllMayBeModified();
88     };
89
90   inline Standard_Boolean AttributesModified() const
91     { return ((myFlags & TDF_LabelNodeAttModMsk) != 0); };
92
93   // Flag MayBeModified access
94   inline void MayBeModified(const Standard_Boolean aStatus)
95     { myFlags = (aStatus) ?
96         (myFlags | TDF_LabelNodeMayModMsk) :
97           (myFlags & ~TDF_LabelNodeMayModMsk); };
98
99   inline Standard_Boolean MayBeModified() const
100     { return ((myFlags & TDF_LabelNodeMayModMsk) != 0); };
101
102   // Constructor
103   TDF_LabelNode(TDF_Data* Data); // Useful for root node.
104   
105   // Destructor
106   ~TDF_LabelNode();
107
108   // Memory management
109   void * operator new (size_t aSize,
110                        const Handle(NCollection_IncAllocator)& anAlloc)
111         { return anAlloc -> Allocate (aSize); }
112 #if !defined(__BORLANDC__) && (!defined(__SUNPRO_CC) || (__SUNPRO_CC > 0x530))
113   void  operator delete (void* theAddress,
114                          const Handle(NCollection_IncAllocator)& anAlloc)
115   {
116   }
117 #endif 
118   void  operator delete(void *) { }
119         // nothing to do in operator delete since IncAllocator does not need it
120   // Public Friends
121   // --------------------------------------------------------------------------
122
123   friend class TDF_Data;
124   friend class TDF_Label;
125
126   private :
127
128   void* operator new(size_t);
129
130   // Private Methods
131   // --------------------------------------------------------------------------
132
133   // Constructor
134   TDF_LabelNode(const Standard_Integer Tag, TDF_LabelNode* Father);
135
136   // Others
137   void AddAttribute(const Handle(TDF_Attribute)& afterAtt,
138                     const Handle(TDF_Attribute)& newAtt);
139
140   void RemoveAttribute(const Handle(TDF_Attribute)& afterAtt,
141                        const Handle(TDF_Attribute)& oldAtt);
142
143   TDF_LabelNode* RootNode ();
144
145   const TDF_LabelNode* RootNode () const;
146
147   Standard_EXPORT void AllMayBeModified();
148
149   // Tag modification
150   inline void Tag(const Standard_Integer aTag)
151     { myTag = aTag; };
152
153   // Depth modification
154   inline void Depth(const Standard_Integer aDepth)
155     { myFlags = ((myFlags & TDF_LabelNodeFlagsMsk) | aDepth); };
156
157   // Flag Imported access
158   inline void Imported(const Standard_Boolean aStatus)
159     { myFlags = (aStatus) ?
160         (myFlags | TDF_LabelNodeImportMsk) :
161           (myFlags & ~TDF_LabelNodeImportMsk); };
162
163   inline Standard_Boolean IsImported() const
164     { return ((myFlags & TDF_LabelNodeImportMsk) != 0); };
165
166   // Private Fields
167   // --------------------------------------------------------------------------
168
169   TDF_LabelNodePtr       myFather; 
170   TDF_LabelNodePtr       myBrother; 
171   TDF_LabelNodePtr       myFirstChild;
172   TDF_LabelNodePtr       myLastFoundChild; //jfa 10.01.2003
173   Standard_Integer       myTag;
174   Standard_Integer       myFlags; // Flags & Depth
175   Handle(TDF_Attribute)  myFirstAttribute;
176 #ifdef KEEP_LOCAL_ROOT
177   TDF_Data *             myData;
178 #endif
179 #ifdef DEB
180   TCollection_AsciiString myDebugEntry;
181 #endif
182 };
183
184 #endif