Commit 0d6e5db80a7adf84b972d8eadd3ba7a2a1c52b99
1 parent
5897c437
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.
Showing
2 changed files
with
22 additions
and
5 deletions
@@ -52,6 +52,13 @@ extern void * classClone(void *); | @@ -52,6 +52,13 @@ extern void * classClone(void *); | ||
52 | #define delete(object) classDelete((void **)&(object)) | 52 | #define delete(object) classDelete((void **)&(object)) |
53 | #define clone(object) classClone((void *)(object)) | 53 | #define clone(object) classClone((void *)(object)) |
54 | 54 | ||
55 | +/** | ||
56 | + * With this one we can create a new instance via a | ||
57 | + * intermidiary that gets the arguments. | ||
58 | + */ | ||
59 | +extern void * classNewParams(class_ptr, va_list *); | ||
60 | +#define newParams(class,args) classNewParams(_##class, args) | ||
61 | + | ||
55 | #endif // __CLASS_INTERFACE_CLASS_H__ | 62 | #endif // __CLASS_INTERFACE_CLASS_H__ |
56 | 63 | ||
57 | // vim: set ts=4 sw=4: | 64 | // vim: set ts=4 sw=4: |
@@ -37,18 +37,15 @@ struct interface i_Class = { | @@ -37,18 +37,15 @@ struct interface i_Class = { | ||
37 | }; | 37 | }; |
38 | 38 | ||
39 | void * | 39 | void * |
40 | -classNew(class_ptr class, ...) | 40 | +classNewParams(class_ptr class, va_list * params) |
41 | { | 41 | { |
42 | void * object = memCalloc(1, class->object_size + sizeof(void*)); | 42 | void * object = memCalloc(1, class->object_size + sizeof(void*)); |
43 | - va_list params; | ||
44 | int ret; | 43 | int ret; |
45 | 44 | ||
46 | * (class_ptr *)object = class; | 45 | * (class_ptr *)object = class; |
47 | object += sizeof(void*); | 46 | object += sizeof(void*); |
48 | 47 | ||
49 | - va_start(params, class); | ||
50 | - RETCALL(object, Class, ctor, ret, ¶ms); | ||
51 | - va_end(params); | 48 | + RETCALL(object, Class, ctor, ret, params); |
52 | 49 | ||
53 | if (-1 == ret) { | 50 | if (-1 == ret) { |
54 | classDelete(&object); | 51 | classDelete(&object); |
@@ -57,6 +54,19 @@ classNew(class_ptr class, ...) | @@ -57,6 +54,19 @@ classNew(class_ptr class, ...) | ||
57 | return object; | 54 | return object; |
58 | } | 55 | } |
59 | 56 | ||
57 | +void * | ||
58 | +classNew(class_ptr class, ...) | ||
59 | +{ | ||
60 | + va_list params; | ||
61 | + void * object; | ||
62 | + | ||
63 | + va_start(params, class); | ||
64 | + object = classNewParams(class, ¶ms); | ||
65 | + va_end(params); | ||
66 | + | ||
67 | + return object; | ||
68 | +} | ||
69 | + | ||
60 | void | 70 | void |
61 | classDelete(void ** object) | 71 | classDelete(void ** object) |
62 | { | 72 | { |
Please
register
or
login
to post a comment