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) \
62TYPE CLASS##_get_##MEMBER(const CLASS *p) \
64 return ((struct S##CLASS *)p)->m_##MEMBER; \
67int 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) \
78const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
80 return (TYPE *)&((struct S##CLASS *)p)->m_##MEMBER; \
83int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf) \
85 ((struct S##CLASS *)p)->m_##MEMBER = *(TYPE *)buf; \
89void 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) \
99const struct list_head *CLASS##_get_##MEMBER(const CLASS *p) \
101 return (struct list_head *)&((struct S##CLASS *)p)->m_##MEMBER; \
104void CLASS##_add_to_list_##MEMBER(CLASS *p, struct list_head *head) \
106 list_add(&((struct S##CLASS *)p)->m_##MEMBER, head); \
109void CLASS##_remove_from_list_##MEMBER(CLASS *p) \
111 list_del_init(&((struct S##CLASS *)p)->m_##MEMBER); \
114void 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) \
124const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
126 return ((struct S##CLASS *)p)->m_##MEMBER; \
129int 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) \
143const UpnpString *CLASS##_get_##MEMBER(const CLASS *p) \
145 return ((struct S##CLASS *)p)->m_##MEMBER; \
148int 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); \
154size_t CLASS##_get_##MEMBER##_Length(const CLASS *p) \
156 return UpnpString_get_Length(CLASS##_get_##MEMBER(p)); \
158const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
160 return UpnpString_get_String(CLASS##_get_##MEMBER(p)); \
163int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s) \
165 return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, s); \
168int CLASS##_strncpy_##MEMBER(CLASS *p, const char *s, size_t n) \
170 return UpnpString_set_StringN(((struct S##CLASS *)p)->m_##MEMBER, s, n); \
173void 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) \
183const DOMString CLASS##_get_##MEMBER(const CLASS *p) \
185 return ((struct S##CLASS *)p)->m_##MEMBER; \
188int 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; \
197const 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) \
229TEMPLATE_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) \
244CLASS *CLASS##_new() \
246 struct S##CLASS *p = calloc(1, sizeof (struct S##CLASS)); \
248 if (!p) return NULL; \
250 EXPAND_CLASS_MEMBERS(CLASS) \
255TEMPLATE_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) \
270void CLASS##_delete(CLASS *q) \
272 struct S##CLASS *p = (struct S##CLASS *)q; \
276 EXPAND_CLASS_MEMBERS(CLASS) \
281TEMPLATE_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) \
289CLASS *CLASS##_dup(const CLASS *q) \
291 CLASS *p = CLASS##_new(); \
293 if (!p) return NULL; \
295 CLASS##_assign(p, q); \
300TEMPLATE_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) \
313int CLASS##_assign(CLASS *p, const CLASS *q) \
317 EXPAND_CLASS_MEMBERS(CLASS) \
322TEMPLATE_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)
334EXPAND_CLASS_MEMBERS(CLASS)
336#include "TemplateUndef.h"