2017-04-17 06:17:10 -06:00

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