7 #ifndef _QI_TYPE_OBJECTTYPEBUILDER_HPP_
8 #define _QI_TYPE_OBJECTTYPEBUILDER_HPP_
13 #include <boost/function.hpp>
25 struct ObjectTypeData;
31 class ObjectTypeInterface;
33 template<
typename T>
class SignalF;
34 class ObjectTypeBuilderPrivate;
46 void setDescription(
const std::string& description);
51 template<
typename T>
void buildFor(
bool autoRegister =
true);
53 template <
typename FUNCTION_TYPE>
54 inline unsigned int advertiseMethod(
const std::string& name, FUNCTION_TYPE
function,
MetaCallType threadingModel =
MetaCallType_Auto,
int id = -1);
56 template <
typename FUNCTION_TYPE>
60 unsigned int advertiseSignal(
const std::string& eventName, A accessor,
int id = -1);
63 inline unsigned int advertiseSignal(
const std::string& name,
SignalMemberGetter getter,
int id = -1);
66 inline unsigned int advertiseProperty(
const std::string& propertyName, A accessor);
69 inline unsigned int advertiseProperty(
const std::string& eventName,
PropertyMemberGetter getter);
74 #define genCall(n, ATYPEDECL, ATYPES, ADECL, AUSE, comma) \
75 template<typename T comma ATYPEDECL> \
76 inline unsigned int advertiseFactory(const std::string& name) \
78 return advertiseMethod(name, &constructObject<T comma ATYPES>); \
84 void inherits(
int offset);
88 ObjectTypeBuilderBase&
advertise(
const std::string& name, T element);
91 unsigned int advertiseId(
const std::string& name, T element);
95 unsigned int xAdvertiseSignal(
const std::string &name,
const qi::Signature& signature, SignalMemberGetter getter,
int id = -1);
96 unsigned int xAdvertiseProperty(
const std::string& name,
const qi::Signature& signature, PropertyMemberGetter getter,
int id = -1);
97 void xBuildFor(TypeInterface* type,
bool autoRegister,
qi::AnyFunction strandAccessor);
98 void inherits(TypeInterface* parentType,
int offset);
105 const MetaObject& metaObject();
106 AnyObject object(
void* ptr, boost::function<
void (GenericObject*)> onDestroy = boost::function<
void (GenericObject*)>());
107 ObjectTypeInterface* type();
114 ObjectTypeBuilderPrivate* _p;
123 buildFor<T>(autoRegister);
131 template<
typename U>
void inherits();
133 template <
typename FUNCTION_TYPE>
135 FUNCTION_TYPE
function,
139 template <
typename FUNCTION_TYPE>
141 FUNCTION_TYPE
function,
161 #define QI_OBJECT_BUILDER_ADVERTISE(builder, cls, name) \
162 builder.advertise(BOOST_PP_STRINGIZE(name), &cls::name)
174 #define QI_OBJECT_BUILDER_ADVERTISE_OVERLOAD(builder, cls, name, ret, args) \
175 builder.advertiseMethod(BOOST_PP_STRINGIZE(name), static_cast<ret (cls::*)args>(&cls::name))
177 #define __QI_REGISTER_ELEMENT(_, name, field) \
178 b.advertise(BOOST_PP_STRINGIZE(field), & name::field); // do not remove the space
187 #define QI_REGISTER_OBJECT(name, ...) \
188 static bool _qiregister##name() { \
189 ::qi::ObjectTypeBuilder<name > b; \
190 QI_VAARGS_APPLY(__QI_REGISTER_ELEMENT, name, __VA_ARGS__) \
194 static bool BOOST_PP_CAT(__qi_registration, __LINE__) = _qiregister##name();
196 #define QI_REGISTER_MT_OBJECT(name, ...) \
197 static bool _qiregister##name() { \
198 ::qi::ObjectTypeBuilder<name > b; \
199 b.setThreadingModel(qi::ObjectThreadingModel_MultiThread); \
200 QI_VAARGS_APPLY(__QI_REGISTER_ELEMENT, name, __VA_ARGS__) \
204 static bool BOOST_PP_CAT(__qi_registration, __LINE__) = _qiregister##name();
212 #define QI_REGISTER_IMPLEMENTATION(parent, name) \
213 static bool _qiregister##name() \
215 qi::registerType(typeid(name), qi::typeOf<parent>()); \
216 name* ptr = static_cast<name*>(reinterpret_cast<void*>(0x10000)); \
217 parent* pptr = ptr; \
218 intptr_t offset = reinterpret_cast<intptr_t>(pptr) - reinterpret_cast<intptr_t>(ptr); \
221 qiLogError("qitype.register") << "non-zero offset for implementation " << #name << " of " << #parent \
222 << ", call will fail at runtime"; \
223 throw std::runtime_error("non-zero offset between implementation and interface"); \
227 static bool BOOST_PP_CAT(__qi_registration, __LINE__) = _qiregister##name();
229 #define _QI_REGISTER_TEMPLATE_OBJECT(name, model, ...) \
233 class QI_API TypeOfTemplate<name> : public detail::StaticObjectTypeBase \
236 virtual TypeInterface* templateArgument() = 0; \
238 template <typename T> \
239 class TypeOfTemplateImpl<name, T> : public TypeOfTemplate<name> \
242 TypeOfTemplateImpl() \
245 ::qi::registerType(typeid(name<T>), this); \
246 ObjectTypeBuilder<name<T> > b(false); \
247 b.setThreadingModel(model); \
248 QI_VAARGS_APPLY(__QI_REGISTER_ELEMENT, name<T>, __VA_ARGS__) \
249 this->initialize(b.metaObject(), b.typeData()); \
251 virtual TypeInterface* templateArgument() { return typeOf<T>(); } \
252 typedef DefaultTypeImplMethods<name<T> > Methods; \
253 _QI_BOUNCE_TYPE_METHODS(Methods); \
256 QI_TEMPLATE_TYPE_DECLARE(name)
262 #define QI_TEMPLATE_OBJECT(name, ...) \
263 _QI_REGISTER_TEMPLATE_OBJECT(name, ObjectThreadingModel_SingleThread, \
268 #define QI_REGISTER_TEMPLATE_OBJECT(name, ...) \
269 QI_TEMPLATE_OBJECT(name, __VA_ARGS__)
273 #define QI_MT_TEMPLATE_OBJECT(name, ...) \
274 _QI_REGISTER_TEMPLATE_OBJECT(name, ObjectThreadingModel_MultiThread, \
277 QI_MT_TEMPLATE_OBJECT(
qi::Future, _connect, isFinished, value, waitFor, waitUntil, isRunning, isCanceled, hasError, error, cancel);
278 QI_MT_TEMPLATE_OBJECT(
qi::FutureSync, _connect, isFinished, value, waitFor, waitUntil, isRunning, isCanceled, hasError, error,
async, cancel);
281 namespace qi {
namespace detail {
287 #endif // _QITYPE_OBJECTTYPEBUILDER_HPP_
AnyObject object(T *ptr, boost::function< void(GenericObject *)> onDestroy=boost::function< void(GenericObject *)>())
Honor the default behavior.
virtual void registerType()
Register type to typeof. Called by type()
dll import/export and compiler message
virtual void registerType()
Register type to typeOf<T>, to avoid both TypeImpl<T> and type() being present.
boost::function< SignalBase *(void *)> SignalMemberGetter
Future< R > async(boost::function< R()> callback, uint64_t usDelay=0)
ObjectTypeBuilder(bool autoRegister=true)
#define QI_MT_TEMPLATE_OBJECT(name,...)
boost::function< PropertyBase *(void *)> PropertyMemberGetter
#define genCall(n, ATYPEDECL, ATYPES, ADECL, AUSE, comma)
Object< Empty > AnyObject
unsigned int advertiseMethod(const std::string &name, FUNCTION_TYPE function, MetaCallType threadingModel=MetaCallType_Auto, int id=-1)
unsigned int advertise(ObjectTypeBuilderBase *builder, const std::string &name, A accessor, Dummy< 0 >)
ObjectThreadingModel
Possible thread models for an object.