194 lines
8.5 KiB
C++
194 lines
8.5 KiB
C++
#pragma once
|
|
|
|
#include <toolkit/c_symbol.h>
|
|
#include <toolkit/c_args.h>
|
|
|
|
// ==========================================================
|
|
// 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<T1>::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<T1,T2>::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<T1,T2,T3>::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<T1,T2,T3,T4>::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<T1,T2,T3,T4,T5>::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<T1,T2,T3,T4,T5,T6>::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<T1,T2,T3,T4,T5,T6,T7>::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<T1,T2,T3,T4,T5,T6,T7,T8>::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<T1>::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<T1,T2>::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<T1,T2,T3>::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<T1,T2,T3,T4>::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<T1,T2,T3,T4,T5>::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<T1,T2,T3,T4,T5,T6>::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<T1,T2,T3,T4,T5,T6,T7>::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<T1,T2,T3,T4,T5,T6,T7,T8>::result >(k1,v1,k2,v2)(k3,v3,k4,v4)(k5,v5,k6,v6)(k7,v7,k8,v8) );
|
|
}
|