#pragma once #include #include // ========================================================== // ID type definition // ========================================================== typedef c_symbol< class KObject >::sym KID; typedef c_symbol< class KObject >::csym KCID; #define _CID( str ) static const KCID id_##str( #str ) // ========================================================== // base object definition - provides generic perform // ========================================================== typedef c_args::base< KID > KArg; // base #define _TYPENAMES_1 typename T1 #define _TYPENAMES_2 _TYPENAMES_1, typename T2 #define _TYPENAMES_3 _TYPENAMES_2, typename T3 #define _TYPENAMES_4 _TYPENAMES_3, typename T4 #define _TYPENAMES_5 _TYPENAMES_4, typename T5 #define _TYPENAMES_6 _TYPENAMES_5, typename T6 #define _TYPENAMES_7 _TYPENAMES_6, typename T7 #define _TYPENAMES_8 _TYPENAMES_7, typename T8 class KObject { public: virtual ~KObject() {} virtual void* Perform( KID msg_id, KArg& msg ) { return NULL; } // convenience perform methods void* Perform( KID msg_id ) { return Perform( msg_id, KArg() ); } template< _TYPENAMES_1 > void* PerformV( KID msg_id, const T1& v1 ); template< _TYPENAMES_2 > void* PerformV( KID msg_id, const T1& v1, const T2& v2 ); template< _TYPENAMES_3 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3 ); template< _TYPENAMES_4 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4 ); template< _TYPENAMES_5 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5 ); template< _TYPENAMES_6 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6 ); template< _TYPENAMES_7 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7 ); template< _TYPENAMES_8 > void* PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8 ); template< _TYPENAMES_1 > void* PerformKV( KID msg_id, KID k1, const T1& v1 ); template< _TYPENAMES_2 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2 ); template< _TYPENAMES_3 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3 ); template< _TYPENAMES_4 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4 ); template< _TYPENAMES_5 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5 ); template< _TYPENAMES_6 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6 ); template< _TYPENAMES_7 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6, KID k7, const T7& v7 ); template< _TYPENAMES_8 > void* PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6, KID k7, const T7& v7, KID k8, const T8& v8 ); }; // ========================================================== // arguments type definition // ========================================================== template< int MAX_SLOT > /// unnamed arguments struct KArgV : public c_args::values< KID, MAX_SLOT > { KArgV() {} template< _TYPENAMES_1 > KArgV( const T1& v1 ) { add(v1); } template< _TYPENAMES_2 > KArgV( const T1& v1, const T2& v2 ) { add(v1); add(v2); } template< _TYPENAMES_3 > KArgV( const T1& v1, const T2& v2, const T3& v3 ) { add(v1); add(v2); add(v3); } template< _TYPENAMES_4 > KArgV( const T1& v1, const T2& v2, const T3& v3, const T4& v4 ) { add(v1); add(v2); add(v3); add(v4); } }; template< int MAX_SLOT > /// named arguments struct KArgKV : public c_args::id_values< KID, MAX_SLOT > { KArgKV() {} template< typename T > KArgKV( const T& v ) { add(KID(),v); } template< _TYPENAMES_1 > KArgKV( KID id1, const T1& v1 ) { add(id1,v1); } template< _TYPENAMES_2 > KArgKV( KID id1, const T1& v1, KID id2, const T2& v2 ) { add(id1,v1); add(id2,v2); } }; // --------- inline implementations ------------ template< _TYPENAMES_1 > inline void* KObject::PerformV( KID msg_id, const T1& v1 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1) ); } template< _TYPENAMES_2 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2) ); } template< _TYPENAMES_3 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3) ); } template< _TYPENAMES_4 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3,v4) ); } template< _TYPENAMES_5 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3,v4)(v5) ); } template< _TYPENAMES_6 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3,v4)(v5,v6) ); } template< _TYPENAMES_7 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3,v4)(v5,v6,v7) ); } template< _TYPENAMES_8 > inline void* KObject::PerformV( KID msg_id, const T1& v1, const T2& v2, const T3& v3, const T4& v4, const T5& v5, const T6& v6, const T7& v7, const T8& v8 ) { return Perform( msg_id, KArgV< c_args::SlotSize::result >(v1,v2,v3,v4)(v5,v6,v7,v8) ); } template< _TYPENAMES_1 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1) ); } template< _TYPENAMES_2 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2) ); } template< _TYPENAMES_3 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3) ); } template< _TYPENAMES_4 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3,k4,v4) ); } template< _TYPENAMES_5 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3,k4,v4)(k5,v5) ); } template< _TYPENAMES_6 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3,k4,v4)(k5,v5,k6,v6) ); } template< _TYPENAMES_7 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6, KID k7, const T7& v7 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3,k4,v4)(k5,v5,k6,v6)(k7,v7) ); } template< _TYPENAMES_8 > inline void* KObject::PerformKV( KID msg_id, KID k1, const T1& v1, KID k2, const T2& v2, KID k3, const T3& v3, KID k4, const T4& v4, KID k5, const T5& v5, KID k6, const T6& v6, KID k7, const T7& v7, KID k8, const T8& v8 ) { return Perform( msg_id, KArgKV< c_args::SlotSize::result >(k1,v1,k2,v2)(k3,v3,k4,v4)(k5,v5,k6,v6)(k7,v7,k8,v8) ); }