0022815: Missing delete operator for placement new
[occt.git] / src / Standard / Handle_Standard_Persistent.hxx
1 //============================================================================
2 //
3 // Title : Handle_Standard_Persistent.hxx 
4 // Role  : This file just include <Standard_Persistent.hxx>
5 //
6 //============================================================================
7
8 #ifndef _Handle_Standard_Persistent_HeaderFile
9 #define _Handle_Standard_Persistent_HeaderFile
10
11 #ifndef _Standard_DefineAlloc_HeaderFile
12 #include <Standard_DefineAlloc.hxx>
13 #endif
14 #ifndef _Standard_Macro_HeaderFile
15 #include <Standard_Macro.hxx>
16 #endif
17 #ifndef _Standard_PrimitiveTypes_HeaderFile
18 #include <Standard_PrimitiveTypes.hxx>
19 #endif
20 #ifndef _Standard_Persistent_proto_HeaderFile
21 #include <Standard_Persistent_proto.hxx>
22 #endif
23
24 #ifdef _WIN32
25 // Disable the warning "conversion from 'unsigned int' to Standard_Persistent *"
26 #pragma warning (push)
27 #pragma warning (disable:4312)
28 #endif
29
30 #ifndef PUndefinedAddress 
31 #ifdef _OCC64
32 #define PUndefinedAddress ((Standard_Persistent *)0xfefdfefdfefd0000)
33 #else
34 #define PUndefinedAddress ((Standard_Persistent *)0xfefd0000)
35 #endif
36 #endif
37
38 class Standard_Persistent;
39 class Handle_Standard_Type;
40 class Handle_Standard_Persistent;
41
42 Standard_EXPORT Standard_Integer HashCode(const Handle(Standard_Persistent)& ,
43                                           const Standard_Integer);
44
45 class Handle(Standard_Persistent)
46  {
47    private:
48
49     Standard_Persistent *entity;
50
51     Standard_EXPORT void RaiseNullObject(const Standard_CString S) const;
52
53     void BeginScope() const
54       {
55        if (entity != PUndefinedAddress) entity->count++;
56       }    
57
58     void EndScope()
59       {
60        if (entity != PUndefinedAddress) 
61          {
62           entity->count--;
63           if (entity->count == 0) {
64             entity->Delete();
65             entity = PUndefinedAddress ;
66           }
67         }
68       }
69
70
71    public:
72
73     DEFINE_STANDARD_ALLOC
74
75     Handle(Standard_Persistent)()
76       {
77        entity = PUndefinedAddress ;
78       }
79
80     Handle(Standard_Persistent)(const Handle(Standard_Persistent)& aTid) 
81       {
82        entity = aTid.entity;
83        BeginScope();
84       } 
85
86     Handle(Standard_Persistent)(const Standard_Persistent *anItem)
87       {
88        if (!anItem)
89            entity = PUndefinedAddress ;
90        else {
91          entity = (Standard_Persistent *)anItem;
92          BeginScope();
93        }
94       }
95
96      Standard_EXPORT void Dump(Standard_OStream& out) const;
97
98     Standard_EXPORT ~Handle(Standard_Persistent)();
99
100      Standard_EXPORT void  ShallowDump(Standard_OStream&) const;
101      
102     int operator==(const Handle(Standard_Persistent)& right) const
103       {
104        return entity == right.entity;
105       }
106
107     int operator==(const Standard_Persistent *right) const
108       {
109        return entity == right;
110       }
111
112     friend int operator==(const Standard_Persistent *left, const Handle(Standard_Persistent)& right)
113       {
114        return left == right.entity;
115       }
116
117     int operator!=(const Handle(Standard_Persistent)& right) const
118       {
119        return entity != right.entity;
120       }
121
122     int operator!=(const Standard_Persistent *right) const
123       {
124        return entity != right;
125       }
126
127     friend int operator!=(const Standard_Persistent *left, const Handle(Standard_Persistent)& right)
128       {
129        return left != right.entity;
130       }
131
132     void Nullify()
133       {
134        EndScope();
135        entity =  PUndefinedAddress ;
136       }
137
138     Standard_Boolean IsNull() const
139       {
140        return entity == PUndefinedAddress ;
141       } 
142
143     Standard_Persistent* Access() const
144       {
145        return entity;
146       } 
147
148    protected:
149
150     Standard_Persistent* ControlAccess() const
151       {
152        return entity;
153       } 
154
155     void Assign(const Standard_Persistent *anItem)
156       {
157        EndScope();
158        if (!anItem)
159            entity = PUndefinedAddress ;
160        else {
161          entity = (Standard_Persistent *)anItem;
162          BeginScope();
163        }
164       }
165
166
167   public:
168
169    operator Standard_Persistent*()
170      {
171        return Access();
172      }
173
174
175    Standard_EXPORT Handle(Standard_Persistent)& operator=(const Handle(Standard_Persistent)& aHandle);
176    Standard_EXPORT Handle(Standard_Persistent)& operator=(const Standard_Persistent* anItem);
177
178    Standard_Persistent* operator->() 
179      {
180       return ControlAccess();
181      }
182
183    Standard_Persistent* operator->() const
184      {
185       return ControlAccess();
186      }
187
188    Standard_Persistent& operator*()
189      {
190       return *(ControlAccess());
191      }
192
193    const Standard_Persistent& operator*() const
194      {
195       return *(ControlAccess());
196      }
197
198    Standard_EXPORT static const Handle(Standard_Persistent) DownCast(const Handle(Standard_Persistent)& AnObject);
199 };
200
201 class Standard_Type;
202
203 #ifdef _WIN32
204 #pragma warning (pop)
205 #endif
206
207 #endif