eo2: better op_descs integration

struct _Eo_Class_Description swallows
Eo2_Op_Description *descs2;
This commit is contained in:
Jérémy Zurcher 2013-12-25 15:12:06 +01:00 committed by Tom Hacohen
parent 8ef9e1c00d
commit 2490a1bef2
3 changed files with 30 additions and 16 deletions

View File

@ -471,13 +471,13 @@ struct _Eo_Class_Description
struct {
Eo_Op *base_op_id;
const Eo_Op_Description *descs;
Eo2_Op_Description *descs2; /**< EO2 */
size_t count;
} ops; /**< The ops description, should be filled using #EO_CLASS_DESCRIPTION_OPS */
const Eo_Event_Description **events; /**< The event descriptions for this class. */
size_t data_size; /**< The size of data (private + protected + public) this class needs per object. */
void (*class_constructor)(Eo_Class *klass); /**< The constructor of the class. */
void (*class_destructor)(Eo_Class *klass); /**< The destructor of the class. */
Eo2_Op_Description *op_descs; /**< should replace ops.descs */
};
/**
@ -493,7 +493,7 @@ typedef struct _Eo_Class_Description Eo_Class_Description;
* @param op_descs the op descriptions array.
* @param count the number of ops in the op descriptions array.
*/
#define EO_CLASS_DESCRIPTION_OPS(base_op_id, op_descs, count) { base_op_id, op_descs, count }
#define EO_CLASS_DESCRIPTION_OPS(base_op_id, op_descs, count) { base_op_id, op_descs, NULL, count }
/**
* @def EO_OP_DESCRIPTION(op, doc)
@ -604,6 +604,12 @@ EAPI Eina_Bool eo_shutdown(void);
/************************************ EO2 ************************************/
// computes size of Eo2_Op_Description[]
#define OP_DESC_SIZE(desc) (sizeof(desc)/sizeof(Eo2_Op_Description) -1 )
// An helper macro to help populating #Eo_Class_Description.
#define EO2_CLASS_DESCRIPTION_OPS(op_descs, count) { NULL, NULL, op_descs, count }
// sort Eo2_Op_Description[] by eapi_func then attribute OP ids
EAPI void
eo2_class_funcs_set(Eo_Class *klass_id);

View File

@ -305,7 +305,7 @@ eo2_get_op_id(_Eo *obj, void *api_func)
imin = 0;
imax = obj->klass->desc->ops.count - 1;
op_descs = obj->klass->desc->op_descs;
op_descs = obj->klass->desc->ops.descs2;
while (imax >= imin)
{
@ -337,32 +337,33 @@ eo2_api_funcs_cmp(const void *p1, const void *p2)
EAPI void
eo2_class_funcs_set(Eo_Class *klass_id)
{
int i, base_op_id, n;
int op_id, n;
_Eo_Class *klass;
Eo2_Op_Description *op_desc;
Eo2_Op_Description *op_descs;
klass = _eo_class_pointer_get(klass_id);
EO_MAGIC_RETURN(klass, EO_CLASS_EINA_MAGIC);
op_descs = klass->desc->ops.descs2;
base_op_id = *klass->desc->ops.base_op_id;
// klass->desc->ops.count only counts class OP, not _constructor or _destructor
for (op_desc = klass->desc->op_descs; op_desc->op_type != EO_OP_TYPE_INVALID; op_desc++);
n = op_desc - klass->desc->op_descs;
for (op_desc = op_descs; op_desc->op_type != EO_OP_TYPE_INVALID; op_desc++);
n = op_desc - op_descs;
qsort((void*)klass->desc->op_descs, n, sizeof(Eo2_Op_Description), eo2_api_funcs_cmp);
qsort((void*)op_descs, n, sizeof(Eo2_Op_Description), eo2_api_funcs_cmp);
i = 0;
for (op_desc = klass->desc->op_descs; op_desc->op_type != EO_OP_TYPE_INVALID; op_desc++)
op_id = klass->base_id;
for (op_desc = op_descs; op_desc->op_type != EO_OP_TYPE_INVALID; op_desc++)
{
if (op_desc->op == EO_NOOP)
{
if(op_desc->api_func == NULL)
ERR("Setting implementation for NULL EAPI for class '%s'. Func index: %lu",
klass->desc->name, (unsigned long) (op_desc - klass->desc->op_descs));
klass->desc->name, (unsigned long) (op_desc - op_descs));
op_desc->op = base_op_id + i;
i++;
op_desc->op = op_id;
op_id++;
}
/* printf("%d %p %p\n", op_desc->op, op_desc->api_func, op_desc->func); */
// no need to check func->op_type != op_desc->op_type
@ -886,8 +887,16 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
DBG("Started building class '%s'", desc->name);
if (!_eo_class_check_op_descs(desc))
return NULL;
if (desc->version == 1)
{
if (!_eo_class_check_op_descs(desc))
return NULL;
}
else {
// FIXME: jeyzu
/* if (!_eo2_class_check_op_descs(desc)) */
/* return NULL; */
}
_Eo_Class *parent = _eo_class_pointer_get(parent_id);
#ifndef HAVE_EO_ID

View File

@ -1007,7 +1007,6 @@ static const Eo_Class_Description class_desc = {
event_desc,
sizeof(Private_Data),
_class_constructor,
NULL,
NULL
};