Browse Source

add function to create an object with a va_list pointer instead of its argument list. Obviously the va_list must contain the correct values for the class constructor.

v0.1.8
Georg Hopp 12 years ago
parent
commit
0d6e5db80a
  1. 7
      include/class/interface/class.h
  2. 20
      src/class/interface/i_class.c

7
include/class/interface/class.h

@ -52,6 +52,13 @@ extern void * classClone(void *);
#define delete(object) classDelete((void **)&(object)) #define delete(object) classDelete((void **)&(object))
#define clone(object) classClone((void *)(object)) #define clone(object) classClone((void *)(object))
/**
* With this one we can create a new instance via a
* intermidiary that gets the arguments.
*/
extern void * classNewParams(class_ptr, va_list *);
#define newParams(class,args) classNewParams(_##class, args)
#endif // __CLASS_INTERFACE_CLASS_H__ #endif // __CLASS_INTERFACE_CLASS_H__
// vim: set ts=4 sw=4: // vim: set ts=4 sw=4:

20
src/class/interface/i_class.c

@ -37,18 +37,15 @@ struct interface i_Class = {
}; };
void * void *
classNew(class_ptr class, ...)
classNewParams(class_ptr class, va_list * params)
{ {
void * object = memCalloc(1, class->object_size + sizeof(void*)); void * object = memCalloc(1, class->object_size + sizeof(void*));
va_list params;
int ret; int ret;
* (class_ptr *)object = class; * (class_ptr *)object = class;
object += sizeof(void*); object += sizeof(void*);
va_start(params, class);
RETCALL(object, Class, ctor, ret, &params);
va_end(params);
RETCALL(object, Class, ctor, ret, params);
if (-1 == ret) { if (-1 == ret) {
classDelete(&object); classDelete(&object);
@ -57,6 +54,19 @@ classNew(class_ptr class, ...)
return object; return object;
} }
void *
classNew(class_ptr class, ...)
{
va_list params;
void * object;
va_start(params, class);
object = classNewParams(class, &params);
va_end(params);
return object;
}
void void
classDelete(void ** object) classDelete(void ** object)
{ {

Loading…
Cancel
Save