Introducing template object methods.
This commit is contained in:
parent
81b28fbb90
commit
cf79479b2b
147
upnp/inc/TemplateInclude.h
Normal file
147
upnp/inc/TemplateInclude.h
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
|
||||||
|
#ifndef TEMPLATEINCLUDE_H
|
||||||
|
#define TEMPLATEINCLUDE_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Templates for include files of objects.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* - In the include file Token.h:
|
||||||
|
* #include "Token_def.h"
|
||||||
|
* #include "TemplateInclude.h"
|
||||||
|
*
|
||||||
|
* - In the source file Token.c:
|
||||||
|
* #include "Token.h"
|
||||||
|
* #include "TemplateSource.h"
|
||||||
|
*
|
||||||
|
* \author Marcelo Roberto Jimenez
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_COMMON(CLASS) \
|
||||||
|
TEMPLATE_PROTOTYPE_COMMON_AUX(CLASS)
|
||||||
|
#define TEMPLATE_PROTOTYPE_COMMON_AUX(CLASS) \
|
||||||
|
/*!
|
||||||
|
* DOC_##CLASS
|
||||||
|
*/ \
|
||||||
|
typedef struct s_##CLASS CLASS; \
|
||||||
|
\
|
||||||
|
/*! Constructor */ \
|
||||||
|
EXPORT_SPEC CLASS *CLASS##_new(); \
|
||||||
|
\
|
||||||
|
/*! Destructor */ \
|
||||||
|
EXPORT_SPEC void CLASS##_delete(CLASS *p); \
|
||||||
|
\
|
||||||
|
/*! Copy Constructor */ \
|
||||||
|
EXPORT_SPEC CLASS *CLASS##_dup(const CLASS *p); \
|
||||||
|
\
|
||||||
|
/*! Assignment operator */ \
|
||||||
|
EXPORT_SPEC int CLASS##_assign(CLASS *p, const CLASS *q); \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_INT(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_PROTOTYPE_INT_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_PROTOTYPE_INT_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
/*! DOC_##CLASS##_##MEMBER */ \
|
||||||
|
EXPORT_SPEC TYPE CLASS##_get_##MEMBER(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_set_##MEMBER(CLASS *p, TYPE n); \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_BUFFER(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_PROTOTYPE_BUFFER_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_PROTOTYPE_BUFFER_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
/*! DOC_##CLASS_##MEMBER */ \
|
||||||
|
EXPORT_SPEC const TYPE *CLASS##_get_##MEMBER(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf); \
|
||||||
|
EXPORT_SPEC void CLASS##_clear_##MEMBER(CLASS *p); \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_OBJECT(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_PROTOTYPE_OBJECT_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_PROTOTYPE_OBJECT_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
/*! DOC_##CLASS##_##MEMBER */ \
|
||||||
|
EXPORT_SPEC const TYPE *CLASS##_get_##MEMBER(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_set_##MEMBER(CLASS *p, const TYPE *n); \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_STRING(CLASS, MEMBER) \
|
||||||
|
TEMPLATE_PROTOTYPE_STRING_AUX(CLASS, MEMBER)
|
||||||
|
#define TEMPLATE_PROTOTYPE_STRING_AUX(CLASS, MEMBER) \
|
||||||
|
/*! DOC_##CLASS##_##MEMBER */ \
|
||||||
|
EXPORT_SPEC const UpnpString *CLASS##_get_##MEMBER(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_set_##MEMBER(CLASS *p, const UpnpString *s); \
|
||||||
|
EXPORT_SPEC int CLASS##_get_##MEMBER##_Length(const CLASS *p); \
|
||||||
|
EXPORT_SPEC const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s); \
|
||||||
|
EXPORT_SPEC int CLASS##_strncpy_##MEMBER(CLASS *p, const char *s, int n); \
|
||||||
|
EXPORT_SPEC void CLASS##_clear_##MEMBER(CLASS *p); \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_PROTOTYPE_DOMSTRING(CLASS, MEMBER) \
|
||||||
|
TEMPLATE_PROTOTYPE_DOMSTRING_AUX(CLASS, MEMBER)
|
||||||
|
#define TEMPLATE_PROTOTYPE_DOMSTRING_AUX(CLASS, MEMBER) \
|
||||||
|
/*! DOC_##CLASS_##MEMBER */ \
|
||||||
|
EXPORT_SPEC const DOMString CLASS##_get_##MEMBER(const CLASS *p); \
|
||||||
|
EXPORT_SPEC int CLASS##_set_##MEMBER(CLASS *p, const DOMString s); \
|
||||||
|
EXPORT_SPEC const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p); \
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TEMPLATEINCLUDE_H */
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Actual source starts here.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h> /* for size_t */
|
||||||
|
|
||||||
|
|
||||||
|
#include "ixml.h" /* for DOMString, IXML_Document */
|
||||||
|
#include "UpnpGlobal.h" /* for EXPORT_SPEC */
|
||||||
|
#include "UpnpString.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
TEMPLATE_PROTOTYPE_COMMON(CLASS)
|
||||||
|
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_PROTOTYPE_INT(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_PROTOTYPE_BUFFER(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_PROTOTYPE_OBJECT(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_PROTOTYPE_STRING(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_PROTOTYPE_DOMSTRING(CLASS, MEMBER)
|
||||||
|
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TEMPLATE_GENERATE_SOURCE
|
||||||
|
#include "TemplateSource.h"
|
||||||
|
#endif /* TEMPLATE_GENERATE_SOURCE */
|
||||||
|
|
||||||
|
/* Cleanup the template mess. */
|
||||||
|
#undef PREFIX
|
||||||
|
#undef CLASS
|
||||||
|
#undef EXPAND_CLASS_MEMBERS
|
||||||
|
|
299
upnp/inc/TemplateSource.h
Normal file
299
upnp/inc/TemplateSource.h
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
|
||||||
|
#ifndef TEMPLATESOURCE_H
|
||||||
|
#define TEMPLATESOURCE_H
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Templates for source files of objects.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* - In the include file Token.h:
|
||||||
|
* #include "Token_def.h"
|
||||||
|
* #include "TemplateInclude.h"
|
||||||
|
*
|
||||||
|
* - In the source file Token.c:
|
||||||
|
* #include "Token.h"
|
||||||
|
* #include "TemplateSource.h"
|
||||||
|
*
|
||||||
|
* \author Marcelo Roberto Jimenez
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_DEFINITION_INT(MEMBER, TYPE) TYPE m_##MEMBER;
|
||||||
|
#define TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE) TYPE m_##MEMBER;
|
||||||
|
#define TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE) TYPE *m_##MEMBER;
|
||||||
|
#define TEMPLATE_DEFINITION_STRING(MEMBER) UpnpString *m_##MEMBER;
|
||||||
|
#define TEMPLATE_DEFINITION_DOMSTRING(MEMBER) DOMString m_##MEMBER;
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE) /* p->m_##MEMBER = 0; */
|
||||||
|
#define TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE) \
|
||||||
|
/* memset(&p->m_##MEMBER, 0, sizeof (TYPE)); */
|
||||||
|
#define TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE) p->m_##MEMBER = TYPE##_new();
|
||||||
|
#define TEMPLATE_CONSTRUCTOR_STRING(MEMBER) p->m_##MEMBER = UpnpString_new();
|
||||||
|
#define TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER) /* p->m_##MEMBER = NULL; */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE) p->m_##MEMBER = 0;
|
||||||
|
#define TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE) memset(&p->m_##MEMBER, 0, sizeof (TYPE));
|
||||||
|
#define TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE) TYPE##_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
|
||||||
|
#define TEMPLATE_DESTRUCTOR_STRING(MEMBER) UpnpString_delete(p->m_##MEMBER); p->m_##MEMBER = NULL;
|
||||||
|
#define TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER) p->m_##MEMBER = NULL;
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_ASSIGNMENT(CLASS, MEMBER) ok = ok && CLASS##_set_##MEMBER(p, CLASS##_get_##MEMBER(q));
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_METHODS_INT_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
TYPE CLASS##_get_##MEMBER(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return ((struct S##CLASS *)p)->m_##MEMBER; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_set_##MEMBER(CLASS *p, TYPE n) \
|
||||||
|
{ \
|
||||||
|
((struct S##CLASS *)p)->m_##MEMBER = n; \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_METHODS_BUFFER_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return (TYPE *)&((struct S##CLASS *)p)->m_##MEMBER; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_set_##MEMBER(CLASS *p, const TYPE *buf) \
|
||||||
|
{ \
|
||||||
|
((struct S##CLASS *)p)->m_##MEMBER = *(TYPE *)buf; \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
void CLASS##_clear_##MEMBER(CLASS *p) \
|
||||||
|
{ \
|
||||||
|
memset(&((struct S##CLASS *)p)->m_##MEMBER, 0, sizeof(TYPE)); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE) \
|
||||||
|
TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE)
|
||||||
|
#define TEMPLATE_METHODS_OBJECT_AUX(CLASS, MEMBER, TYPE) \
|
||||||
|
const TYPE *CLASS##_get_##MEMBER(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return ((struct S##CLASS *)p)->m_##MEMBER; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_set_##MEMBER(CLASS *p, const TYPE *s) \
|
||||||
|
{ \
|
||||||
|
TYPE *q = TYPE##_dup(s); \
|
||||||
|
if (!q) return 0; \
|
||||||
|
TYPE##_delete(((struct S##CLASS *)p)->m_##MEMBER); \
|
||||||
|
((struct S##CLASS *)p)->m_##MEMBER = q; \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_METHODS_STRING(CLASS, MEMBER) \
|
||||||
|
TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER)
|
||||||
|
#define TEMPLATE_METHODS_STRING_AUX(CLASS, MEMBER) \
|
||||||
|
const UpnpString *CLASS##_get_##MEMBER(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return ((struct S##CLASS *)p)->m_##MEMBER; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_set_##MEMBER(CLASS *p, const UpnpString *s) \
|
||||||
|
{ \
|
||||||
|
const char *q = UpnpString_get_String(s); \
|
||||||
|
return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, q); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_get_##MEMBER##_Length(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return UpnpString_get_Length(CLASS##_get_##MEMBER(p)); \
|
||||||
|
} \
|
||||||
|
const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return UpnpString_get_String(CLASS##_get_##MEMBER(p)); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_strcpy_##MEMBER(CLASS *p, const char *s) \
|
||||||
|
{ \
|
||||||
|
return UpnpString_set_String(((struct S##CLASS *)p)->m_##MEMBER, s); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_strncpy_##MEMBER(CLASS *p, const char *s, int n) \
|
||||||
|
{ \
|
||||||
|
return UpnpString_set_StringN(((struct S##CLASS *)p)->m_##MEMBER, s, n); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
void CLASS##_clear_##MEMBER(CLASS *p) \
|
||||||
|
{ \
|
||||||
|
UpnpString_clear(((struct S##CLASS *)p)->m_##MEMBER); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER) \
|
||||||
|
TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER)
|
||||||
|
#define TEMPLATE_METHODS_DOMSTRING_AUX(CLASS, MEMBER) \
|
||||||
|
const DOMString CLASS##_get_##MEMBER(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return ((struct S##CLASS *)p)->m_##MEMBER; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
int CLASS##_set_##MEMBER(CLASS *p, const DOMString s) \
|
||||||
|
{ \
|
||||||
|
DOMString q = ixmlCloneDOMString(s); \
|
||||||
|
if (!q) return 0; \
|
||||||
|
ixmlFreeDOMString(((struct S##CLASS *)p)->m_##MEMBER); \
|
||||||
|
((struct S##CLASS *)p)->m_##MEMBER = q; \
|
||||||
|
return 1; \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
const char *CLASS##_get_##MEMBER##_cstr(const CLASS *p) \
|
||||||
|
{ \
|
||||||
|
return (const char *)CLASS##_get_##MEMBER(p); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* Actual source starts here.
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdlib.h> /* for calloc(), free() */
|
||||||
|
#include <string.h> /* for strlen(), strdup() */
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_INT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_BUFFER(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DEFINITION_OBJECT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DEFINITION_STRING(MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DEFINITION_DOMSTRING(MEMBER)
|
||||||
|
|
||||||
|
#define TEMPLATE_DECLARATION_STRUCT(CLASS) \
|
||||||
|
TEMPLATE_DECLARATION_STRUCT_AUX(CLASS)
|
||||||
|
#define TEMPLATE_DECLARATION_STRUCT_AUX(CLASS) \
|
||||||
|
struct S##CLASS { \
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS) \
|
||||||
|
};
|
||||||
|
|
||||||
|
TEMPLATE_DECLARATION_STRUCT(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_INT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_BUFFER(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_CONSTRUCTOR_OBJECT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_STRING(MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_CONSTRUCTOR_DOMSTRING(MEMBER)
|
||||||
|
|
||||||
|
#define TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS) \
|
||||||
|
TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS)
|
||||||
|
#define TEMPLATE_DEFINITION_CONSTRUCTOR_AUX(CLASS) \
|
||||||
|
CLASS *CLASS##_new() \
|
||||||
|
{ \
|
||||||
|
struct S##CLASS *p = calloc(1, sizeof (struct S##CLASS)); \
|
||||||
|
\
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS) \
|
||||||
|
\
|
||||||
|
return (CLASS *)p; \
|
||||||
|
}
|
||||||
|
|
||||||
|
TEMPLATE_DEFINITION_CONSTRUCTOR(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_INT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_BUFFER(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_DESTRUCTOR_OBJECT(MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_STRING(MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_DESTRUCTOR_DOMSTRING(MEMBER)
|
||||||
|
|
||||||
|
#define TEMPLATE_DEFINITION_DESTRUCTOR(CLASS) \
|
||||||
|
TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS)
|
||||||
|
#define TEMPLATE_DEFINITION_DESTRUCTOR_AUX(CLASS) \
|
||||||
|
void CLASS##_delete(CLASS *q) \
|
||||||
|
{ \
|
||||||
|
struct S##CLASS *p = (struct S##CLASS *)q; \
|
||||||
|
\
|
||||||
|
if (!p) return; \
|
||||||
|
\
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS) \
|
||||||
|
\
|
||||||
|
free(p); \
|
||||||
|
}
|
||||||
|
|
||||||
|
TEMPLATE_DEFINITION_DESTRUCTOR(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS) \
|
||||||
|
TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS)
|
||||||
|
#define TEMPLATE_DEFINITION_COPY_CONSTRUCTOR_AUX(CLASS) \
|
||||||
|
CLASS *CLASS##_dup(const CLASS *q) \
|
||||||
|
{ \
|
||||||
|
CLASS *p = CLASS##_new(); \
|
||||||
|
\
|
||||||
|
CLASS##_assign(p, q); \
|
||||||
|
\
|
||||||
|
return p; \
|
||||||
|
}
|
||||||
|
|
||||||
|
TEMPLATE_DEFINITION_COPY_CONSTRUCTOR(CLASS)
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_ASSIGNMENT(CLASS, MEMBER)
|
||||||
|
|
||||||
|
#define TEMPLATE_DEFINITION_ASSIGNMENT(CLASS) \
|
||||||
|
TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS)
|
||||||
|
#define TEMPLATE_DEFINITION_ASSIGNMENT_AUX(CLASS) \
|
||||||
|
int CLASS##_assign(CLASS *p, const CLASS *q) \
|
||||||
|
{ \
|
||||||
|
int ok = 1; \
|
||||||
|
if (p != q) { \
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS) \
|
||||||
|
} \
|
||||||
|
return ok; \
|
||||||
|
}
|
||||||
|
|
||||||
|
TEMPLATE_DEFINITION_ASSIGNMENT(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
#define EXPAND_CLASS_MEMBER_INT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_INT(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_BUFFER(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_BUFFER(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_OBJECT(CLASS, MEMBER, TYPE) TEMPLATE_METHODS_OBJECT(CLASS, MEMBER, TYPE)
|
||||||
|
#define EXPAND_CLASS_MEMBER_STRING(CLASS, MEMBER) TEMPLATE_METHODS_STRING(CLASS, MEMBER)
|
||||||
|
#define EXPAND_CLASS_MEMBER_DOMSTRING(CLASS, MEMBER) TEMPLATE_METHODS_DOMSTRING(CLASS, MEMBER)
|
||||||
|
|
||||||
|
EXPAND_CLASS_MEMBERS(CLASS)
|
||||||
|
|
||||||
|
#include "TemplateUndef.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* TEMPLATESOURCE_H */
|
||||||
|
|
11
upnp/inc/TemplateUndef.h
Normal file
11
upnp/inc/TemplateUndef.h
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
/*!
|
||||||
|
* \file
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef EXPAND_CLASS_MEMBER_INT
|
||||||
|
#undef EXPAND_CLASS_MEMBER_OBJECT
|
||||||
|
#undef EXPAND_CLASS_MEMBER_STRING
|
||||||
|
#undef EXPAND_CLASS_MEMBER_DOMSTRING
|
||||||
|
#undef EXPAND_CLASS_MEMBER_BUFFER
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user