{
const char *id;
const char *comment;
+ Eina_Inlist *generic_data;
+ Eo ***wrefs;
} Eo_Base_Extension;
typedef struct
Eo *parent;
Eina_List *parent_list;
- Eina_Inlist *generic_data;
- Eo ***wrefs;
-
- Eo_Base_Extension *extension;
+ Eo_Base_Extension *ext;
Eo_Callback_Description *callbacks;
Eina_Inlist *current;
Eo_Callback_Description *current;
} Eo_Current_Callback_Description;
-static Eo_Base_Extension *
-_eo_base_extension_new(void)
+static inline void
+_eo_base_extension_free(Eo_Base_Extension *ext)
{
- Eo_Base_Extension *extension = calloc(1, sizeof(Eo_Base_Extension));
- return extension;
+ free(ext);
}
-static void
-_eo_base_extension_free(Eo_Base_Extension *extension)
+static inline void
+_eo_base_extension_need(Eo_Base_Data *pd)
{
- free(extension);
+ if (pd->ext) return;
+ pd->ext = calloc(1, sizeof(Eo_Base_Extension));
+}
+
+static inline void
+_eo_base_extension_noneed(Eo_Base_Data *pd)
+{
+ Eo_Base_Extension *ext = pd->ext;
+ if ((!ext) || (ext->id) || (ext->comment) || (ext->generic_data) ||
+ (ext->wrefs)) return;
+ _eo_base_extension_free(pd->ext);
+ pd->ext = NULL;
}
+
static void
_eo_generic_data_node_free(Eo_Generic_Data_Node *node)
{
if (pd)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (!ext) return EINA_TRUE;
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
if ((node->data_is_obj) && (node->data == event->obj))
{
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
+ ext->generic_data = eina_inlist_remove
+ (ext->generic_data, EINA_INLIST_GET(node));
eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
_eo_base_cb_key_obj_del, data);
_eo_generic_data_node_free(node);
_eo_generic_data_del_all(Eo *obj, Eo_Base_Data *pd)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
- while (pd->generic_data)
+ if (!ext) return;
+ while (ext->generic_data)
{
- node = (Eo_Generic_Data_Node *)pd->generic_data;
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
+ node = (Eo_Generic_Data_Node *)ext->generic_data;
+ ext->generic_data = eina_inlist_remove(ext->generic_data,
+ EINA_INLIST_GET(node));
if (node->data_is_obj)
{
eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
_eo_base_key_data_set(Eo *obj, Eo_Base_Data *pd, const char *key, const void *data)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (ext)
{
- if (!strcmp(node->key, key))
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
- if ((!node->data_is_obj) && (!node->data_is_value) &&
- (node->data == data)) return;
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
- if (node->data_is_obj)
+ if (!strcmp(node->key, key))
{
- eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
- _eo_base_cb_key_obj_del, obj);
- eo_unref(node->data);
+ if ((!node->data_is_obj) && (!node->data_is_value) &&
+ (node->data == data)) return;
+ ext->generic_data = eina_inlist_remove
+ (ext->generic_data, EINA_INLIST_GET(node));
+ if (node->data_is_obj)
+ {
+ eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
+ _eo_base_cb_key_obj_del, obj);
+ eo_unref(node->data);
+ }
+ else if (node->data_is_value) eina_value_free(node->data);
+ _eo_generic_data_node_free(node);
+ break;
}
- else if (node->data_is_value) eina_value_free(node->data);
- _eo_generic_data_node_free(node);
- break;
}
}
- node = calloc(1, sizeof(Eo_Generic_Data_Node));
- if (!node) return;
- node->key = eina_stringshare_add(key);
- node->data = (void *)data;
- node->data_is_obj = EINA_FALSE;
- pd->generic_data = eina_inlist_prepend(pd->generic_data,
- EINA_INLIST_GET(node));
+ _eo_base_extension_need(pd);
+ ext = pd->ext;
+ if (ext)
+ {
+ node = calloc(1, sizeof(Eo_Generic_Data_Node));
+ if (!node) return;
+ node->key = eina_stringshare_add(key);
+ node->data = (void *)data;
+ node->data_is_obj = EINA_FALSE;
+ ext->generic_data = eina_inlist_prepend
+ (ext->generic_data, EINA_INLIST_GET(node));
+ }
}
EOLIAN static void *
_eo_base_key_data_get(const Eo *obj, Eo_Base_Data *pd, const char *key)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return NULL;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (!ext) return NULL;
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
if (!strcmp(node->key, key))
{
if ((!node->data_is_obj) && (!node->data_is_value))
{
- pd->generic_data = eina_inlist_promote(pd->generic_data,
- EINA_INLIST_GET(node));
+ ext->generic_data = eina_inlist_promote
+ (ext->generic_data, EINA_INLIST_GET(node));
return node->data;
}
else
_eo_base_key_del(Eo *obj, Eo_Base_Data *pd, const char *key)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (!ext) return;
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
if (!strcmp(node->key, key))
{
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
+ ext->generic_data = eina_inlist_remove
+ (ext->generic_data, EINA_INLIST_GET(node));
if (node->data_is_obj)
{
eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
_eo_base_key_obj_set(Eo *obj, Eo_Base_Data *pd, const char *key, Eo *objdata)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (ext)
{
- if (!strcmp(node->key, key))
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
- if ((node->data_is_obj) && (node->data == objdata)) return;
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
- if (node->data_is_obj)
+ if (!strcmp(node->key, key))
{
- eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
- _eo_base_cb_key_obj_del, obj);
- eo_unref(node->data);
+ if ((node->data_is_obj) && (node->data == objdata)) return;
+ ext->generic_data = eina_inlist_remove
+ (ext->generic_data, EINA_INLIST_GET(node));
+ if (node->data_is_obj)
+ {
+ eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
+ _eo_base_cb_key_obj_del, obj);
+ eo_unref(node->data);
+ }
+ else if (node->data_is_value) eina_value_free(node->data);
+ _eo_generic_data_node_free(node);
+ break;
}
- else if (node->data_is_value) eina_value_free(node->data);
- _eo_generic_data_node_free(node);
- break;
}
}
- node = calloc(1, sizeof(Eo_Generic_Data_Node));
- if (!node) return;
- node->key = eina_stringshare_add(key);
- node->data = (void *)objdata;
- node->data_is_obj = EINA_TRUE;
- eo_event_callback_add(node->data, EO_BASE_EVENT_DEL,
- _eo_base_cb_key_obj_del, obj);
- eo_ref(node->data);
- pd->generic_data = eina_inlist_prepend(pd->generic_data,
- EINA_INLIST_GET(node));
+ _eo_base_extension_need(pd);
+ ext = pd->ext;
+ if (ext)
+ {
+ node = calloc(1, sizeof(Eo_Generic_Data_Node));
+ if (!node) return;
+ node->key = eina_stringshare_add(key);
+ node->data = (void *)objdata;
+ node->data_is_obj = EINA_TRUE;
+ eo_event_callback_add(node->data, EO_BASE_EVENT_DEL,
+ _eo_base_cb_key_obj_del, obj);
+ eo_ref(node->data);
+ ext->generic_data = eina_inlist_prepend
+ (ext->generic_data, EINA_INLIST_GET(node));
+ }
}
EOLIAN static Eo *
_eo_base_key_obj_get(const Eo *obj, Eo_Base_Data *pd, const char *key)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return NULL;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (!ext) return NULL;
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
if (!strcmp(node->key, key))
{
if (node->data_is_obj)
{
- pd->generic_data = eina_inlist_promote(pd->generic_data,
- EINA_INLIST_GET(node));
+ ext->generic_data = eina_inlist_promote
+ (ext->generic_data, EINA_INLIST_GET(node));
return node->data;
}
else
_eo_base_key_value_set(Eo *obj, Eo_Base_Data *pd, const char *key, Eina_Value *value)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (ext)
{
- if (!strcmp(node->key, key))
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
- if ((node->data_is_value) && (node->data == value)) return;
- pd->generic_data = eina_inlist_remove(pd->generic_data,
- EINA_INLIST_GET(node));
- if (node->data_is_obj)
+ if (!strcmp(node->key, key))
{
- eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
- _eo_base_cb_key_obj_del, obj);
- eo_unref(node->data);
+ if ((node->data_is_value) && (node->data == value)) return;
+ ext->generic_data = eina_inlist_remove
+ (ext->generic_data, EINA_INLIST_GET(node));
+ if (node->data_is_obj)
+ {
+ eo_event_callback_del(node->data, EO_BASE_EVENT_DEL,
+ _eo_base_cb_key_obj_del, obj);
+ eo_unref(node->data);
+ }
+ else if (node->data_is_value) eina_value_free(node->data);
+ _eo_generic_data_node_free(node);
+ break;
}
- else if (node->data_is_value) eina_value_free(node->data);
- _eo_generic_data_node_free(node);
- break;
}
}
- node = calloc(1, sizeof(Eo_Generic_Data_Node));
- if (!node) return;
- node->key = eina_stringshare_add(key);
- node->data = (void *)value;
- node->data_is_value = EINA_TRUE;
- eo_event_callback_add(node->data, EO_BASE_EVENT_DEL,
- _eo_base_cb_key_obj_del, obj);
- pd->generic_data = eina_inlist_prepend(pd->generic_data,
- EINA_INLIST_GET(node));
+ _eo_base_extension_need(pd);
+ ext = pd->ext;
+ if (ext)
+ {
+ node = calloc(1, sizeof(Eo_Generic_Data_Node));
+ if (!node) return;
+ node->key = eina_stringshare_add(key);
+ node->data = (void *)value;
+ node->data_is_value = EINA_TRUE;
+ eo_event_callback_add(node->data, EO_BASE_EVENT_DEL,
+ _eo_base_cb_key_obj_del, obj);
+ ext->generic_data = eina_inlist_prepend
+ (ext->generic_data, EINA_INLIST_GET(node));
+ }
}
EOLIAN static Eina_Value *
_eo_base_key_value_get(const Eo *obj, Eo_Base_Data *pd, const char *key)
{
Eo_Generic_Data_Node *node;
+ Eo_Base_Extension *ext = pd->ext;
if (!key) return NULL;
- EINA_INLIST_FOREACH(pd->generic_data, node)
+ if (!ext) return NULL;
+ EINA_INLIST_FOREACH(ext->generic_data, node)
{
if (!strcmp(node->key, key))
{
if (node->data_is_value)
{
- pd->generic_data = eina_inlist_promote(pd->generic_data,
- EINA_INLIST_GET(node));
+ ext->generic_data = eina_inlist_promote
+ (ext->generic_data, EINA_INLIST_GET(node));
return node->data;
}
else
if ((id) && (!id[0])) id = NULL;
if (id)
{
- if (!pd->extension)
- pd->extension = _eo_base_extension_new();
- if (pd->extension)
- eina_stringshare_replace(&(pd->extension->id), id);
+ _eo_base_extension_need(pd);
+ if (pd->ext) eina_stringshare_replace(&(pd->ext->id), id);
}
else
{
- if (!pd->extension) return;
- if (pd->extension->id)
+ if (!pd->ext) return;
+ if (pd->ext->id)
{
- eina_stringshare_replace(&(pd->extension->id), id);
- if (!pd->extension->comment)
- {
- _eo_base_extension_free(pd->extension);
- pd->extension = NULL;
- }
+ eina_stringshare_replace(&(pd->ext->id), id);
+ _eo_base_extension_noneed(pd);
}
}
}
EOLIAN static const char *
_eo_base_id_get(Eo *obj EINA_UNUSED, Eo_Base_Data *pd)
{
- if (!pd->extension) return NULL;
- return pd->extension->id;
+ if (!pd->ext) return NULL;
+ return pd->ext->id;
}
static inline Eina_Bool
if ((comment) && (!comment[0])) comment = NULL;
if (comment)
{
- if (!pd->extension)
- pd->extension = _eo_base_extension_new();
- if (pd->extension)
- eina_stringshare_replace(&(pd->extension->comment), comment);
+ _eo_base_extension_need(pd);
+ if (pd->ext) eina_stringshare_replace(&(pd->ext->comment), comment);
}
else
{
- if (!pd->extension) return;
- if (pd->extension->comment)
+ if (!pd->ext) return;
+ if (pd->ext->comment)
{
- eina_stringshare_replace(&(pd->extension->comment), comment);
- if (!pd->extension->id)
- {
- _eo_base_extension_free(pd->extension);
- pd->extension = NULL;
- }
+ eina_stringshare_replace(&(pd->ext->comment), comment);
+ _eo_base_extension_noneed(pd);
}
}
}
EOLIAN static const char *
_eo_base_comment_get(Eo *obj EINA_UNUSED, Eo_Base_Data *pd)
{
- if (!pd->extension) return NULL;
- return pd->extension->comment;
+ if (!pd->ext) return NULL;
+ return pd->ext->comment;
}
static inline size_t
_wref_count(Eo_Base_Data *pd)
{
+ Eo ***itr;
size_t count = 0;
- if (!pd->wrefs)
- return 0;
+ Eo_Base_Extension *ext = pd->ext;
- Eo ***itr;
- for (itr = pd->wrefs; *itr; itr++)
- count++;
+ if ((!ext) || (!ext->wrefs)) return 0;
+ for (itr = ext->wrefs; *itr; itr++) count++;
return count;
}
{
size_t count;
Eo ***tmp;
+ Eo_Base_Extension *ext;
count = _wref_count(pd);
count += 1; /* New wref. */
- tmp = realloc(pd->wrefs, sizeof(*pd->wrefs) * (count + 1));
+ _eo_base_extension_need(pd);
+ ext = pd->ext;
+ if (!ext) return;
+
+ tmp = realloc(ext->wrefs, sizeof(*ext->wrefs) * (count + 1));
if (!tmp) return;
- pd->wrefs = tmp;
+ ext->wrefs = tmp;
- pd->wrefs[count - 1] = wref;
- pd->wrefs[count] = NULL;
+ ext->wrefs[count - 1] = wref;
+ ext->wrefs[count] = NULL;
*wref = obj;
}
_eo_base_wref_del(Eo *obj, Eo_Base_Data *pd, Eo **wref)
{
size_t count;
+ Eo_Base_Extension *ext = pd->ext;
if (*wref != obj)
{
ERR("Wref is a weak ref to %p, while this function was called on %p.",
- *wref, obj);
+ *wref, obj);
return;
}
- if (!pd->wrefs)
+ if ((!ext) || (!ext->wrefs))
{
ERR("There are no weak refs for object %p", obj);
*wref = NULL;
{
Eo ***itr;
- for (itr = pd->wrefs; *itr; itr++)
+ for (itr = ext->wrefs; *itr; itr++)
{
if (*itr == wref)
{
- *itr = pd->wrefs[count - 1];
+ *itr = ext->wrefs[count - 1];
break;
}
}
if (count > 1)
{
Eo ***tmp;
- // No count--; because of the NULL that is not included in the count. */
- tmp = realloc(pd->wrefs, sizeof(*pd->wrefs) * count);
+ // No count--; because of the NULL that is not included in the count
+ tmp = realloc(ext->wrefs, sizeof(*ext->wrefs) * count);
if (!tmp) return;
- pd->wrefs = tmp;
- pd->wrefs[count - 1] = NULL;
+ ext->wrefs = tmp;
+ ext->wrefs[count - 1] = NULL;
}
else
{
- free(pd->wrefs);
- pd->wrefs = NULL;
+ free(ext->wrefs);
+ ext->wrefs = NULL;
+ _eo_base_extension_noneed(pd);
}
*wref = NULL;
_wref_destruct(Eo_Base_Data *pd)
{
Eo ***itr;
- if (!pd->wrefs)
- return;
-
- for (itr = pd->wrefs; *itr; itr++)
- {
- **itr = NULL;
- }
+ Eo_Base_Extension *ext = pd->ext;
- free(pd->wrefs);
+ if ((!ext) || (!ext->wrefs)) return;
+ for (itr = ext->wrefs; *itr; itr++) **itr = NULL;
+ free(ext->wrefs);
+ ext->wrefs = NULL;
}
/* EOF Weak reference. */
_eo_base_destructor(Eo *obj, Eo_Base_Data *pd)
{
Eo *child;
+ Eo_Base_Extension *ext;
DBG("%p - %s.", obj, eo_class_name_get(obj));
_wref_destruct(pd);
_eo_callback_remove_all(pd);
- if (pd->extension)
+ ext = pd->ext;
+ if (ext)
{
- eina_stringshare_del(pd->extension->id);
- pd->extension->id = NULL;
- eina_stringshare_del(pd->extension->comment);
- pd->extension->comment = NULL;
- _eo_base_extension_free(pd->extension);
- pd->extension = NULL;
+ eina_stringshare_del(ext->id);
+ ext->id = NULL;
+ eina_stringshare_del(ext->comment);
+ ext->comment = NULL;
+ _eo_base_extension_free(ext);
+ pd->ext = NULL;
}
_eo_condtor_done(obj);