1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
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.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #ifndef _Standard_DefineHandle_HeaderFile
16 #define _Standard_DefineHandle_HeaderFile
18 #ifndef _Standard_Macro_HeaderFile
19 #include <Standard_Macro.hxx>
22 class Standard_Transient;
23 class Standard_Persistent;
24 class Handle_Standard_Type;
28 #define IMPLEMENT_DOWNCAST(C1,BC) \
29 Handle(C1) Handle(C1)::DownCast(const Handle(BC)& AnObject) \
31 Handle(C1) _anOtherObject; \
33 if (!AnObject.IsNull()) { \
34 if (AnObject->IsKind(STANDARD_TYPE(C1))) { \
35 _anOtherObject = Handle(C1)((Handle(C1)&)AnObject); \
39 return _anOtherObject ; \
42 #define DEFINE_STANDARD_HANDLECLASS(C1,C2,BC) \
44 Standard_EXPORT const Handle(Standard_Type)& STANDARD_TYPE(C1); \
46 class Handle(C1) : public Handle(C2) { \
48 typedef C1 element_type;\
50 Handle(C1)():Handle(C2)() {} \
52 Handle(C1)(const Handle(C1)& aHandle) : Handle(C2)(aHandle) {} \
54 Handle(C1)(const C1* anItem) : Handle(C2)((C2 *)anItem) {} \
56 Handle(C1)& operator=(const Handle(C1)& aHandle) \
58 Assign(aHandle.Access()); \
62 Handle(C1)& operator=(const C1* anItem) \
64 Assign((BC *)anItem); \
68 C1& operator*() const \
70 return *(C1 *)ControlAccess(); \
73 C1* operator->() const \
75 return (C1 *)ControlAccess(); \
78 Standard_EXPORT static Handle(C1) DownCast(const Handle(BC)& AnObject); \
83 #define DEFINE_STANDARD_HANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Transient)
85 #define IMPLEMENT_STANDARD_HANDLE(C1,C2) IMPLEMENT_DOWNCAST(C1,Standard_Transient)
89 #define DEFINE_STANDARD_PHANDLE(C1,C2) DEFINE_STANDARD_HANDLECLASS(C1,C2,Standard_Persistent)
91 #define IMPLEMENT_STANDARD_PHANDLE(C1,C2) IMPLEMENT_DOWNCAST(C1,Standard_Persistent)
95 #define DEFINE_STANDARD_RTTI(C1) \
96 Standard_EXPORT virtual const Handle(Standard_Type)& DynamicType() const;
98 #define IMPLEMENT_STANDARD_RTTI(C1) \
99 const Handle(Standard_Type)& C1::DynamicType() const \
101 return STANDARD_TYPE(C1); \
104 #define IMPLEMENT_STANDARD_TYPE(C1) \
105 static Handle(Standard_Type) aType##C1 = STANDARD_TYPE(C1); \
107 const Handle(Standard_Type)& STANDARD_TYPE(C1) \
110 #define IMPLEMENT_STANDARD_SUPERTYPE(Cn) /* Left to ensure source compatibility with Open CASCADE 6.3 and earlier */
112 #define IMPLEMENT_STANDARD_SUPERTYPE_ARRAY() \
113 static Handle(Standard_Transient) _Ancestors[]= {
115 #define IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_ENTRY(Cn) \
118 #define IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_END() \
122 #define IMPLEMENT_STANDARD_TYPE_END(C1) \
123 static Handle(Standard_Type) _aType = new Standard_Type(#C1,sizeof(C1),1, \
124 (Standard_Address)_Ancestors, \
125 (Standard_Address)NULL); \
129 #define IMPLEMENT_STANDARD_RTTIEXT(C1,C2) \
130 IMPLEMENT_STANDARD_RTTI(C1) \
131 IMPLEMENT_STANDARD_TYPE(C1) \
132 IMPLEMENT_STANDARD_SUPERTYPE(C2) \
133 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY() \
134 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_ENTRY(C2) \
135 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_END() \
136 IMPLEMENT_STANDARD_TYPE_END(C1)