__slot_function_parser: analisi e riconoscimento dei messaggi
Lo slot di ricezione dei messaggi è definito all’interno del blocco
__slot_function_parser … __end__declare_slots
Per l’analisi dei messaggi sono definite un gruppo di macro che semplificano la navigazione nella struttura dati relativa:
__is_function: usata per il riconoscimento di una func_name ; se riconoscita la func_name viene eseguito il blocco { .. } che segue nel codice:
__slot_function_parser __is_function(_$detach) { __operation_case(_$document) { __pop_param(edit, LAYOUT_printing_page); if (!edit) { _$str->layout = 0; return true; } else if (edit == _$str->layout) { _$str->layout = 0; return true; } } } .... .... __end_slot
__operation_case: individuazione dell’argomento op_id. La macro è usata all’interno del blocco __is_function; se l’argomento passato alla macro è quello atteso, viene definito un nuovo blocco per continuare l’analisi degli argomenti e/o eseguire il codice successivo;
__pop_param: estrazione di un argomento tipizzato (args). la macro permette di istanziare un puntatore all’argomento successivo ricevuto; gli argomenti ricevuti sono tipizzati, pertanto la macro riceve due argomenti: il primo (nell’esempio, edit) è il nome dell’istanza estratta; il secondo (nell’esempio LAYOUT_printing_page) è la classe del tipo di istanza generata; la tipizzazione può corrispondere ad uno dei tipi, strutture o classi standard di C++; La funzione deve essere richiamata nel blocco tante volte quante previste nel protocollo di comunicazione; nel nostro caso, tratto dalla classe DOCK_edit_layout, è presente un solo argomento (args), avendo interpretato il comando:
__exec_global_fn(_$dock_edit_layout,_$detach,_$document,doc);
Valore ritornato dalla __slot_function_parser: la funzione rimanda true o false ad indicare che il comando è stato intercettato (true) o no (false); prima di ritornare al chiamante, è possibile dichiarare un oggetto di ritorno per le macro __exec_global_fn o __exec_obj_fn usate dal chiamante, attraverso l’uso della macro __return.