Polygon Crucher SDK - Documentation
Documentation
Loading...
Searching...
No Matches
XObject.h
1// CXObject.h: interface for the CXObject class.
2//
3//////////////////////////////////////////////////////////////////////
4
5#if !defined(CXOBJECT_INCLUDE_H)
6#define CXOBJECT_INCLUDE_H
7
8#ifdef _MSC_VER
9#pragma once
10#endif // _MSC_VER
11
12BEGIN_MOOTOOLS_NAMESPACE
13
14 void ReleaseXRuntimeObject();
15
16 class CXArchive;
17 class CXObject;
18
19 // temporary
20 typedef const CXRuntimeClass * CXRuntimeClassPtr;
21 typedef const CXObject * CXObjectPtr;
22 struct DLL_TOOLSFUNCTION CXRuntimeClass
23 {
24 typedef enum
25 {
26 FLAGS_NOT_SERIALIZABLE = 0x10000000,
27 FLAGS_SUPPORT_OLD_VERSION = 0x20000000,
28 FLAGS_RESERVED_FLAGS = 0xFF000000,
29 } RUNTIMECLASS_FLAGS;
30
31 // Attributes
32 LPCSTR className;
33 const size_t classSizeof;
34 const unsigned int classVersion;
35 const CXRuntimeClassPtr baseClass;
36 CXObject* (*pfnCreateObject)(); // NULL => abstract class, allow to create an object using it's runtime class
37
38 public:
39 // dynamic name lookup and creation
40 static CXObject* CreateObject(LPCSTR lpszClassName);
41
42 // Operations
43 CXObject *CreateObject() const;
44 bool IsDerivedFrom(CXRuntimeClassPtr pBaseClass) const;
45 static bool DeclareRuntimeClass(CXRuntimeClassPtr runtimeClass);
46
47 // Serialization
48#ifndef MOOTOOLS_NO_ARCHIVE_SUPPORT
49 bool IsSerializable() const;
50 void Save(CXArchive& ar) const;
51 static CXRuntimeClassPtr Load(CXArchive& ar, unsigned int& version);
52#endif // !MOOTOOLS_NO_ARCHIVE_SUPPORT
53
54 #if defined(_DEBUG)
55 void Dump() const;
56 #endif
57 };
58
59 class DLL_TOOLSFUNCTION NOVTABLE CXObject
60 {
61 friend CXRuntimeClass;
62
63 public:
64 virtual ~CXObject();
65
66 virtual CXRuntimeClassPtr GetRuntimeClassDescriptor() const;
67 virtual void Serialize(CXArchive& ar);
68 bool IsKindOf(const CXRuntimeClassPtr runtimeClass) const;
69
70 #if defined(_DEBUG)
71 virtual void Dump() const;
72 #endif
73
74 static const CXRuntimeClass classCreatorCXObject;
75 static const CXRuntimeClassPtr GetThisRuntimeClassDescriptor();
76
77 protected:
78 CXObject();
79
80 // Disable the copy constructor and assignment by default
81 CXObject(const CXObject& objectSrc);
82 void operator=(const CXObject& objectSrc);
83 };
84
85
86 inline CXObject::CXObject()
87 {
88 }
89
90 #define IS_XRUNTIMECLASS_FLAG_SET(version, flag, set) (!!(version & flag) == set)
91 #define GET_XRUNTIMECLASS_VERSION(version) (version & ~CXRuntimeClass::FLAGS_RESERVED_FLAGS)
92 #define XOBJECT_VERSIONABLE (CXRuntimeClass::FLAGS_SUPPORT_OLD_VERSION)
93 #define XASSERT_KINDOF(class_name, object) \
94 XASSERT((object)->IsKindOf(XRUNTIME_CLASS(class_name)))
95
96 // calling object::GetThisRuntimeClassDescriptor() instead accessing object::classCreator##object avoid delay load problems
97 #define XRUNTIME_CLASS(object) (object::GetThisRuntimeClassDescriptor())
98 #define DECLARE_XRUNTIMECLASS(object) \
99 public: \
100 static const CXRuntimeClass classCreator##object; \
101 static const CXRuntimeClassPtr GetThisRuntimeClassDescriptor(); \
102 virtual CXRuntimeClassPtr GetRuntimeClassDescriptor() const \
103 { \
104 return XRUNTIME_CLASS(object); \
105 }
106
107 #define DECLARE_DYNCREATE_XRUNTIMECLASS(object) \
108 DECLARE_XRUNTIMECLASS(object) \
109 static CXObject *CreateObject();
110 #define DECLARE_SERIAL_XRUNTIMECLASS(object) \
111 DECLARE_XRUNTIMECLASS(object) \
112 static CXObject *CreateObject();
113
114
115 #define IMPLEMENT_XRUNTIMECLASS(object, baseObject, serializeVersion, createObject) \
116 const CXRuntimeClass object::classCreator##object = \
117 { #object, sizeof(object), serializeVersion, &baseObject::classCreator##baseObject, createObject}; \
118 const bool classDeclared##object = CXRuntimeClass::DeclareRuntimeClass(&object::classCreator##object);
119
120 #define IMPLEMENT_DYNAMIC_XOBJECT(object, baseObject) \
121 const CXRuntimeClassPtr object::GetThisRuntimeClassDescriptor() { return &object::classCreator##object; } \
122 IMPLEMENT_XRUNTIMECLASS(object, baseObject, CXRuntimeClass::FLAGS_NOT_SERIALIZABLE, NULL)
123
124 #define IMPLEMENT_DYNCREATE_XOBJECT(object, baseObject) \
125 CXObject *object::CreateObject() \
126 { \
127 return xNew(object); \
128 } \
129 const CXRuntimeClassPtr object::GetThisRuntimeClassDescriptor() { return &object::classCreator##object; } \
130 IMPLEMENT_XRUNTIMECLASS(object, baseObject, CXRuntimeClass::FLAGS_NOT_SERIALIZABLE, object::CreateObject)
131
132 #define IMPLEMENT_SERIAL_XOBJECT(object, baseObject, serializeVersion) \
133 CXObject *object::CreateObject() \
134 { \
135 return xNew(object); \
136 } \
137 const CXRuntimeClassPtr object::GetThisRuntimeClassDescriptor() { return &object::classCreator##object; } \
138 IMPLEMENT_XRUNTIMECLASS(object, baseObject, serializeVersion, object::CreateObject)
139
140 #define DECLARE_DYNAMIC_XOBJECT DECLARE_XRUNTIMECLASS
141 #define DECLARE_DYNCREATE_XOBJECT DECLARE_DYNCREATE_XRUNTIMECLASS
142 #define DECLARE_SERIAL_XOBJECT DECLARE_SERIAL_XRUNTIMECLASS
143
144END_MOOTOOLS_NAMESPACE
145
146#endif // !defined(CXOBJECT_INCLUDE_H)
The class defines an x, y, z 3D point which can use int, float or double.
Definition 3DPoint.h:27
Definition XArchive.h:17