__exec_obj_fn : comunicare verso oggetti locali

Come abbiamo scritto, un oggetto locale è noto attraverso la sua istanza, cioè un puntatore ad un oggetto di interfaccia OPERATION_CALL; in questo caso si usa la macro variadic __exec_obj_fn  definita anch’essa in CLB_language.h:

#define __exec_obj_fn(...)  test_request::exec_obj_fn(__VA_ARGS__,_$end)

In questo caso il primo argomento sarà un puntatore obj_ptr all’oggetto chiamato, seguito dalla serie di argomenti definiti:

(obj_ptr, func_name, [op_id], [args])

Ad esempio:

..
__arg_value ret = __exec_obj_fn(doc, _$create, _$color_table, _$mask, _$str->mask_name.Value(), _$str->mask_name.Value());
..

Nel frammento di codice l’oggetto chiamato è un SPECTRAL_IMAGE doc al quale si richiede di creare una tabella colori da una mask della quale è indicato il nome ;

Le macro __exec_obj_fn__exec_global_fn rimandano un tipo __arg_value (void *) definito dall’oggetto chiamato, e riconoscibile dal chiamante per operazioni successive; spesso il valore ritornato è _$true o _$false, e l’individuazione di questi valori può essere fatto usando le macro __is_true e  __is_false , come si vede nell’esempio reale tratto dal codice di Colibri:

static void CREATE_TABLE(CLASS_STR)
{
	DOC_MASK_LIST *list=IMG->GetMaskList();
	if (!list) return;

	for (int i=0;i<list->Num();i++) {
		MSK *msk=list->GetMask(i);
		if (msk->flags.GetBit(LY_SEL)) {

			__arg_value ret = __exec_obj_fn((OPERATION_CALL *)IMG, _$create, _$color_table, _$mask, msk->id.Value(), msk->id.Value());
			__is_true(ret)
			{
				........
				........
			}
			return;
		}
	}
}
Pages: 1 2 3 4 5 6 7
Skip to toolbar