00001 #ifndef PROTON_OBJECT_H
00002 #define PROTON_OBJECT_H 1
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <proton/types.h>
00026 #include <stdarg.h>
00027 #include <proton/type_compat.h>
00028 #include <stddef.h>
00029 #include <proton/import_export.h>
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00035 typedef uintptr_t pn_handle_t;
00036 typedef intptr_t pn_shandle_t;
00037
00038 typedef struct pn_list_t pn_list_t;
00039 typedef struct pn_map_t pn_map_t;
00040 typedef struct pn_hash_t pn_hash_t;
00041 typedef struct pn_string_t pn_string_t;
00042 typedef void *(*pn_iterator_next_t)(void *state);
00043 typedef struct pn_iterator_t pn_iterator_t;
00044
00045 typedef struct {
00046 void (*initialize)(void *);
00047 void (*finalize)(void *);
00048 uintptr_t (*hashcode)(void *);
00049 intptr_t (*compare)(void *, void *);
00050 int (*inspect)(void *, pn_string_t *);
00051 } pn_class_t;
00052
00053 #define PN_CLASS(PREFIX) { \
00054 PREFIX ## _initialize, \
00055 PREFIX ## _finalize, \
00056 PREFIX ## _hashcode, \
00057 PREFIX ## _compare, \
00058 PREFIX ## _inspect \
00059 }
00060
00061 PN_EXTERN void *pn_new(size_t size, pn_class_t *clazz);
00062 PN_EXTERN void pn_initialize(void *object, pn_class_t *clazz);
00063 PN_EXTERN void *pn_incref(void *object);
00064 PN_EXTERN void pn_decref(void *object);
00065 PN_EXTERN int pn_refcount(void *object);
00066 PN_EXTERN void pn_finalize(void *object);
00067 PN_EXTERN void pn_free(void *object);
00068 PN_EXTERN pn_class_t *pn_class(void *object);
00069 PN_EXTERN uintptr_t pn_hashcode(void *object);
00070 PN_EXTERN intptr_t pn_compare(void *a, void *b);
00071 PN_EXTERN bool pn_equals(void *a, void *b);
00072 PN_EXTERN int pn_inspect(void *object, pn_string_t *dst);
00073
00074 #define PN_REFCOUNT (0x1)
00075
00076 PN_EXTERN pn_list_t *pn_list(size_t capacity, int options);
00077 PN_EXTERN size_t pn_list_size(pn_list_t *list);
00078 PN_EXTERN void *pn_list_get(pn_list_t *list, int index);
00079 PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value);
00080 PN_EXTERN int pn_list_add(pn_list_t *list, void *value);
00081 PN_EXTERN ssize_t pn_list_index(pn_list_t *list, void *value);
00082 PN_EXTERN bool pn_list_remove(pn_list_t *list, void *value);
00083 PN_EXTERN void pn_list_del(pn_list_t *list, int index, int n);
00084 PN_EXTERN void pn_list_clear(pn_list_t *list);
00085 PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter);
00086
00087 #define PN_REFCOUNT_KEY (0x2)
00088 #define PN_REFCOUNT_VALUE (0x4)
00089
00090 PN_EXTERN pn_map_t *pn_map(size_t capacity, float load_factor, int options);
00091 PN_EXTERN size_t pn_map_size(pn_map_t *map);
00092 PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value);
00093 PN_EXTERN void *pn_map_get(pn_map_t *map, void *key);
00094 PN_EXTERN void pn_map_del(pn_map_t *map, void *key);
00095 PN_EXTERN pn_handle_t pn_map_head(pn_map_t *map);
00096 PN_EXTERN pn_handle_t pn_map_next(pn_map_t *map, pn_handle_t entry);
00097 PN_EXTERN void *pn_map_key(pn_map_t *map, pn_handle_t entry);
00098 PN_EXTERN void *pn_map_value(pn_map_t *map, pn_handle_t entry);
00099
00100 PN_EXTERN pn_hash_t *pn_hash(size_t capacity, float load_factor, int options);
00101 PN_EXTERN size_t pn_hash_size(pn_hash_t *hash);
00102 PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value);
00103 PN_EXTERN void *pn_hash_get(pn_hash_t *hash, uintptr_t key);
00104 PN_EXTERN void pn_hash_del(pn_hash_t *hash, uintptr_t key);
00105 PN_EXTERN pn_handle_t pn_hash_head(pn_hash_t *hash);
00106 PN_EXTERN pn_handle_t pn_hash_next(pn_hash_t *hash, pn_handle_t entry);
00107 PN_EXTERN uintptr_t pn_hash_key(pn_hash_t *hash, pn_handle_t entry);
00108 PN_EXTERN void *pn_hash_value(pn_hash_t *hash, pn_handle_t entry);
00109
00110 PN_EXTERN pn_string_t *pn_string(const char *bytes);
00111 PN_EXTERN pn_string_t *pn_stringn(const char *bytes, size_t n);
00112 PN_EXTERN const char *pn_string_get(pn_string_t *string);
00113 PN_EXTERN size_t pn_string_size(pn_string_t *string);
00114 PN_EXTERN int pn_string_set(pn_string_t *string, const char *bytes);
00115 PN_EXTERN int pn_string_setn(pn_string_t *string, const char *bytes, size_t n);
00116 PN_EXTERN ssize_t pn_string_put(pn_string_t *string, char *dst);
00117 PN_EXTERN void pn_string_clear(pn_string_t *string);
00118 PN_EXTERN int pn_string_format(pn_string_t *string, const char *format, ...)
00119 #ifdef __GNUC__
00120 __attribute__ ((format (printf, 2, 3)))
00121 #endif
00122 ;
00123 PN_EXTERN int pn_string_vformat(pn_string_t *string, const char *format, va_list ap);
00124 PN_EXTERN int pn_string_addf(pn_string_t *string, const char *format, ...)
00125 #ifdef __GNUC__
00126 __attribute__ ((format (printf, 2, 3)))
00127 #endif
00128 ;
00129 PN_EXTERN int pn_string_vaddf(pn_string_t *string, const char *format, va_list ap);
00130 PN_EXTERN int pn_string_grow(pn_string_t *string, size_t capacity);
00131 PN_EXTERN char *pn_string_buffer(pn_string_t *string);
00132 PN_EXTERN size_t pn_string_capacity(pn_string_t *string);
00133 PN_EXTERN int pn_string_resize(pn_string_t *string, size_t size);
00134 PN_EXTERN int pn_string_copy(pn_string_t *string, pn_string_t *src);
00135
00136 PN_EXTERN pn_iterator_t *pn_iterator(void);
00137 PN_EXTERN void *pn_iterator_start(pn_iterator_t *iterator,
00138 pn_iterator_next_t next, size_t size);
00139 PN_EXTERN void *pn_iterator_next(pn_iterator_t *iterator);
00140
00141 #ifdef __cplusplus
00142 }
00143 #endif
00144
00145 #endif