| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/xtictor.h
- // Purpose: XTI constructors
- // Author: Stefan Csomor
- // Modified by: Francesco Montorsi
- // Created: 27/07/03
- // Copyright: (c) 1997 Julian Smart
- // (c) 2003 Stefan Csomor
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _XTICTOR_H_
- #define _XTICTOR_H_
- #include "wx/defs.h"
- #if wxUSE_EXTENDED_RTTI
- #include "wx/xti.h"
- // ----------------------------------------------------------------------------
- // Constructor Bridges
- // ----------------------------------------------------------------------------
- // A constructor bridge allows to call a ctor with an arbitrary number
- // or parameters during runtime
- class WXDLLIMPEXP_BASE wxObjectAllocatorAndCreator
- {
- public:
- virtual ~wxObjectAllocatorAndCreator() { }
- virtual bool Create(wxObject * &o, wxAny *args) = 0;
- };
- // a direct constructor bridge calls the operator new for this class and
- // passes all params to the constructor. Needed for classes that cannot be
- // instantiated using alloc-create semantics
- class WXDLLIMPEXP_BASE wxObjectAllocator : public wxObjectAllocatorAndCreator
- {
- public:
- virtual bool Create(wxObject * &o, wxAny *args) = 0;
- };
- // ----------------------------------------------------------------------------
- // Constructor Bridges for all Numbers of Params
- // ----------------------------------------------------------------------------
- // no params
- template<typename Class>
- struct wxObjectAllocatorAndCreator_0 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create();
- }
- };
- struct wxObjectAllocatorAndCreator_Dummy : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject *&, wxAny *)
- {
- return true;
- }
- };
- #define wxCONSTRUCTOR_0(klass) \
- wxObjectAllocatorAndCreator_0<klass> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { NULL }; \
- const int klass::ms_constructorPropertiesCount = 0;
- #define wxCONSTRUCTOR_DUMMY(klass) \
- wxObjectAllocatorAndCreator_Dummy constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { NULL }; \
- const int klass::ms_constructorPropertiesCount = 0;
- // direct constructor version
- template<typename Class>
- struct wxDirectConstructorBridge_0 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class( );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_0(klass) \
- wxDirectConstructorBridge_0<klass> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { NULL }; \
- const int klass::ms_constructorPropertiesCount = 0;
- // 1 param
- template<typename Class, typename T0>
- struct wxObjectAllocatorAndCreator_1 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_1(klass,t0,v0) \
- wxObjectAllocatorAndCreator_1<klass,t0> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) }; \
- const int klass::ms_constructorPropertiesCount = 1;
- // direct constructor version
- template<typename Class, typename T0>
- struct wxDirectConstructorBridge_1 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_1(klass,t0,v0) \
- wxDirectConstructorBridge_1<klass,t0,t1> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0) }; \
- const int klass::ms_constructorPropertiesCount = 1;
- // 2 params
- template<typename Class,
- typename T0, typename T1>
- struct wxObjectAllocatorAndCreator_2 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_2(klass,t0,v0,t1,v1) \
- wxObjectAllocatorAndCreator_2<klass,t0,t1> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1) }; \
- const int klass::ms_constructorPropertiesCount = 2;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1>
- struct wxDirectConstructorBridge_2 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_2(klass,t0,v0,t1,v1) \
- wxDirectConstructorBridge_2<klass,t0,t1> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1) }; \
- const int klass::ms_constructorPropertiesCount = 2;
- // 3 params
- template<typename Class,
- typename T0, typename T1, typename T2>
- struct wxObjectAllocatorAndCreator_3 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \
- wxObjectAllocatorAndCreator_3<klass,t0,t1,t2> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), wxT(#v2) }; \
- const int klass::ms_constructorPropertiesCount = 3;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2>
- struct wxDirectConstructorBridge_3 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_3(klass,t0,v0,t1,v1,t2,v2) \
- wxDirectConstructorBridge_3<klass,t0,t1,t2> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), wxT(#v2) }; \
- const int klass::ms_constructorPropertiesCount = 3;
- // 4 params
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3>
- struct wxObjectAllocatorAndCreator_4 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \
- wxObjectAllocatorAndCreator_4<klass,t0,t1,t2,t3> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3) }; \
- const int klass::ms_constructorPropertiesCount = 4;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3>
- struct wxDirectConstructorBridge_4 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_4(klass,t0,v0,t1,v1,t2,v2,t3,v3) \
- wxDirectConstructorBridge_4<klass,t0,t1,t2,t3> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3) }; \
- const int klass::ms_constructorPropertiesCount = 4;
- // 5 params
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4>
- struct wxObjectAllocatorAndCreator_5 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \
- wxObjectAllocatorAndCreator_5<klass,t0,t1,t2,t3,t4> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4) }; \
- const int klass::ms_constructorPropertiesCount = 5;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4>
- struct wxDirectConstructorBridge_5 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_5(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4) \
- wxDirectConstructorBridge_5<klass,t0,t1,t2,t3,t4> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4) }; \
- const int klass::ms_constructorPropertiesCount = 5;
- // 6 params
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
- struct wxObjectAllocatorAndCreator_6 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \
- wxObjectAllocatorAndCreator_6<klass,t0,t1,t2,t3,t4,t5> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5) }; \
- const int klass::ms_constructorPropertiesCount = 6;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
- struct wxDirectConstructorBridge_6 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_6(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5) \
- wxDirectConstructorBridge_6<klass,t0,t1,t2,t3,t4,t5> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), \
- wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5) }; \
- const int klass::ms_constructorPropertiesCount = 6;
- // 7 params
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
- struct wxObjectAllocatorAndCreator_7 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL)),
- (args[6]).As(static_cast<T6*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \
- wxObjectAllocatorAndCreator_7<klass,t0,t1,t2,t3,t4,t5,t6> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = { wxT(#v0), wxT(#v1), \
- wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6) }; \
- const int klass::ms_constructorPropertiesCount = 7;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
- struct wxDirectConstructorBridge_7 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL)),
- (args[6]).As(static_cast<T6*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_7(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6) \
- wxDirectConstructorBridge_7<klass,t0,t1,t2,t3,t4,t5,t6> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6) }; \
- const int klass::ms_constructorPropertiesCount = 7;
- // 8 params
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, \
- typename T6, typename T7>
- struct wxObjectAllocatorAndCreator_8 : public wxObjectAllocatorAndCreator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- Class *obj = wx_dynamic_cast(Class*, o);
- return obj->Create(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL)),
- (args[6]).As(static_cast<T6*>(NULL)),
- (args[7]).As(static_cast<T7*>(NULL))
- );
- }
- };
- #define wxCONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \
- wxObjectAllocatorAndCreator_8<klass,t0,t1,t2,t3,t4,t5,t6,t7> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6), wxT(#v7) }; \
- const int klass::ms_constructorPropertiesCount = 8;
- // direct constructor version
- template<typename Class,
- typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, \
- typename T6, typename T7>
- struct wxDirectConstructorBridge_8 : public wxObjectAllocator
- {
- bool Create(wxObject * &o, wxAny *args)
- {
- o = new Class(
- (args[0]).As(static_cast<T0*>(NULL)),
- (args[1]).As(static_cast<T1*>(NULL)),
- (args[2]).As(static_cast<T2*>(NULL)),
- (args[3]).As(static_cast<T3*>(NULL)),
- (args[4]).As(static_cast<T4*>(NULL)),
- (args[5]).As(static_cast<T5*>(NULL)),
- (args[6]).As(static_cast<T6*>(NULL)),
- (args[7]).As(static_cast<T7*>(NULL))
- );
- return o != NULL;
- }
- };
- #define wxDIRECT_CONSTRUCTOR_8(klass,t0,v0,t1,v1,t2,v2,t3,v3,t4,v4,t5,v5,t6,v6,t7,v7) \
- wxDirectConstructorBridge_8<klass,t0,t1,t2,t3,t4,t5,t6,t7> constructor##klass; \
- wxObjectAllocatorAndCreator* klass::ms_constructor = &constructor##klass; \
- const wxChar *klass::ms_constructorProperties[] = \
- { wxT(#v0), wxT(#v1), wxT(#v2), wxT(#v3), wxT(#v4), wxT(#v5), wxT(#v6), wxT(#v7) }; \
- const int klass::ms_constructorPropertiesCount = 8;
- #endif // wxUSE_EXTENDED_RTTI
- #endif // _XTICTOR_H_
|