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();}
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);}
55 template<
typename T1,
typename T2>
56 static void copy(
const T1& d,
const T2&s) {
typeFail(qi::typeId<T>().
name(),
"copy operator");}
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 " << qi::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);
245 static const TypeInfo result(qi::typeId<T>());
251 return Access::clone(src);
259 static bool less(
void* a,
void* b)
266 #define _QI_BOUNCE_TYPE_METHODS_NOCLONE(Bounce) \
267 const ::qi::TypeInfo& info() override { return Bounce::info();} \
268 void* initializeStorage(void* ptr=0) override { return Bounce::initializeStorage(ptr);} \
269 void* ptrFromStorage(void**s) override { return Bounce::ptrFromStorage(s);} \
270 bool less(void* a, void* b) override { return Bounce::less(a, b);}
273 #define _QI_BOUNCE_TYPE_METHODS(Bounce) \
274 _QI_BOUNCE_TYPE_METHODS_NOCLONE(Bounce) \
275 void* clone(void* ptr) override { return Bounce::clone(ptr);} \
276 void destroy(void* ptr) override { Bounce::destroy(ptr);}
279 #define _QI_BOUNCE_TYPE_METHODS_NOINFO(Bounce) \
280 void* initializeStorage(void* ptr=0) override { return Bounce::initializeStorage(ptr);} \
281 void* ptrFromStorage(void**s) override { return Bounce::ptrFromStorage(s);} \
282 void* clone(void* ptr) override { return Bounce::clone(ptr);} \
283 void destroy(void* ptr) override { Bounce::destroy(ptr);} \
284 bool less(void* a, void* b) override { return Bounce::less(a, b);}
286 template <
typename T,
typename _Access = TypeByPo
inter<T> >
317 void*
clone(
void* storage)
override {
return storage; }
320 bool less(
void* a,
void* b)
override {
return false; }
343 #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)
T src(const std::atomic< T > &x)
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.