7 #ifndef _QITYPE_DETAIL_TYPEIMPL_HXX_
8 #define _QITYPE_DETAIL_TYPEIMPL_HXX_
30 template<
typename T,
bool b>
33 static void*
create() {
return new T();}
40 static void*
create() {
typeFail(
typeid(T).name(),
"default constructor");
return 0;}
44 template<
typename T,
bool b>
47 static void copy(
void* dst,
const void* src) { *(T*)dst = *(
const T*)src;}
48 static void*
clone(
void* src) {
return new T(*(T*)src);}
49 static void cloneInPlace(
void* ptr,
void* src) {
new (ptr)T(*(T*)src);}
55 template<
typename T1,
typename T2>
56 static void copy(
const T1& d,
const T2&s) {
typeFail(
typeid(T).name(),
"copy operator");}
57 static void*
clone(
void* src) {
typeFail(
typeid(T).name(),
"clone");
return 0;}
61 template<
typename T,
bool b>
64 static void destroy(
void* ptr) {
delete (T*)ptr;}
112 :
public boost::mpl::if_c<
113 boost::is_function<T>::value,
115 typename boost::mpl::if_c< boost::is_pod<T>::value,
116 TypeManagerDefaultStruct<T>,
117 TypeManagerDefaultInterface<T> >
135 template <
typename T,
typename Manager=detail::TypeManager<T> >
154 void* res = Manager::create();
156 qiLogError(
"qitype.bypointer") <<
"initializeStorage error on " <<
typeid(T).name();
162 return Manager::clone(src);
173 template <
typename T>
177 template <
typename T>
183 template <
typename T>
195 T* tresult=(T*)(
void*)&result;
218 template <
typename T>
227 template <
typename T,
typename _Access = TypeByPo
inter<T> >
235 return Access::initializeStorage(ptr);
240 return Access::ptrFromStorage(storage);
253 return Access::clone(src);
261 static bool less(
void* a,
void* b)
268 #define _QI_BOUNCE_TYPE_METHODS_NOCLONE(Bounce) \
269 const ::qi::TypeInfo& info() override { return Bounce::info();} \
270 void* initializeStorage(void* ptr=0) override { return Bounce::initializeStorage(ptr);} \
271 void* ptrFromStorage(void**s) override { return Bounce::ptrFromStorage(s);} \
272 bool less(void* a, void* b) override { return Bounce::less(a, b);}
275 #define _QI_BOUNCE_TYPE_METHODS(Bounce) \
276 _QI_BOUNCE_TYPE_METHODS_NOCLONE(Bounce) \
277 void* clone(void* ptr) override { return Bounce::clone(ptr);} \
278 void destroy(void* ptr) override { Bounce::destroy(ptr);}
281 #define _QI_BOUNCE_TYPE_METHODS_NOINFO(Bounce) \
282 void* initializeStorage(void* ptr=0) override { return Bounce::initializeStorage(ptr);} \
283 void* ptrFromStorage(void**s) override { return Bounce::ptrFromStorage(s);} \
284 void* clone(void* ptr) override { return Bounce::clone(ptr);} \
285 void destroy(void* ptr) override { Bounce::destroy(ptr);} \
286 bool less(void* a, void* b) override { return Bounce::less(a, b);}
288 template <
typename T,
typename _Access = TypeByPo
inter<T> >
319 void*
clone(
void* storage)
override {
return storage; }
322 bool less(
void* a,
void* b)
override {
return false; }
345 #endif // _QITYPE_DETAIL_TYPEIMPL_HXX_
static void destroy(void *storage)
const TypeInfo & info() override
Get the TypeInfo corresponding to this type.
static void * clone(void *src)
void destroy()
Stop and flush the logging system.
static void cloneInPlace(void *ptr, void *src)
static const TypeInfo & info()
static void * initializeStorage(void *ptr=0)
static void destroy(void *src)
bool less(void *a, void *b) override
static void copy(void *dst, const void *src)
static void * ptrFromStorage(void **storage)
static void cloneInPlace(void *ptr, void *src)
static void createInPlace(void *ptr)
static void createInPlace(void *ptr)
static bool less(void *a, void *b)
static void * initializeStorage(void *ptr=0)
void destroy(void *ptr) override
Free all resources of a storage.
#define qiLogError(...)
Log in error mode.
static void * clone(void *src)
void * ptrFromStorage(void **storage) override
#define _QI_BOUNCE_TYPE_METHODS(Bounce)
Implement all methods of Type as bouncers to Bouncer.
Access API that stores a T* in storage.
static void destroy(void *ptr)
static void destroy(const U &ptr)
static void destroy(void *ptr)
void typeFail(const char *typeName, const char *operation)
Report a type operation failure.
static void * clone(void *src)
static void * clone(void *src)
static void copy(const T1 &d, const T2 &s)
static void * clone(void *src)
static void * initializeStorage(void *ptr=0)
static void * ptrFromStorage(void **storage)
static void * ptrFromStorage(void **storage)
Access api that stores a T in storage.
void * initializeStorage(void *ptr) override
void * clone(void *storage) override
Allocate a storage and copy the value given as an argument.