7 #ifndef TEMPLATESOURCE_H
8 #define TEMPLATESOURCE_H
30 #define TEMPLATE_DEFINITION_INT(MEMBER, TYPE) TYPE m_##MEMBER;
31 #define TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE) TYPE m_##MEMBER;
32 #define TEMPLATE_DEFINITION_LIST(MEMBER) struct list_head m_##MEMBER;
33 #define TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE) TYPE *m_##MEMBER;
34 #define TEMPLATE_DEFINITION_STRING(MEMBER) UpnpString *m_##MEMBER;
35 #define TEMPLATE_DEFINITION_DOMSTRING(MEMBER) DOMString m_##MEMBER;
38 #define TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE)
39 #define TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE) \
41 #define TEMPLATE_CONSTRUCTOR_LIST(MEMBER, TYPE) INIT_LIST_HEAD(&p->m_##MEMBER);
42 #define TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE) p->m_##MEMBER = TYPE##_new();
43 #define TEMPLATE_CONSTRUCTOR_STRING(MEMBER) p->m_##MEMBER = UpnpString_new();
44 #define TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER) p->m_##MEMBER = NULL;
47 #define TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE) p->m_##MEMBER = 0;
48 #define TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE) memset(&p->m_##MEMBER, 0, sizeof (TYPE));
49 #define TEMPLATE_DESTRUCTOR_LIST(MEMBER) list_del(&p->m_##MEMBER);
50 #define TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE) TYPE##_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
51 #define TEMPLATE_DESTRUCTOR_STRING(MEMBER) UpnpString_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
52 #define TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER) ixmlFreeDOMString(p->m_##MEMBER); p->m_##MEMBER = NULL;
55 #define TEMPLATE_ASSIGNMENT(CLASS, MEMBER) ok = ok && CLASS##_set_##MEMBER(p, CLASS##_get_##MEMBER(q));
59 #define TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE) \
60 TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE)
61 #define TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE) \
62 TYPE CLASS##_get_##MEMBER(const CLASS *p) \
64 return ((struct S##CLASS *)p)->m_##MEMBER; \
67 int CLASS##_set_##MEMBER(CLASS *p, TYPE n) \
69 ((struct S##CLASS *)p)->m_##MEMBER = n; \
75 #define TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE) \
76 TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE)
77 #define TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE) \
78 const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
80 return (TYPE *)&((struct S##CLASS *)p)->m_##MEMBER; \
83 int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf) \
85 ((struct S##CLASS *)p)->m_##MEMBER = *(TYPE *)buf; \
89 void CLASS##_clear_##MEMBER(CLASS *p) \
91 memset(&((struct S##CLASS *)p)->m_##MEMBER, 0, sizeof(TYPE)); \
96 #define TEMPLATE_METHODS_LIST(CLASS, MEMBER) \
97 TEMPLATE_METHODS_LIST_AUX(CLASS, MEMBER)
98 #define TEMPLATE_METHODS_LIST_AUX(CLASS, MEMBER) \
99 const struct list_head *CLASS##_get_##MEMBER(const CLASS *p) \
101 return (struct list_head *)&((struct S##CLASS *)p)->m_##MEMBER; \
104 void CLASS##_add_to_list_##MEMBER(CLASS *p, struct list_head *head) \
106 list_add(&((struct S##CLASS *)p)->m_##MEMBER, head); \
109 void CLASS##_remove_from_list_##MEMBER(CLASS *p) \
111 list_del_init(&((struct S##CLASS *)p)->m_##MEMBER); \
114 void CLASS##_replace_in_list_##MEMBER(CLASS *p, struct list_head *new) \
116 list_replace_init(&((struct S##CLASS *)p)->m_##MEMBER, new); \
121 #define TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE) \
122 TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE)
123 #define TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE) \
124 const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
126 return ((struct S##CLASS *)p)->m_##MEMBER; \
129 int CLASS##_set_##MEMBER(CLASS *p, const TYPE *s) \
131 TYPE *q = TYPE##_dup(s); \
133 TYPE##_delete(((struct S##CLASS *)p)->m_##MEMBER); \
134 ((struct S##CLASS *)p)->m_##MEMBER = q; \
140 #define TEMPLATE_METHODS_STRING(CLASS, MEMBER) \
141 TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER)
142 #define TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER) \
143 const UpnpString *CLASS##_get_##MEMBER(const CLASS *p) \
145 return ((struct S##CLASS *)p)->m_##MEMBER; \
148 int CLASS##_set_##MEMBER(CLASS *p, const UpnpString *s) \
150 const char *q = UpnpString_get_String(s); \
151 return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, q); \
154 size_t CLASS##_get_##MEMBER##_Length(const CLASS *p) \
156 return UpnpString_get_Length(CLASS##_get_##MEMBER(p)); \
158 const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
160 return UpnpString_get_String(CLASS##_get_##MEMBER(p)); \
163 int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s) \
165 return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, s); \
168 int CLASS##_strncpy_##MEMBER(CLASS *p, const char *s, size_t n) \
170 return UpnpString_set_StringN(((struct S##CLASS *)p)->m_##MEMBER, s, n); \
173 void CLASS##_clear_##MEMBER(CLASS *p) \
175 UpnpString_clear(((struct S##CLASS *)p)->m_##MEMBER); \
180 #define TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER) \
181 TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER)
182 #define TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER) \
183 const DOMString CLASS##_get_##MEMBER(const CLASS *p) \
185 return ((struct S##CLASS *)p)->m_##MEMBER; \
188 int CLASS##_set_##MEMBER(CLASS *p, const DOMString s) \
190 DOMString q = ixmlCloneDOMString(s); \
192 ixmlFreeDOMString(((struct S##CLASS *)p)->m_##MEMBER); \
193 ((struct S##CLASS *)p)->m_##MEMBER = q; \
197 const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
199 return (const char *)CLASS##_get_##MEMBER(p); \
215 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_INT(MEMBER, TYPE)
216 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE)
217 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_DEFINITION_LIST(MEMBER)
218 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE)
219 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DEFINITION_STRING(MEMBER)
220 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DEFINITION_DOMSTRING(MEMBER)
222 #define TEMPLATE_DECLARATION_STRUCT(CLASS) \
223 TEMPLATE_DECLARATION_STRUCT_AUX(CLASS)
224 #define TEMPLATE_DECLARATION_STRUCT_AUX(CLASS) \
226 EXPAND_CLASS_MEMBERS(CLASS) \
229 TEMPLATE_DECLARATION_STRUCT(CLASS)
231 #include "TemplateUndef.h"
234 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE)
235 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE)
236 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_LIST(MEMBER, MEMBER)
237 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE)
238 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_STRING(MEMBER)
239 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER)
241 #define TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS) \
242 TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS)
243 #define TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS) \
244 CLASS *CLASS##_new() \
246 struct S##CLASS *p = calloc(1, sizeof (struct S##CLASS)); \
248 if (!p) return NULL; \
250 EXPAND_CLASS_MEMBERS(CLASS) \
255 TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS)
257 #include "TemplateUndef.h"
260 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE)
261 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE)
262 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_LIST(MEMBER)
263 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE)
264 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_STRING(MEMBER)
265 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER)
267 #define TEMPLATE_DEFINITION_DESTRUCTOR(CLASS) \
268 TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS)
269 #define TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS) \
270 void CLASS##_delete(CLASS *q) \
272 struct S##CLASS *p = (struct S##CLASS *)q; \
276 EXPAND_CLASS_MEMBERS(CLASS) \
281 TEMPLATE_DEFINITION_DESTRUCTOR(CLASS)
283 #include "TemplateUndef.h"
286 #define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS) \
287 TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS)
288 #define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS) \
289 CLASS *CLASS##_dup(const CLASS *q) \
291 CLASS *p = CLASS##_new(); \
293 if (!p) return NULL; \
295 CLASS##_assign(p, q); \
300 TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS)
303 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
304 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
305 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER)
306 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
307 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
308 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
310 #define TEMPLATE_DEFINITION_ASSIGNMENT(CLASS) \
311 TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS)
312 #define TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS) \
313 int CLASS##_assign(CLASS *p, const CLASS *q) \
317 EXPAND_CLASS_MEMBERS(CLASS) \
322 TEMPLATE_DEFINITION_ASSIGNMENT(CLASS)
324 #include "TemplateUndef.h"
327 #define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE)
328 #define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE)
329 #define EXPAND_CLASS_MEMBER_LIST(CLASS, MEMBER) TEMPLATE_METHODS_LIST(CLASS, MEMBER)
330 #define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE)
331 #define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_METHODS_STRING(CLASS, MEMBER)
332 #define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER)
334 EXPAND_CLASS_MEMBERS(CLASS)
336 #include "TemplateUndef.h"