1 #ifndef PROTON_OBJECT_H
2 #define PROTON_OBJECT_H 1
44 typedef void *(*pn_iterator_next_t)(
void *state);
70 #define PN_CLASSDEF(PREFIX) \
71 static void PREFIX ## _initialize_cast(void *object) { \
72 PREFIX ## _initialize((PREFIX ## _t *) object); \
75 static void PREFIX ## _finalize_cast(void *object) { \
76 PREFIX ## _finalize((PREFIX ## _t *) object); \
79 static uintptr_t PREFIX ## _hashcode_cast(void *object) { \
80 uintptr_t (*fp)(PREFIX ## _t *) = PREFIX ## _hashcode; \
82 return fp((PREFIX ## _t *) object); \
84 return (uintptr_t) object; \
88 static intptr_t PREFIX ## _compare_cast(void *a, void *b) { \
89 intptr_t (*fp)(PREFIX ## _t *, PREFIX ## _t *) = PREFIX ## _compare; \
91 return fp((PREFIX ## _t *) a, (PREFIX ## _t *) b); \
93 return (intptr_t) a - (intptr_t) b; \
97 static int PREFIX ## _inspect_cast(void *object, pn_string_t *str) { \
98 int (*fp)(PREFIX ## _t *, pn_string_t *) = PREFIX ## _inspect; \
100 return fp((PREFIX ## _t *) object, str); \
102 return pn_string_addf(str, "%s<%p>", #PREFIX, object); \
106 const pn_class_t *PREFIX ## __class(void) { \
107 static const pn_class_t clazz = { \
111 PREFIX ## _initialize_cast, \
114 pn_object_refcount, \
115 PREFIX ## _finalize_cast, \
118 PREFIX ## _hashcode_cast, \
119 PREFIX ## _compare_cast, \
120 PREFIX ## _inspect_cast \
125 PREFIX ## _t *PREFIX ## _new(void) { \
126 return (PREFIX ## _t *) pn_class_new(PREFIX ## __class(), \
127 sizeof(PREFIX ## _t)); \
130 #define PN_CLASS(PREFIX) { \
134 PREFIX ## _initialize, \
137 pn_object_refcount, \
138 PREFIX ## _finalize, \
141 PREFIX ## _hashcode, \
142 PREFIX ## _compare, \
146 #define PN_METACLASS(PREFIX) { \
150 PREFIX ## _initialize, \
153 PREFIX ## _refcount, \
154 PREFIX ## _finalize, \
157 PREFIX ## _hashcode, \
158 PREFIX ## _compare, \
196 #define PN_REFCOUNT (0x1)
212 #define PN_REFCOUNT_KEY (0x2)
213 #define PN_REFCOUNT_VALUE (0x4)
216 size_t capacity,
float load_factor);
246 __attribute__ ((format (printf, 2, 3)))
252 __attribute__ ((format (printf, 2, 3)))
267 #define PN_LEGCTX ((pn_handle_t) 0)
269 #define PN_HANDLE(name) \
270 static const char _PN_HANDLE_ ## name = 0; \
271 static const pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
PN_EXTERN pn_string_t * pn_string(const char *bytes)
PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry)
PN_EXTERN int pn_list_add(pn_list_t *list, void *value)
const pn_cid_t cid
Definition: object.h:50
PN_EXTERN const pn_class_t * pn_class(void *object)
PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes)
PN_EXTERN pn_list_t * pn_list(const pn_class_t *clazz, size_t capacity)
PN_EXTERN void * pn_record_get(pn_record_t *record, pn_handle_t key)
PN_EXTERN void pn_object_free(void *object)
PN_EXTERN void * pn_iterator_next(pn_iterator_t *iterator)
PN_EXTERN pn_handle_t pn_hash_head(pn_hash_t *hash)
int(* refcount)(void *)
Definition: object.h:55
PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value)
struct pn_record_t pn_record_t
Definition: object.h:46
PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value)
PN_EXTERN pn_handle_t pn_map_next(pn_map_t *map, pn_handle_t entry)
PN_EXTERN pn_string_t * pn_stringn(const char *bytes, size_t n)
PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value)
PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter)
void *(* pn_iterator_next_t)(void *state)
Definition: object.h:44
PN_EXTERN void pn_map_del(pn_map_t *map, void *key)
PN_EXTERN void pn_hash_del(pn_hash_t *hash, uintptr_t key)
PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format,...)
struct pn_string_t pn_string_t
Definition: object.h:40
int(* inspect)(void *, pn_string_t *)
Definition: object.h:61
PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b)
PN_EXTERN int pn_object_refcount(void *object)
PN_EXTERN size_t pn_list_size(pn_list_t *list)
PN_EXTERN pn_handle_t pn_map_head(pn_map_t *map)
PN_EXTERN int pn_void_inspect(void *object, pn_string_t *dst)
PN_EXTERN int pn_refcount(void *object)
#define PN_EXTERN
Definition: import_export.h:53
PN_EXTERN void * pn_list_pop(pn_list_t *list)
PN_EXTERN int pn_inspect(void *object, pn_string_t *dst)
PN_EXTERN int pn_decref(void *object)
PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz)
void(* finalize)(void *)
Definition: object.h:56
PN_EXTERN char * pn_string_buffer(pn_string_t *string)
PN_EXTERN uintptr_t pn_hashcode(void *object)
PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value)
PN_EXTERN uintptr_t pn_void_hashcode(void *object)
PN_EXTERN void * pn_list_get(pn_list_t *list, int index)
PN_EXTERN void * pn_object_new(const pn_class_t *clazz, size_t size)
PN_EXTERN void pn_object_decref(void *object)
PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src)
PN_EXTERN size_t pn_map_size(pn_map_t *map)
PN_EXTERN void * pn_hash_value(pn_hash_t *hash, pn_handle_t entry)
PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap)
PN_EXTERN int pn_string_format(pn_string_t *string, const char *format,...)
PN_EXTERN void * pn_map_get(pn_map_t *map, void *key)
PN_EXTERN void * pn_class_new(const pn_class_t *clazz, size_t size)
struct pn_list_t pn_list_t
Definition: object.h:41
void(* incref)(void *)
Definition: object.h:53
PN_EXTERN void * pn_hash_get(pn_hash_t *hash, uintptr_t key)
intptr_t(* compare)(void *, void *)
Definition: object.h:60
PN_EXTERN void pn_free(void *object)
PN_EXTERN const char * pn_string_get(pn_string_t *string)
PN_EXTERN const pn_class_t PN_WEAKREF[]
PN_EXTERN void pn_record_set(pn_record_t *record, pn_handle_t key, void *value)
PN_EXTERN size_t pn_string_size(pn_string_t *string)
PN_EXTERN const pn_class_t PN_VOID[]
PN_EXTERN pn_iterator_t * pn_iterator(void)
PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value)
PN_EXTERN bool pn_equals(void *a, void *b)
PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n)
PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz)
PN_EXTERN intptr_t pn_void_compare(void *a, void *b)
PN_EXTERN bool pn_record_has(pn_record_t *record, pn_handle_t key)
PN_EXTERN int pn_class_refcount(const pn_class_t *clazz, void *object)
void(* initialize)(void *)
Definition: object.h:52
struct pn_map_t pn_map_t
Definition: object.h:42
PN_EXTERN void pn_list_clear(pn_list_t *list)
PN_EXTERN size_t pn_string_capacity(pn_string_t *string)
PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size)
uintptr_t pn_handle_t
Definition: object.h:36
void(* decref)(void *)
Definition: object.h:54
uintptr_t(* hashcode)(void *)
Definition: object.h:59
PN_EXTERN pn_map_t * pn_map(const pn_class_t *key, const pn_class_t *value, size_t capacity, float load_factor)
PN_EXTERN size_t pn_hash_size(pn_hash_t *hash)
PN_EXTERN void * pn_list_minpop(pn_list_t *list)
PN_EXTERN void * pn_incref(void *object)
const char * name
Definition: object.h:49
PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b)
struct pn_hash_t pn_hash_t
Definition: object.h:43
PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object)
pn_cid_t
Definition: cid.h:24
PN_EXTERN void pn_record_clear(pn_record_t *record)
PN_EXTERN const char * pn_class_name(const pn_class_t *clazz)
PN_EXTERN void * pn_class_incref(const pn_class_t *clazz, void *object)
PN_EXTERN intptr_t pn_compare(void *a, void *b)
PN_EXTERN void pn_string_clear(pn_string_t *string)
PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst)
PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity)
PN_EXTERN void * pn_map_key(pn_map_t *map, pn_handle_t entry)
PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n)
PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value)
PN_EXTERN const pn_class_t * pn_object_reify(void *object)
PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object)
PN_EXTERN pn_record_t * pn_record(void)
PN_EXTERN uintptr_t pn_class_hashcode(const pn_class_t *clazz, void *object)
PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap)
PN_EXTERN void * pn_map_value(pn_map_t *map, pn_handle_t entry)
intptr_t pn_shandle_t
Definition: object.h:37
PN_EXTERN const pn_class_t * pn_class_reify(const pn_class_t *clazz, void *object)
PN_EXTERN const pn_class_t PN_OBJECT[]
PN_EXTERN pn_handle_t pn_hash_next(pn_hash_t *hash, pn_handle_t entry)
PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst)
void(* free)(void *)
Definition: object.h:57
PN_EXTERN pn_hash_t * pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor)
PN_EXTERN void pn_object_incref(void *object)
PN_EXTERN void * pn_iterator_start(pn_iterator_t *iterator, pn_iterator_next_t next, size_t size)
struct pn_iterator_t pn_iterator_t
Definition: object.h:45