Commit bb650bda4713c95bd63fd2ff4a0a37318d93a51b

Authored by Georg Hopp
1 parent d1fecbf9

implement clone selector

... ... @@ -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