55 lines
1.8 KiB
C
Executable File
55 lines
1.8 KiB
C
Executable File
/*
|
|
* lclinsfn.h - generic function instantiation macros for MAXScript SDK plug-ins
|
|
*/
|
|
|
|
#include "ClassCfg.h"
|
|
|
|
#ifdef def_local_generic
|
|
# undef def_local_generic
|
|
# undef use_local_generic
|
|
#endif
|
|
#ifdef use_generic
|
|
# undef use_generic
|
|
#endif
|
|
|
|
|
|
#pragma pointers_to_members(full_generality, virtual_inheritance)
|
|
|
|
#define def_local_generic(fn, name) \
|
|
MS_LOCAL_GENERIC_CLASS fn##_gf (_T(name), &MS_LOCAL_ROOT_CLASS::fn##_vf)
|
|
#define use_generic(fn, name)
|
|
#define use_local_generic(fn, name)
|
|
|
|
#undef def_name
|
|
#define def_name(name) Value* n_##name;
|
|
|
|
#define define_local_generic_class \
|
|
MS_LOCAL_GENERIC_CLASS::MS_LOCAL_GENERIC_CLASS(TCHAR*fn_name, local_value_vf fn)\
|
|
{ \
|
|
tag = MS_LOCAL_GENERIC_CLASS_TAG; \
|
|
fn_ptr = fn; \
|
|
name = save_string(fn_name); \
|
|
} \
|
|
Value* MS_LOCAL_GENERIC_CLASS::apply(Value** arg_list, int count, CallContext* cc) \
|
|
{ \
|
|
Value* result; \
|
|
Value** evald_args; \
|
|
Value **ap, **eap; \
|
|
int i; \
|
|
if (count < 1) \
|
|
throw ArgCountError("Generic apply", 1, count); \
|
|
value_local_array(evald_args, count); \
|
|
for (i = count, ap = arg_list, eap = evald_args; i--; eap++, ap++) \
|
|
*eap = (*ap)->eval(); \
|
|
if (evald_args[0]->local_base_class() == MS_LOCAL_ROOT_CLASS_TAG) \
|
|
result = (((MS_LOCAL_ROOT_CLASS*)evald_args[0])->*fn_ptr)(&evald_args[1], count - 1); \
|
|
else \
|
|
throw NoMethodError (name, evald_args[0]); \
|
|
pop_value_local_array(evald_args); \
|
|
return result; \
|
|
} \
|
|
MS_LOCAL_GENERIC_CLASS_CLASS MS_LOCAL_GENERIC_CLASS_class (str1(MS_LOCAL_GENERIC_CLASS));
|
|
|
|
|
|
|