Commit 7d39785a79b8d25c6cb5ed1b6a4b057c5c212631

Authored by Georg Hopp
1 parent 6a5d1668

added classvars. This again changes the interface for class declaration and definition.

@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 * \author Georg Hopp 20 * \author Georg Hopp
21 * 21 *
22 * \copyright 22 * \copyright
23 - * Copyright © 2012-2013 Georg Hopp 23 + * Copyright © 2014 Georg Hopp
24 * 24 *
25 * This program is free software: you can redistribute it and/or modify 25 * This program is free software: you can redistribute it and/or modify
26 * it under the terms of the GNU General Public License as published by 26 * it under the terms of the GNU General Public License as published by
@@ -73,6 +73,9 @@ @@ -73,6 +73,9 @@
73 struct c_##name data; \ 73 struct c_##name data; \
74 } 74 }
75 75
  76 +#define TR_CLASSVARS_DECL(name) struct c_##name##_vars
  77 +#define TR_CLASSVARS(name, class) ((struct c_##name##_vars *)(class)->vars)
  78 +
76 /** 79 /**
77 * Make the new class a child of an existing class. 80 * Make the new class a child of an existing class.
78 * This is used within the class declaration and can 81 * This is used within the class declaration and can
@@ -80,8 +83,8 @@ @@ -80,8 +83,8 @@
80 * is undefined, but most likely the resulting code won't 83 * is undefined, but most likely the resulting code won't
81 * even compile. 84 * even compile.
82 */ 85 */
83 -#define TR_EXTENDS(parent) \  
84 - const char _[sizeof(struct c_##parent)] 86 +#define TR_EXTENDS(parent) const char _[sizeof(struct c_##parent)]
  87 +#define TR_CV_EXTENDS(parent) const char _[sizeof(struct c_##parent##_vars)]
85 88
86 /** 89 /**
87 * Some macros might translate a give NULL to _NULL, 90 * Some macros might translate a give NULL to _NULL,
@@ -103,20 +106,26 @@ @@ -103,20 +106,26 @@
103 * for the ctor interface else no instances can be 106 * for the ctor interface else no instances can be
104 * created. 107 * created.
105 */ 108 */
106 -#define TR_CREATE_CLASS(name,_parent,...) \  
107 - static TR_class_ptr _classInit##name##_(void) { \  
108 - c_##name.parent = _##_parent; \  
109 - c_##name.init = NULL; \  
110 - return &c_##name; \  
111 - }; \  
112 - struct TR_class c_##name = { \  
113 - TR_CLASS_MAGIC, \  
114 - NULL, \  
115 - sizeof(struct c_##name), \  
116 - _classInit##name##_, \  
117 - TR_INIT_IFACE_IMPL(__VA_ARGS__) \  
118 - }; \  
119 - struct TR_class * const _##name = &c_##name 109 +#define TR_CREATE_CLASS(name,_parent,cvInit,...) \
  110 + struct c_##name##_vars c_vars; \
  111 + void (* TR_initClassVars##name)(TR_class_ptr) = cvInit; \
  112 + static TR_class_ptr _classInit##name##_(void) { \
  113 + c_##name.parent = _##_parent; \
  114 + if (TR_initClassVars##name) \
  115 + TR_initClassVars##name(_##name); \
  116 + c_##name.init = NULL; \
  117 + return &c_##name; \
  118 + }; \
  119 + struct TR_class c_##name = { \
  120 + TR_CLASS_MAGIC, \
  121 + NULL, \
  122 + sizeof(struct c_##name), \
  123 + _classInit##name##_, \
  124 + &c_vars, \
  125 + TR_INIT_IFACE_IMPL(__VA_ARGS__) \
  126 + }; \
  127 + struct TR_class * const _##name = &c_##name; \
  128 + struct c_##name##_vars c_vars
120 129
121 /** 130 /**
122 * Create a static instance of a class. 131 * Create a static instance of a class.
@@ -293,11 +302,12 @@ struct TR_class; @@ -293,11 +302,12 @@ struct TR_class;
293 typedef struct TR_class * TR_class_ptr; 302 typedef struct TR_class * TR_class_ptr;
294 typedef TR_class_ptr (* TR_fptr_classInit)(void); 303 typedef TR_class_ptr (* TR_fptr_classInit)(void);
295 struct TR_class { 304 struct TR_class {
296 - const int magic;  
297 - TR_class_ptr parent;  
298 - size_t object_size;  
299 - TR_fptr_classInit init;  
300 - struct TR_iface_impl impl; 305 + const int magic;
  306 + TR_class_ptr parent;
  307 + size_t object_size;
  308 + TR_fptr_classInit init;
  309 + void * vars;
  310 + struct TR_iface_impl impl;
301 }; 311 };
302 /** \endcond */ 312 /** \endcond */
303 313
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 * \author Georg Hopp 6 * \author Georg Hopp
7 * 7 *
8 * \copyright 8 * \copyright
9 - * Copyright © 2012 Georg Hopp 9 + * Copyright © 2014 Georg Hopp
10 * 10 *
11 * This program is free software: you can redistribute it and/or modify 11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by 12 * it under the terms of the GNU General Public License as published by
@@ -58,6 +58,10 @@ TR_INSTANCE_INIT(TR_Logger); @@ -58,6 +58,10 @@ TR_INSTANCE_INIT(TR_Logger);
58 TR_INSTANCE_INIT(TR_LoggerStderr); 58 TR_INSTANCE_INIT(TR_LoggerStderr);
59 TR_INSTANCE_INIT(TR_LoggerSyslog); 59 TR_INSTANCE_INIT(TR_LoggerSyslog);
60 60
  61 +TR_CLASSVARS_DECL(TR_Logger) {};
  62 +TR_CLASSVARS_DECL(TR_LoggerStderr) {};
  63 +TR_CLASSVARS_DECL(TR_LoggerSyslog) {};
  64 +
61 extern TR_Logger TR_logger; 65 extern TR_Logger TR_logger;
62 66
63 #endif // __TR_LOGGER_H__ 67 #endif // __TR_LOGGER_H__
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 * \author Georg Hopp 4 * \author Georg Hopp
5 * 5 *
6 * \copyright 6 * \copyright
7 - * Copyright © 2012 Georg Hopp 7 + * Copyright © 2014 Georg Hopp
8 * 8 *
9 * This program is free software: you can redistribute it and/or modify 9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 10 * it under the terms of the GNU General Public License as published by
@@ -52,6 +52,6 @@ loggerCtor(void * _this, va_list * params) @@ -52,6 +52,6 @@ loggerCtor(void * _this, va_list * params)
52 static void loggerDtor(void * _this) {} 52 static void loggerDtor(void * _this) {}
53 53
54 TR_INIT_IFACE(TR_Class, loggerCtor, loggerDtor, NULL); 54 TR_INIT_IFACE(TR_Class, loggerCtor, loggerDtor, NULL);
55 -TR_CREATE_CLASS(TR_Logger, NULL, TR_IF(TR_Class)); 55 +TR_CREATE_CLASS(TR_Logger, NULL, NULL, TR_IF(TR_Class));
56 56
57 // vim: set ts=4 sw=4: 57 // vim: set ts=4 sw=4:
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 * \author Georg Hopp 4 * \author Georg Hopp
5 * 5 *
6 * \copyright 6 * \copyright
7 - * Copyright © 2012 Georg Hopp 7 + * Copyright © 2014 Georg Hopp
8 * 8 *
9 * This program is free software: you can redistribute it and/or modify 9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 10 * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@ logStderr(void * this, TR_logger_level level, const char * const msg) @@ -34,7 +34,7 @@ logStderr(void * this, TR_logger_level level, const char * const msg)
34 } 34 }
35 35
36 TR_INIT_IFACE(TR_Logger, logStderr); 36 TR_INIT_IFACE(TR_Logger, logStderr);
37 -TR_CREATE_CLASS(TR_LoggerStderr, TR_Logger, TR_IF(TR_Logger)); 37 +TR_CREATE_CLASS(TR_LoggerStderr, TR_Logger, NULL, TR_IF(TR_Logger));
38 38
39 TR_INSTANCE(TR_LoggerStderr, TR_debugConlogger, {TR_LOGGER_DEBUG}); 39 TR_INSTANCE(TR_LoggerStderr, TR_debugConlogger, {TR_LOGGER_DEBUG});
40 TR_Logger TR_logger = TR_INSTANCE_CAST(TR_Logger, TR_debugConlogger); 40 TR_Logger TR_logger = TR_INSTANCE_CAST(TR_Logger, TR_debugConlogger);
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 * \author Georg Hopp 4 * \author Georg Hopp
5 * 5 *
6 * \copyright 6 * \copyright
7 - * Copyright © 2012 Georg Hopp 7 + * Copyright © 2014 Georg Hopp
8 * 8 *
9 * This program is free software: you can redistribute it and/or modify 9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 10 * it under the terms of the GNU General Public License as published by
@@ -47,6 +47,6 @@ logSyslog(void * this, TR_logger_level level, const char * const msg) @@ -47,6 +47,6 @@ logSyslog(void * this, TR_logger_level level, const char * const msg)
47 } 47 }
48 48
49 TR_INIT_IFACE(TR_Logger, logSyslog); 49 TR_INIT_IFACE(TR_Logger, logSyslog);
50 -TR_CREATE_CLASS(TR_LoggerSyslog, TR_Logger, TR_IF(TR_Logger)); 50 +TR_CREATE_CLASS(TR_LoggerSyslog, TR_Logger, NULL, TR_IF(TR_Logger));
51 51
52 // vim: set ts=4 sw=4: 52 // vim: set ts=4 sw=4:
Please register or login to post a comment