diff --git a/include/interface/class.h b/include/interface/class.h index b239831..8c71183 100644 --- a/include/interface/class.h +++ b/include/interface/class.h @@ -8,7 +8,7 @@ typedef void (* fptr_ctor)(void *, va_list *); typedef void (* fptr_dtor)(void *); -typedef void (* fptr_clone)(void *, const void * const); +typedef void (* fptr_clone)(void *, void * const); extern const struct interface i_Class; @@ -21,9 +21,11 @@ struct i_Class { extern void * classNew(class_ptr, ...); extern void classDelete(void **); +extern void * classClone(void *); -#define new(class,...) classNew(_##class, __VA_ARGS__) -#define delete(object) classDelete((void **)(object)) +#define new(class,...) classNew(_##class, ##__VA_ARGS__) +#define delete(object) classDelete((void **)(object)) +#define clone(object) classClone((void *)(object)) #endif // __INTERFACE_CLASS_H__ diff --git a/src/interface/class.c b/src/interface/class.c index cd0ad24..2d98851 100644 --- a/src/interface/class.c +++ b/src/interface/class.c @@ -38,4 +38,19 @@ classDelete(void ** object) *object = NULL; } +void * +classClone(void * _object) +{ + class_ptr class = class_getClass(_object); + void * object = calloc(1, class->object_size + sizeof(void*)); + + * (class_ptr *)object = class; + object += sizeof(void*); + +#undef clone + CALL(object, Class, clone, _object); + + return object; +} + // vim: set ts=4 sw=4: