00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef Reflex_UnionBuilder
00013 #define Reflex_UnionBuilder
00014
00015
00016 #include "Reflex/Builder/TypeBuilder.h"
00017 #include "Reflex/Member.h"
00018
00019 namespace Reflex {
00020
00021 class Union;
00022 class Type;
00023
00024
00025
00026
00027
00028
00029
00030 class RFLX_API UnionBuilderImpl {
00031 public:
00032
00033 UnionBuilderImpl(const char* nam, size_t size, const std::type_info & ti, unsigned int modifiers = 0, TYPE typ = UNION);
00034
00035
00036 virtual ~UnionBuilderImpl();
00037
00038
00039
00040
00041
00042
00043 void AddItem(const char* nam,
00044 const Type& typ);
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 void AddDataMember(const char* nam,
00055 const Type& typ,
00056 size_t offs,
00057 unsigned int modifiers = 0);
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 void AddFunctionMember(const char* nam,
00070 const Type& typ,
00071 StubFunction stubFP,
00072 void* stubCtx = 0,
00073 const char* params = 0,
00074 unsigned int modifiers = 0);
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 void AddProperty(const char* key,
00086 Any value);
00087 void AddProperty(const char* key,
00088 const char* value);
00089
00090
00091
00092
00093
00094 void SetSizeOf(size_t size);
00095
00096
00097
00098
00099
00100 Type ToType();
00101
00102 protected:
00103 friend class UnionBuilder;
00104
00105
00106
00107
00108
00109 void EnableCallback(const bool enable = true);
00110
00111 private:
00112
00113 Union* fUnion;
00114
00115
00116 Member fLastMember;
00117
00118
00119 bool fCallbackEnabled;
00120
00121 };
00122
00123
00124
00125
00126
00127
00128
00129
00130 class RFLX_API UnionBuilder {
00131 public:
00132
00133 UnionBuilder(const char* nam, const std::type_info & ti, size_t size, unsigned int modifiers = 0, TYPE typ = UNION);
00134
00135
00136 virtual ~UnionBuilder();
00137
00138
00139
00140
00141
00142
00143
00144 template <typename T> UnionBuilder& AddItem(const char* nam);
00145
00146
00147
00148
00149
00150
00151
00152 UnionBuilder& AddItem(const char* nam,
00153 const char* typ);
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 template <class T> UnionBuilder& AddDataMember(const char* nam,
00164 size_t offs,
00165 unsigned int modifiers = 0);
00166 UnionBuilder& AddDataMember(const Type& typ,
00167 const char* nam,
00168 size_t offs,
00169 unsigned int modifiers = 0);
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 template <class F> UnionBuilder& AddFunctionMember(const char* nam,
00183 StubFunction stubFP,
00184 void* stubCtx = 0,
00185 const char* params = 0,
00186 unsigned int modifiers = 0);
00187 UnionBuilder& AddFunctionMember(const Type& typ,
00188 const char* nam,
00189 StubFunction stubFP,
00190 void* stubCtx = 0,
00191 const char* params = 0,
00192 unsigned int modifiers = 0);
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 template <typename P> UnionBuilder& AddProperty(const char* key,
00203 P value);
00204
00205
00206
00207
00208
00209 UnionBuilder& SetSizeOf(size_t size);
00210
00211
00212
00213
00214
00215 Type ToType();
00216
00217 protected:
00218 #ifdef G__COMMON_H
00219 friend int::G__search_tagname(const char*, int);
00220 #endif
00221
00222
00223
00224
00225
00226 UnionBuilder& EnableCallback(const bool enable = true);
00227
00228 private:
00229
00230 UnionBuilderImpl fUnionBuilderImpl;
00231
00232 };
00233
00234 }
00235
00236
00237 template <typename T> Reflex::UnionBuilder&
00238 Reflex::UnionBuilder::AddItem(const char* nam) {
00239
00240 fUnionBuilderImpl.AddItem(nam, TypeDistiller<T>::Get());
00241 return *this;
00242 }
00243
00244
00245
00246 template <typename T> Reflex::UnionBuilder&
00247 Reflex::UnionBuilder::AddDataMember(const char* nam,
00248 size_t offs,
00249 unsigned int modifiers ) {
00250 fUnionBuilderImpl.AddDataMember(nam, TypeDistiller<T>::Get(), offs, modifiers);
00251 return *this;
00252 }
00253
00254
00255
00256 template <typename F> Reflex::UnionBuilder&
00257 Reflex::UnionBuilder::AddFunctionMember(const char* nam,
00258 StubFunction stubFP,
00259 void* stubCtx ,
00260 const char* params ,
00261 unsigned int modifiers ) {
00262 fUnionBuilderImpl.AddFunctionMember(nam, FunctionDistiller<F>::Get(), stubFP, stubCtx, params, modifiers);
00263 return *this;
00264 }
00265
00266
00267
00268 template <typename P> Reflex::UnionBuilder&
00269 Reflex::UnionBuilder::AddProperty(const char* key,
00270 P value) {
00271 fUnionBuilderImpl.AddProperty(key, value);
00272 return *this;
00273 }
00274
00275
00276 #endif // Reflex_UnionBuilder