proton  0
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
object.h
Go to the documentation of this file.
1 #ifndef PROTON_OBJECT_H
2 #define PROTON_OBJECT_H 1
3 
4 /*
5  *
6  * Licensed to the Apache Software Foundation (ASF) under one
7  * or more contributor license agreements. See the NOTICE file
8  * distributed with this work for additional information
9  * regarding copyright ownership. The ASF licenses this file
10  * to you under the Apache License, Version 2.0 (the
11  * "License"); you may not use this file except in compliance
12  * with the License. You may obtain a copy of the License at
13  *
14  * http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing,
17  * software distributed under the License is distributed on an
18  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19  * KIND, either express or implied. See the License for the
20  * specific language governing permissions and limitations
21  * under the License.
22  *
23  */
24 
25 #include <proton/cid.h>
26 #include <proton/types.h>
27 #include <stdarg.h>
28 #include <proton/type_compat.h>
29 #include <stddef.h>
30 #include <proton/import_export.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 typedef uintptr_t pn_handle_t;
37 typedef intptr_t pn_shandle_t;
38 
39 typedef struct pn_class_t pn_class_t;
40 typedef struct pn_string_t pn_string_t;
41 typedef struct pn_list_t pn_list_t;
42 typedef struct pn_map_t pn_map_t;
43 typedef struct pn_hash_t pn_hash_t;
44 typedef void *(*pn_iterator_next_t)(void *state);
46 typedef struct pn_record_t pn_record_t;
47 
48 struct pn_class_t {
49  const char *name;
50  const pn_cid_t cid;
51  void *(*newinst)(const pn_class_t *, size_t);
52  void (*initialize)(void *);
53  void (*incref)(void *);
54  void (*decref)(void *);
55  int (*refcount)(void *);
56  void (*finalize)(void *);
57  void (*free)(void *);
58  const pn_class_t *(*reify)(void *);
59  uintptr_t (*hashcode)(void *);
60  intptr_t (*compare)(void *, void *);
61  int (*inspect)(void *, pn_string_t *);
62 };
63 
64 PN_EXTERN extern const pn_class_t *PN_OBJECT;
65 PN_EXTERN extern const pn_class_t *PN_VOID;
66 PN_EXTERN extern const pn_class_t *PN_WEAKREF;
67 
68 #define PN_CLASSDEF(PREFIX) \
69 static void PREFIX ## _initialize_cast(void *object) { \
70  PREFIX ## _initialize((PREFIX ## _t *) object); \
71 } \
72  \
73 static void PREFIX ## _finalize_cast(void *object) { \
74  PREFIX ## _finalize((PREFIX ## _t *) object); \
75 } \
76  \
77 static uintptr_t PREFIX ## _hashcode_cast(void *object) { \
78  uintptr_t (*fp)(PREFIX ## _t *) = PREFIX ## _hashcode; \
79  if (fp) { \
80  return fp((PREFIX ## _t *) object); \
81  } else { \
82  return (uintptr_t) object; \
83  } \
84 } \
85  \
86 static intptr_t PREFIX ## _compare_cast(void *a, void *b) { \
87  intptr_t (*fp)(PREFIX ## _t *, PREFIX ## _t *) = PREFIX ## _compare; \
88  if (fp) { \
89  return fp((PREFIX ## _t *) a, (PREFIX ## _t *) b); \
90  } else { \
91  return (intptr_t) a - (intptr_t) b; \
92  } \
93 } \
94  \
95 static int PREFIX ## _inspect_cast(void *object, pn_string_t *str) { \
96  int (*fp)(PREFIX ## _t *, pn_string_t *) = PREFIX ## _inspect; \
97  if (fp) { \
98  return fp((PREFIX ## _t *) object, str); \
99  } else { \
100  return pn_string_addf(str, "%s<%p>", #PREFIX, object); \
101  } \
102 } \
103  \
104 const pn_class_t *PREFIX ## __class(void) { \
105  static const pn_class_t clazz = { \
106  #PREFIX, \
107  CID_ ## PREFIX, \
108  pn_object_new, \
109  PREFIX ## _initialize_cast, \
110  pn_object_incref, \
111  pn_object_decref, \
112  pn_object_refcount, \
113  PREFIX ## _finalize_cast, \
114  pn_object_free, \
115  pn_object_reify, \
116  PREFIX ## _hashcode_cast, \
117  PREFIX ## _compare_cast, \
118  PREFIX ## _inspect_cast \
119  }; \
120  return &clazz; \
121 } \
122  \
123 PREFIX ## _t *PREFIX ## _new(void) { \
124  return (PREFIX ## _t *) pn_class_new(PREFIX ## __class(), \
125  sizeof(PREFIX ## _t)); \
126 }
127 
128 #define PN_CLASS(PREFIX) { \
129  #PREFIX, \
130  CID_ ## PREFIX, \
131  pn_object_new, \
132  PREFIX ## _initialize, \
133  pn_object_incref, \
134  pn_object_decref, \
135  pn_object_refcount, \
136  PREFIX ## _finalize, \
137  pn_object_free, \
138  pn_object_reify, \
139  PREFIX ## _hashcode, \
140  PREFIX ## _compare, \
141  PREFIX ## _inspect \
142 }
143 
144 #define PN_METACLASS(PREFIX) { \
145  #PREFIX, \
146  CID_ ## PREFIX, \
147  PREFIX ## _new, \
148  PREFIX ## _initialize, \
149  PREFIX ## _incref, \
150  PREFIX ## _decref, \
151  PREFIX ## _refcount, \
152  PREFIX ## _finalize, \
153  PREFIX ## _free, \
154  PREFIX ## _reify, \
155  PREFIX ## _hashcode, \
156  PREFIX ## _compare, \
157  PREFIX ## _inspect \
158 }
159 
161 PN_EXTERN const char *pn_class_name(const pn_class_t *clazz);
162 PN_EXTERN void *pn_class_new(const pn_class_t *clazz, size_t size);
163 PN_EXTERN void *pn_class_incref(const pn_class_t *clazz, void *object);
164 PN_EXTERN int pn_class_refcount(const pn_class_t *clazz, void *object);
165 PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object);
166 PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object);
167 PN_EXTERN const pn_class_t *pn_class_reify(const pn_class_t *clazz, void *object);
168 PN_EXTERN uintptr_t pn_class_hashcode(const pn_class_t *clazz, void *object);
169 PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b);
170 PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b);
171 PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst);
172 
173 PN_EXTERN uintptr_t pn_void_hashcode(void *object);
174 PN_EXTERN intptr_t pn_void_compare(void *a, void *b);
175 PN_EXTERN int pn_void_inspect(void *object, pn_string_t *dst);
176 
177 PN_EXTERN void *pn_object_new(const pn_class_t *clazz, size_t size);
178 PN_EXTERN const pn_class_t *pn_object_reify(void *object);
179 PN_EXTERN void pn_object_incref(void *object);
180 PN_EXTERN int pn_object_refcount(void *object);
181 PN_EXTERN void pn_object_decref(void *object);
182 PN_EXTERN void pn_object_free(void *object);
183 
184 PN_EXTERN void *pn_incref(void *object);
185 PN_EXTERN int pn_decref(void *object);
186 PN_EXTERN int pn_refcount(void *object);
187 PN_EXTERN void pn_free(void *object);
188 PN_EXTERN const pn_class_t *pn_class(void* object);
189 PN_EXTERN uintptr_t pn_hashcode(void *object);
190 PN_EXTERN intptr_t pn_compare(void *a, void *b);
191 PN_EXTERN bool pn_equals(void *a, void *b);
192 PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
193 
194 #define PN_REFCOUNT (0x1)
195 
196 PN_EXTERN pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity);
197 PN_EXTERN size_t pn_list_size(pn_list_t *list);
198 PN_EXTERN void *pn_list_get(pn_list_t *list, int index);
199 PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value);
200 PN_EXTERN int pn_list_add(pn_list_t *list, void *value);
201 PN_EXTERN void *pn_list_pop(pn_list_t *list);
202 PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value);
203 PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value);
204 PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n);
205 PN_EXTERN void pn_list_clear(pn_list_t *list);
207 PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value);
208 PN_EXTERN void *pn_list_minpop(pn_list_t *list);
209 
210 #define PN_REFCOUNT_KEY (0x2)
211 #define PN_REFCOUNT_VALUE (0x4)
212 
213 PN_EXTERN pn_map_t *pn_map(const pn_class_t *key, const pn_class_t *value,
214  size_t capacity, float load_factor);
215 PN_EXTERN size_t pn_map_size(pn_map_t *map);
216 PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value);
217 PN_EXTERN void *pn_map_get(pn_map_t *map, void *key);
218 PN_EXTERN void pn_map_del(pn_map_t *map, void *key);
219 PN_EXTERN pn_handle_t pn_map_head(pn_map_t *map);
220 PN_EXTERN pn_handle_t pn_map_next(pn_map_t *map, pn_handle_t entry);
221 PN_EXTERN void *pn_map_key(pn_map_t *map, pn_handle_t entry);
222 PN_EXTERN void *pn_map_value(pn_map_t *map, pn_handle_t entry);
223 
224 PN_EXTERN pn_hash_t *pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor);
225 PN_EXTERN size_t pn_hash_size(pn_hash_t *hash);
226 PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value);
227 PN_EXTERN void *pn_hash_get(pn_hash_t *hash, uintptr_t key);
228 PN_EXTERN void pn_hash_del(pn_hash_t *hash, uintptr_t key);
229 PN_EXTERN pn_handle_t pn_hash_head(pn_hash_t *hash);
230 PN_EXTERN pn_handle_t pn_hash_next(pn_hash_t *hash, pn_handle_t entry);
231 PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry);
232 PN_EXTERN void *pn_hash_value(pn_hash_t *hash, pn_handle_t entry);
233 
234 PN_EXTERN pn_string_t *pn_string(const char *bytes);
235 PN_EXTERN pn_string_t *pn_stringn(const char *bytes, size_t n);
236 PN_EXTERN const char *pn_string_get(pn_string_t *string);
237 PN_EXTERN size_t pn_string_size(pn_string_t *string);
238 PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes);
239 PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n);
240 PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst);
242 PN_EXTERN int pn_string_format(pn_string_t *string, const char *format, ...)
243 #ifdef __GNUC__
244  __attribute__ ((format (printf, 2, 3)))
245 #endif
246  ;
247 PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap);
248 PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format, ...)
249 #ifdef __GNUC__
250  __attribute__ ((format (printf, 2, 3)))
251 #endif
252  ;
253 PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap);
254 PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity);
255 PN_EXTERN char *pn_string_buffer(pn_string_t *string);
257 PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size);
259 
262  pn_iterator_next_t next, size_t size);
263 PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
264 
265 #define PN_LEGCTX ((pn_handle_t) 0)
266 
267 #define PN_HANDLE(name) \
268  static char *_PN_HANDLE_ ## name = 0; \
269  static pn_handle_t name = ((pn_handle_t) &_PN_HANDLE_ ## name);
270 
272 PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz);
273 PN_EXTERN bool pn_record_has(pn_record_t *record, pn_handle_t key);
274 PN_EXTERN void *pn_record_get(pn_record_t *record, pn_handle_t key);
275 PN_EXTERN void pn_record_set(pn_record_t *record, pn_handle_t key, void *value);
277 
278 #ifdef __cplusplus
279 }
280 #endif
281 
282 #endif /* object.h */
PN_EXTERN void pn_object_decref(void *object)
PN_EXTERN void * pn_map_get(pn_map_t *map, void *key)
PN_EXTERN pn_string_t * pn_string(const char *bytes)
const char * name
Definition: object.h:49
PN_EXTERN uintptr_t pn_void_hashcode(void *object)
PN_EXTERN size_t pn_list_size(pn_list_t *list)
PN_EXTERN int pn_void_inspect(void *object, pn_string_t *dst)
PN_EXTERN uintptr_t pn_class_hashcode(const pn_class_t *clazz, void *object)
PN_EXTERN pn_map_t * pn_map(const pn_class_t *key, const pn_class_t *value, size_t capacity, float load_factor)
struct pn_hash_t pn_hash_t
Definition: object.h:43
PN_EXTERN void pn_record_def(pn_record_t *record, pn_handle_t key, const pn_class_t *clazz)
struct pn_string_t pn_string_t
Definition: object.h:40
PN_EXTERN const char * pn_class_name(const pn_class_t *clazz)
PN_EXTERN void pn_string_clear(pn_string_t *string)
PN_EXTERN const pn_class_t * PN_OBJECT
PN_EXTERN int pn_refcount(void *object)
PN_EXTERN void * pn_list_get(pn_list_t *list, int index)
PN_EXTERN int pn_string_format(pn_string_t *string, const char *format,...)
PN_EXTERN void * pn_object_new(const pn_class_t *clazz, size_t size)
PN_EXTERN const pn_class_t * PN_VOID
void(* free)(void *)
Definition: object.h:57
PN_EXTERN pn_handle_t pn_hash_head(pn_hash_t *hash)
PN_EXTERN void pn_list_clear(pn_list_t *list)
PN_EXTERN void * pn_map_key(pn_map_t *map, pn_handle_t entry)
PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b)
PN_EXTERN void * pn_list_pop(pn_list_t *list)
PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object)
#define PN_EXTERN
Definition: import_export.h:53
void *(* pn_iterator_next_t)(void *state)
Definition: object.h:44
PN_EXTERN void * pn_hash_value(pn_hash_t *hash, pn_handle_t entry)
PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b)
PN_EXTERN pn_handle_t pn_map_head(pn_map_t *map)
PN_EXTERN const pn_class_t * PN_WEAKREF
PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap)
void(* incref)(void *)
Definition: object.h:53
intptr_t pn_shandle_t
Definition: object.h:37
struct pn_iterator_t pn_iterator_t
Definition: object.h:45
PN_EXTERN void * pn_incref(void *object)
PN_EXTERN void pn_hash_del(pn_hash_t *hash, uintptr_t key)
PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n)
PN_EXTERN bool pn_equals(void *a, void *b)
void(* decref)(void *)
Definition: object.h:54
PN_EXTERN pn_handle_t pn_hash_next(pn_hash_t *hash, pn_handle_t entry)
PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap)
PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value)
PN_EXTERN pn_list_t * pn_list(const pn_class_t *clazz, size_t capacity)
PN_EXTERN intptr_t pn_compare(void *a, void *b)
PN_EXTERN void * pn_iterator_start(pn_iterator_t *iterator, pn_iterator_next_t next, size_t size)
pn_cid_t
Definition: cid.h:24
uintptr_t(* hashcode)(void *)
Definition: object.h:59
PN_EXTERN const pn_class_t * pn_object_reify(void *object)
PN_EXTERN char * pn_string_buffer(pn_string_t *string)
void(* finalize)(void *)
Definition: object.h:56
PN_EXTERN void pn_free(void *object)
struct pn_record_t pn_record_t
Definition: object.h:46
PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry)
void(* initialize)(void *)
Definition: object.h:52
PN_EXTERN void pn_map_del(pn_map_t *map, void *key)
int(* refcount)(void *)
Definition: object.h:55
PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format,...)
PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size)
uintptr_t pn_handle_t
Definition: object.h:36
PN_EXTERN size_t pn_string_capacity(pn_string_t *string)
PN_EXTERN void * pn_class_new(const pn_class_t *clazz, size_t size)
PN_EXTERN pn_hash_t * pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor)
PN_EXTERN const pn_class_t * pn_class_reify(const pn_class_t *clazz, void *object)
PN_EXTERN void * pn_iterator_next(pn_iterator_t *iterator)
PN_EXTERN pn_handle_t pn_map_next(pn_map_t *map, pn_handle_t entry)
PN_EXTERN int pn_decref(void *object)
PN_EXTERN pn_record_t * pn_record(void)
PN_EXTERN void * pn_record_get(pn_record_t *record, pn_handle_t key)
struct pn_list_t pn_list_t
Definition: object.h:41
PN_EXTERN const char * pn_string_get(pn_string_t *string)
PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value)
PN_EXTERN void pn_object_incref(void *object)
int(* inspect)(void *, pn_string_t *)
Definition: object.h:61
PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz)
PN_EXTERN intptr_t pn_void_compare(void *a, void *b)
PN_EXTERN void * pn_map_value(pn_map_t *map, pn_handle_t entry)
PN_EXTERN void * pn_class_incref(const pn_class_t *clazz, void *object)
PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n)
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)
PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value)
intptr_t(* compare)(void *, void *)
Definition: object.h:60
PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity)
PN_EXTERN int pn_list_add(pn_list_t *list, void *value)
PN_EXTERN const pn_class_t * pn_class(void *object)
PN_EXTERN void pn_record_set(pn_record_t *record, pn_handle_t key, void *value)
PN_EXTERN pn_string_t * pn_stringn(const char *bytes, size_t n)
PN_EXTERN int pn_inspect(void *object, pn_string_t *dst)
PN_EXTERN uintptr_t pn_hashcode(void *object)
PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes)
PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object)
PN_EXTERN void pn_record_clear(pn_record_t *record)
Definition: object.h:48
PN_EXTERN int pn_object_refcount(void *object)
PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter)
PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value)
PN_EXTERN void pn_object_free(void *object)
PN_EXTERN size_t pn_hash_size(pn_hash_t *hash)
PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst)
PN_EXTERN size_t pn_string_size(pn_string_t *string)
PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst)
PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value)
PN_EXTERN size_t pn_map_size(pn_map_t *map)
PN_EXTERN void * pn_list_minpop(pn_list_t *list)
PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value)
const pn_cid_t cid
Definition: object.h:50
PN_EXTERN void * pn_hash_get(pn_hash_t *hash, uintptr_t key)
PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src)
PN_EXTERN pn_iterator_t * pn_iterator(void)
struct pn_map_t pn_map_t
Definition: object.h:42