cfw_new() takes parameters now.

This commit is contained in:
Jonathan Schleifer 2012-04-08 19:32:57 +02:00
parent 8603645700
commit a9e4c2a8d9
6 changed files with 43 additions and 31 deletions

View file

@ -35,13 +35,20 @@ struct CFWArray {
size_t size; size_t size;
}; };
static void static bool
ctor(void *ptr) ctor(void *ptr, va_list args)
{ {
CFWArray *array = ptr; CFWArray *array = ptr;
void *obj;
array->data = NULL; array->data = NULL;
array->size = 0; array->size = 0;
while ((obj = va_arg(args, void*)) != NULL)
if (!cfw_array_push(array, obj))
return false;
return true;
} }
static void static void

View file

@ -29,11 +29,12 @@
#include <stddef.h> #include <stddef.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdarg.h>
typedef struct CFWClass { typedef struct CFWClass {
const char *name; const char *name;
size_t size; size_t size;
void (*ctor)(void*); bool (*ctor)(void*, va_list args);
void (*dtor)(void*); void (*dtor)(void*);
bool (*equal)(void*, void*); bool (*equal)(void*, void*);
void* (*copy)(void*); void* (*copy)(void*);

View file

@ -29,7 +29,7 @@
#include "cfwobject.h" #include "cfwobject.h"
void* void*
cfw_new(CFWClass *class) cfw_new(CFWClass *class, ...)
{ {
CFWObject *obj; CFWObject *obj;
@ -39,8 +39,17 @@ cfw_new(CFWClass *class)
obj->clsptr = class; obj->clsptr = class;
obj->ref_cnt = 1; obj->ref_cnt = 1;
if (class->ctor != NULL) if (class->ctor != NULL) {
class->ctor(obj); va_list args;
va_start(args, class);
if (!class->ctor(obj, args)) {
cfw_unref(obj);
return NULL;
}
va_end(args);
}
return obj; return obj;
} }

View file

@ -35,7 +35,7 @@ typedef struct CFWObject {
} CFWObject; } CFWObject;
extern CFWClass *cfw_object; extern CFWClass *cfw_object;
extern void* cfw_new(CFWClass*); extern void* cfw_new(CFWClass*, ...);
extern void* cfw_ref(void*); extern void* cfw_ref(void*);
extern void cfw_unref(void*); extern void cfw_unref(void*);
extern void cfw_free(void*); extern void cfw_free(void*);

View file

@ -36,15 +36,25 @@ struct CFWString {
size_t len; size_t len;
}; };
static void static bool
ctor(void *ptr) ctor(void *ptr, va_list args)
{ {
CFWString *str = ptr; CFWString *str = ptr;
const char *cstr = va_arg(args, const char*);
if (cstr != NULL) {
if ((str->cstr = strdup(cstr)) == NULL)
return false;
str->len = strlen(cstr);
} else {
str->cstr = NULL; str->cstr = NULL;
str->len = 0; str->len = 0;
} }
return true;
}
static void static void
dtor(void *ptr) dtor(void *ptr)
{ {

25
test.c
View file

@ -33,30 +33,15 @@
int int
main() main()
{ {
CFWString *s[3];
CFWArray *a; CFWArray *a;
CFWString *s;
size_t i; size_t i;
a = cfw_new(cfw_array); s[0] = cfw_new(cfw_string, "Hallo");
s[1] = cfw_new(cfw_string, "Welt");
s[2] = cfw_new(cfw_string, "!");
for (i = 0; i < 3; i++) { a = cfw_new(cfw_array, s[0], s[1], s[2], NULL);
s = cfw_new(cfw_string);
switch (i) {
case 0:
cfw_string_set(s, "Hello");
break;
case 1:
cfw_string_set(s, "World");
break;
case 2:
cfw_string_set(s, "!");
break;
}
cfw_array_push(a, s);
cfw_unref(s);
}
for (i = 0; i < cfw_array_size(a); i++) for (i = 0; i < cfw_array_size(a); i++)
puts(cfw_string_c(cfw_array_get(a, i))); puts(cfw_string_c(cfw_array_get(a, i)));