Files
Leviathan/Client/Game/engine/Renderer/KObject.h
T
2026-06-01 12:46:52 +02:00

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) );
}