X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Finclude%2Fcore%2Fobject.h;h=19d6cc33799c68eeefa3a7e72f322fdf2522201c;hb=b2d31bc42a7694c671186081ee0cac077a188b99;hp=3c00fb51abe807d00799d931278e2d5dddc8ffd6;hpb=73272856dba3b5e49710205601017724fbb6c424;p=sysdb.git diff --git a/src/include/core/object.h b/src/include/core/object.h index 3c00fb5..19d6cc3 100644 --- a/src/include/core/object.h +++ b/src/include/core/object.h @@ -57,6 +57,10 @@ struct sdb_object { #define SDB_OBJECT_INIT { SDB_TYPE_INIT, 1, NULL } #define SDB_OBJECT_TYPED_INIT(t) { (t), 1, NULL } +#define SDB_OBJECT_STATIC(name) { \ + /* type */ { sizeof(sdb_object_t), NULL, NULL }, \ + /* ref-cnt */ 1, (name) } + typedef struct { sdb_object_t super; void *data; @@ -68,6 +72,17 @@ typedef struct { #define SDB_OBJ_WRAPPER(obj) ((sdb_object_wrapper_t *)(obj)) #define SDB_CONST_OBJ_WRAPPER(obj) ((const sdb_object_wrapper_t *)(obj)) +/* + * Callback types for comparing objects or performing object lookup. + * Any function of type sdb_object_cmp_cb shall return a negative value, zero, + * or a positive value if the first object compares less than, equal to, or + * greater than the second object respectively. + * Any function of type sdb_object_lookup_cb shall return zero for all + * matching objects. + */ +typedef int (*sdb_object_cmp_cb)(const sdb_object_t *, const sdb_object_t *); +typedef int (*sdb_object_lookup_cb)(const sdb_object_t *, const void *user_data); + /* * sdb_object_create: * Allocates a new sdb_object_t of the specified 'name' and 'type'. The object @@ -78,7 +93,9 @@ typedef struct { * * The init function will be called with the remaining arguments passed to * sdb_object_create. If the init function fails (returns a non-zero value), - * the object will be destructed and destroyed. + * the object will be destructed and destroyed. In this case, the 'destroy' + * callback may be called on objects that were only half-way initialized. The + * callback has to handle that case correctly. * * The reference count of the new object will be 1. * @@ -91,6 +108,29 @@ sdb_object_create(const char *name, sdb_type_t type, ...); sdb_object_t * sdb_object_vcreate(const char *name, sdb_type_t type, va_list ap); +/* + * sdb_object_create_simple: + * Create a "simple" object without custom initialization and optional + * destructor. See the description of sdb_object_create for more details. + */ +sdb_object_t * +sdb_object_create_simple(const char *name, size_t size, + void (*destructor)(sdb_object_t *)); + +/* + * sdb_object_create_T: + * Create a simple object of type 't'. + */ +#define sdb_object_create_T(n,t) \ + sdb_object_create_simple((n), sizeof(t), NULL) + +/* + * sdb_object_create_dT: + * Create a simple object of dynamic type 't' using destructor 'd'. + */ +#define sdb_object_create_dT(n,t,d) \ + sdb_object_create_simple((n), sizeof(t), d) + /* * sdb_object_create_wrapper: * Create a new sdb_object_t wrapping some arbitrary other object. @@ -102,8 +142,8 @@ sdb_object_t * sdb_object_create_wrapper(const char *name, void *data, void (*destructor)(void *)); -#define SDB_OBJECT_WRAPPER_STATIC(obj, destructor) \ - { SDB_OBJECT_INIT, (obj), (destructor) } +#define SDB_OBJECT_WRAPPER_STATIC(obj) \ + { SDB_OBJECT_INIT, (obj), /* destructor */ NULL } /* * sdb_object_deref: