Root *Root_init_type( void *vchild,
roottype type,
void *vobject,
perr (*object_vdestructor)(void*)) {
/* Check parameters */
if ((! vchild) || (! vobject) || (! object_vdestructor)) return NULL;
/* Allocate new root object */
Root *root = malloc(sizeof(Root));
if (! root) return NULL;
/* Initialize fields */
root->this = root;
root->vobject = vobject;
root->object_vdestructor = object_vdestructor;
root->vchild = vchild;
root->type = type;
/* Return newly created object */
return root;
}
Root *Root_copy(Root *root_src, void *vchild_dest, void *vobject_dest) {
if ((! root_src) || (! vchild_dest) || (! vobject_dest)) return NULL;
Root *root_dest = malloc(sizeof(Root));
if (! root_dest) return NULL;
root_dest->this = root_dest;
root_dest->vobject = vobject_dest;
if (! root_src->object_vdestructor) { WARNING vdestructor is NULL in root_src; }
root_dest->object_vdestructor = root_src->object_vdestructor;
root_dest->vchild = vchild_dest;
root_dest->type = root_src->type;
return root_dest;
perr Root_destroy(Root *root) {
if (! root) throw E_INTRO_FAILED;
/* Delete self */
free(root);
throw E_NO_ERROR;
perr Root_destroyAll(Root *root) {
/* Delete object */
if ((root->object_vdestructor) && (root->vobject))
root->object_vdestructor(root->vobject);
else WARNING Found NULL vdestructor pointer or NULL vobject;
Widget *Widget_init_type( void *child,
widgettype type,
...
mikdor