Showing
2 changed files
with
20 additions
and
3 deletions
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | |
| 9 | 9 | typedef void (* fptr_ctor)(void *, va_list *); |
| 10 | 10 | typedef void (* fptr_dtor)(void *); |
| 11 | -typedef void (* fptr_clone)(void *, const void * const); | |
| 11 | +typedef void (* fptr_clone)(void *, void * const); | |
| 12 | 12 | |
| 13 | 13 | extern const struct interface i_Class; |
| 14 | 14 | |
| ... | ... | @@ -21,9 +21,11 @@ struct i_Class { |
| 21 | 21 | |
| 22 | 22 | extern void * classNew(class_ptr, ...); |
| 23 | 23 | extern void classDelete(void **); |
| 24 | +extern void * classClone(void *); | |
| 24 | 25 | |
| 25 | -#define new(class,...) classNew(_##class, __VA_ARGS__) | |
| 26 | -#define delete(object) classDelete((void **)(object)) | |
| 26 | +#define new(class,...) classNew(_##class, ##__VA_ARGS__) | |
| 27 | +#define delete(object) classDelete((void **)(object)) | |
| 28 | +#define clone(object) classClone((void *)(object)) | |
| 27 | 29 | |
| 28 | 30 | #endif // __INTERFACE_CLASS_H__ |
| 29 | 31 | ... | ... |
| ... | ... | @@ -38,4 +38,19 @@ classDelete(void ** object) |
| 38 | 38 | *object = NULL; |
| 39 | 39 | } |
| 40 | 40 | |
| 41 | +void * | |
| 42 | +classClone(void * _object) | |
| 43 | +{ | |
| 44 | + class_ptr class = class_getClass(_object); | |
| 45 | + void * object = calloc(1, class->object_size + sizeof(void*)); | |
| 46 | + | |
| 47 | + * (class_ptr *)object = class; | |
| 48 | + object += sizeof(void*); | |
| 49 | + | |
| 50 | +#undef clone | |
| 51 | + CALL(object, Class, clone, _object); | |
| 52 | + | |
| 53 | + return object; | |
| 54 | +} | |
| 55 | + | |
| 41 | 56 | // vim: set ts=4 sw=4: | ... | ... |
Please
register
or
login
to post a comment