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