78 #define REGISTRY_FIELDS \
79 struct registry_fields registry_data
85 #define REGISTRY_ACCESS_FIELD(CONTAINER) \
94 struct registry_container;
132 struct registry_container *container,
137 struct registry_container *container,
142 struct registry_container *container,
154 #define DEFINE_REGISTRY(TAG, ACCESS) \
155 struct registry_data_registry TAG ## _data_registry = { NULL, 0 }; \
157 const struct TAG ## _data * \
158 register_ ## TAG ## _data_with_cleanup (void (*save) (struct TAG *, void *), \
159 void (*free) (struct TAG *, void *)) \
161 struct registry_data_registration **curr; \
163 return (struct TAG ## _data *) \
164 register_data_with_cleanup (&TAG ## _data_registry, \
165 (registry_data_callback) save, \
166 (registry_data_callback) free); \
169 const struct TAG ## _data * \
170 register_ ## TAG ## _data (void) \
172 return register_ ## TAG ## _data_with_cleanup (NULL, NULL); \
176 TAG ## _alloc_data (struct TAG *container) \
178 struct registry_fields *rdata = &ACCESS (container)->registry_data; \
180 registry_alloc_data (&TAG ## _data_registry, rdata); \
184 TAG ## registry_callback_adaptor (registry_data_callback func, \
185 struct registry_container *container, \
188 struct TAG *tagged_container = (struct TAG *) container; \
189 struct registry_fields *rdata \
190 = &ACCESS (tagged_container)->registry_data; \
192 registry_ ## TAG ## _callback tagged_func \
193 = (registry_ ## TAG ## _callback) func; \
195 tagged_func (tagged_container, data); \
199 clear_ ## TAG ## _data (struct TAG *container) \
201 struct registry_fields *rdata = &ACCESS (container)->registry_data; \
203 registry_clear_data (&TAG ## _data_registry, \
204 TAG ## registry_callback_adaptor, \
205 (struct registry_container *) container, \
210 TAG ## _free_data (struct TAG *container) \
212 struct registry_fields *rdata = &ACCESS (container)->registry_data; \
214 registry_container_free_data (&TAG ## _data_registry, \
215 TAG ## registry_callback_adaptor, \
216 (struct registry_container *) container, \
221 set_ ## TAG ## _data (struct TAG *container, \
222 const struct TAG ## _data *data, \
225 struct registry_fields *rdata = &ACCESS (container)->registry_data; \
227 registry_set_data (rdata, \
228 (struct registry_data *) data, \
233 TAG ## _data (struct TAG *container, const struct TAG ## _data *data) \
235 struct registry_fields *rdata = &ACCESS (container)->registry_data; \
237 return registry_data (rdata, \
238 (struct registry_data *) data); \
244 #define DECLARE_REGISTRY(TAG) \
245 struct TAG ## _data; \
246 typedef void (*registry_ ## TAG ## _callback) (struct TAG *, void *); \
247 extern const struct TAG ## _data *register_ ## TAG ## _data (void); \
248 extern const struct TAG ## _data *register_ ## TAG ## _data_with_cleanup \
249 (registry_ ## TAG ## _callback save, registry_ ## TAG ## _callback free); \
250 extern void clear_ ## TAG ## _data (struct TAG *); \
251 extern void set_ ## TAG ## _data (struct TAG *, \
252 const struct TAG ## _data *data, \
254 extern void *TAG ## _data (struct TAG *, \
255 const struct TAG ## _data *data);
void * registry_data(struct registry_fields *fields, const struct registry_data *data)
struct registry_data_registration * next
const struct registry_data * register_data_with_cleanup(struct registry_data_registry *registry, registry_data_callback save, registry_data_callback free)
unsigned num_registrations
void registry_alloc_data(struct registry_data_registry *registry, struct registry_fields *registry_fields)
struct registry_data_registration * registrations
void registry_set_data(struct registry_fields *fields, const struct registry_data *data, void *value)
struct registry_data * data
registry_data_callback save
void registry_container_free_data(struct registry_data_registry *data_registry, registry_callback_adaptor adaptor, struct registry_container *container, struct registry_fields *fields)
void registry_clear_data(struct registry_data_registry *data_registry, registry_callback_adaptor adaptor, struct registry_container *container, struct registry_fields *fields)
void(* registry_callback_adaptor)(registry_data_callback func, struct registry_container *container, void *data)
registry_data_callback free
void(* registry_data_callback)(struct registry_container *, void *)