/* * human.c * */ #include "eina_model_04_human.h" #include "eina_model_04_whistler.h" static Eina_Bool initialized = EINA_FALSE; static void _human_eat(Eina_Model *m) { printf("%s\t%s", eina_model_type_name_get(eina_model_type_get(m)), __func__); printf("\t\t Salad\n"); } static void _human_walk(Eina_Model *m) { printf("%s\t%s", eina_model_type_name_get(eina_model_type_get(m)), __func__); printf("\t\t Walk\n"); } static void _human_whistle(Eina_Model *m) { printf("%s\t%s", eina_model_type_name_get(eina_model_type_get(m)), __func__); printf("\t\t Whistle Human\n"); } static void _human_swim(Eina_Model *m) { printf("%s\t%s", eina_model_type_name_get(eina_model_type_get(m)), __func__); printf("\t\t Swim Human\n"); } static void _human_dive(Eina_Model *m) { printf("%s\t%s", eina_model_type_name_get(eina_model_type_get(m)), __func__); printf("\t\t Dive Human\n"); } /* * defining Human Model Instance * defining Whistler Interface instance * defining Swimmer Interface instance * defining Diver Interface instance */ const char *HUMAN_MODEL_TYPE_NAME = NULL; static Human_Type _HUMAN_TYPE; const Eina_Model_Type * const HUMAN_TYPE = (Eina_Model_Type *) &_HUMAN_TYPE; static const Whistler_Interface _WHISTLER_INTERFACE; static const Eina_Model_Interface * const WHISTLER_INTERFACE = (Eina_Model_Interface *) &_WHISTLER_INTERFACE; static const Swimmer_Interface _SWIMMER_INTERFACE; static const Eina_Model_Interface * const SWIMMER_INTERFACE = (Eina_Model_Interface *) &_SWIMMER_INTERFACE; static const Diver_Interface _DIVER_INTERFACE; static const Eina_Model_Interface * const DIVER_INTERFACE = (Eina_Model_Interface *) &_DIVER_INTERFACE; /* * defining parent interfaces for Diver Interface instance * defining Interfaces for Human Model instance */ static const Eina_Model_Interface * PARENT_INTERFACES_ARRAY[] = { &_SWIMMER_INTERFACE.base_interface, NULL }; //this array is for model static const Eina_Model_Interface * MODEL_INTERFACES_ARRAY[] = { &_WHISTLER_INTERFACE.base_interface, &_DIVER_INTERFACE.base_interface, NULL }; //this array is for model void human_init() { Eina_Model_Type *type; if (initialized) return; initialized = EINA_TRUE; animal_init(); /* * Initializing Whistler Interface Instance */ Eina_Model_Interface *iface = (Eina_Model_Interface *) &_WHISTLER_INTERFACE; iface->version = EINA_MODEL_INTERFACE_VERSION; iface->interface_size = sizeof(Whistler_Interface); iface->name = WHISTLER_INTERFACE_NAME; WHISTLER_INTERFACE(iface)->whistle = _human_whistle; /* * Initializing Swimmer Interface Instance */ iface = (Eina_Model_Interface *) &_SWIMMER_INTERFACE; iface->version = EINA_MODEL_INTERFACE_VERSION; iface->interface_size = sizeof(Swimmer_Interface); iface->name = SWIMMER_INTERFACE_NAME; SWIMMER_INTERFACE(iface)->swim = _human_swim; /* * Initializing Diver Interface Instance * Diver_Interface is inherited from Swimmer */ iface = (Eina_Model_Interface *) &_DIVER_INTERFACE; iface->version = EINA_MODEL_INTERFACE_VERSION; iface->interface_size = sizeof(Diver_Interface); iface->name = DIVER_INTERFACE_NAME; iface->interfaces = PARENT_INTERFACES_ARRAY; DIVER_INTERFACE(iface)->dive = _human_dive; /* * Initializing instance of Human Model */ HUMAN_MODEL_TYPE_NAME = "Human_Model_Type"; type = (Eina_Model_Type *) &_HUMAN_TYPE; type->version = EINA_MODEL_TYPE_VERSION; type->name = HUMAN_MODEL_TYPE_NAME; type->private_size = 0; eina_model_type_subclass_setup(type, ANIMAL_TYPE); type->type_size = sizeof(Human_Type); type->interfaces = MODEL_INTERFACES_ARRAY; ANIMAL_TYPE(type)->eat = _human_eat; HUMAN_TYPE(type)->walk =_human_walk; } /* * call for implemented Human Class function */ void human_walk(Eina_Model *m) { EINA_SAFETY_ON_FALSE_RETURN(eina_model_instance_check(m, HUMAN_TYPE)); void (*pf)(Eina_Model *m); pf = eina_model_method_resolve(m, Human_Type, walk); EINA_SAFETY_ON_NULL_RETURN(pf); printf("%s() \t", __func__); pf(m); }