forked from enlightenment/efl
Eo: add APIs to walk over classes and objects
These APIs are needed by Clouseau to get a list of classes and objects.
This commit is contained in:
parent
9e47089311
commit
3107e0d3eb
|
@ -1770,6 +1770,33 @@ efl_replace(Eo **storage, Eo *new_obj)
|
|||
|
||||
#include "efl_future.h"
|
||||
|
||||
/**
|
||||
* @addtogroup Eo_Iterators Eo iterators
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Get an iterator on the Eo classes
|
||||
*
|
||||
* You can use this function to walk over the Eo classes.
|
||||
*
|
||||
* @return an iterator on success, NULL otherwise
|
||||
*/
|
||||
EAPI Eina_Iterator *eo_classes_iterator_new(void);
|
||||
|
||||
/**
|
||||
* @brief Get an iterator on the Eo objects
|
||||
*
|
||||
* You can use this function to walk over the Eo objects.
|
||||
*
|
||||
* @return an iterator on success, NULL otherwise
|
||||
*/
|
||||
EAPI Eina_Iterator *eo_objects_iterator_new(void);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
121
src/lib/eo/eo.c
121
src/lib/eo/eo.c
|
@ -2934,3 +2934,124 @@ _eo_log_obj_shutdown(void)
|
|||
eina_inarray_flush(&_eo_log_objs_no_debug);
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Eina_Iterator iterator;
|
||||
unsigned int cur_kl_id;
|
||||
} _Eo_Classes_Iterator;
|
||||
|
||||
static Eina_Bool
|
||||
_eo_classes_iterator_next(Eina_Iterator *it, void **data)
|
||||
{
|
||||
_Eo_Classes_Iterator *eo_it = (_Eo_Classes_Iterator *)it;
|
||||
|
||||
if (eo_it->cur_kl_id == _eo_classes_last_id) return EINA_FALSE;
|
||||
*data = _eo_class_id_get(_eo_classes[eo_it->cur_kl_id]);
|
||||
eo_it->cur_kl_id++;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
_eo_classes_iterator_free(Eina_Iterator *it)
|
||||
{
|
||||
EINA_MAGIC_SET(it, EINA_MAGIC_NONE);
|
||||
free(it);
|
||||
}
|
||||
|
||||
EAPI Eina_Iterator *
|
||||
eo_classes_iterator_new(void)
|
||||
{
|
||||
_Eo_Classes_Iterator *it;
|
||||
|
||||
it = calloc(1, sizeof (*it));
|
||||
if (!it) return NULL;
|
||||
|
||||
it->iterator.version = EINA_ITERATOR_VERSION;
|
||||
it->iterator.next = _eo_classes_iterator_next;
|
||||
it->iterator.free = _eo_classes_iterator_free;
|
||||
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
|
||||
|
||||
return (Eina_Iterator *)it;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Eina_Iterator iterator;
|
||||
Eo_Id_Table_Data *tdata;
|
||||
Table_Index mid_table_id;
|
||||
Table_Index table_id;
|
||||
Table_Index entry_id;
|
||||
} _Eo_Objects_Iterator;
|
||||
|
||||
static Eina_Bool
|
||||
_eo_objects_iterator_next(Eina_Iterator *it, void **data)
|
||||
{
|
||||
Table_Index mid_table_id, table_id, entry_id;
|
||||
Eo_Id_Table_Data *tdata;
|
||||
_Eo_Objects_Iterator *eo_it = (_Eo_Objects_Iterator *)it;
|
||||
if (!eo_it->tdata) return EINA_FALSE;
|
||||
|
||||
tdata = eo_it->tdata;
|
||||
mid_table_id = eo_it->mid_table_id;
|
||||
table_id = eo_it->table_id;
|
||||
entry_id = eo_it->entry_id;
|
||||
while (mid_table_id < MAX_MID_TABLE_ID)
|
||||
{
|
||||
if (tdata->eo_ids_tables[mid_table_id])
|
||||
{
|
||||
while (table_id < MAX_TABLE_ID)
|
||||
{
|
||||
if (TABLE_FROM_IDS)
|
||||
{
|
||||
while (entry_id < MAX_ENTRY_ID)
|
||||
{
|
||||
_Eo_Id_Entry *entry = &(TABLE_FROM_IDS->entries[entry_id]);
|
||||
if (entry->active)
|
||||
{
|
||||
Eo *obj = _eo_header_id_get((Eo_Header *) entry->ptr);
|
||||
*data = obj;
|
||||
eo_it->mid_table_id = mid_table_id;
|
||||
eo_it->table_id = table_id;
|
||||
eo_it->entry_id = entry_id + 1;
|
||||
return EINA_TRUE;
|
||||
}
|
||||
entry_id++;
|
||||
}
|
||||
entry_id = 0;
|
||||
}
|
||||
table_id++;
|
||||
}
|
||||
table_id = 0;
|
||||
}
|
||||
mid_table_id++;
|
||||
}
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_eo_objects_iterator_free(Eina_Iterator *it)
|
||||
{
|
||||
EINA_MAGIC_SET(it, EINA_MAGIC_NONE);
|
||||
free(it);
|
||||
}
|
||||
|
||||
EAPI Eina_Iterator *
|
||||
eo_objects_iterator_new(void)
|
||||
{
|
||||
_Eo_Objects_Iterator *it;
|
||||
Eo_Id_Table_Data *tdata = _eo_table_data_table_get(_eo_table_data_get(), EFL_ID_DOMAIN_MAIN);
|
||||
|
||||
if (!tdata) return NULL;
|
||||
|
||||
it = calloc(1, sizeof (*it));
|
||||
if (!it) return NULL;
|
||||
|
||||
it->tdata = tdata;
|
||||
it->iterator.version = EINA_ITERATOR_VERSION;
|
||||
it->iterator.next = _eo_objects_iterator_next;
|
||||
it->iterator.free = _eo_objects_iterator_free;
|
||||
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
|
||||
|
||||
return (Eina_Iterator *)it;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue