Commit 7d39785a79b8d25c6cb5ed1b6a4b057c5c212631
1 parent
6a5d1668
added classvars. This again changes the interface for class declaration and definition.
Showing
5 changed files
with
43 additions
and
29 deletions
... | ... | @@ -20,7 +20,7 @@ |
20 | 20 | * \author Georg Hopp |
21 | 21 | * |
22 | 22 | * \copyright |
23 | - * Copyright © 2012-2013 Georg Hopp | |
23 | + * Copyright © 2014 Georg Hopp | |
24 | 24 | * |
25 | 25 | * This program is free software: you can redistribute it and/or modify |
26 | 26 | * it under the terms of the GNU General Public License as published by |
... | ... | @@ -73,6 +73,9 @@ |
73 | 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 | 80 | * Make the new class a child of an existing class. |
78 | 81 | * This is used within the class declaration and can |
... | ... | @@ -80,8 +83,8 @@ |
80 | 83 | * is undefined, but most likely the resulting code won't |
81 | 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 | 90 | * Some macros might translate a give NULL to _NULL, |
... | ... | @@ -103,20 +106,26 @@ |
103 | 106 | * for the ctor interface else no instances can be |
104 | 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 | 131 | * Create a static instance of a class. |
... | ... | @@ -293,11 +302,12 @@ struct TR_class; |
293 | 302 | typedef struct TR_class * TR_class_ptr; |
294 | 303 | typedef TR_class_ptr (* TR_fptr_classInit)(void); |
295 | 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 | 312 | /** \endcond */ |
303 | 313 | ... | ... |
... | ... | @@ -6,7 +6,7 @@ |
6 | 6 | * \author Georg Hopp |
7 | 7 | * |
8 | 8 | * \copyright |
9 | - * Copyright © 2012 Georg Hopp | |
9 | + * Copyright © 2014 Georg Hopp | |
10 | 10 | * |
11 | 11 | * This program is free software: you can redistribute it and/or modify |
12 | 12 | * it under the terms of the GNU General Public License as published by |
... | ... | @@ -58,6 +58,10 @@ TR_INSTANCE_INIT(TR_Logger); |
58 | 58 | TR_INSTANCE_INIT(TR_LoggerStderr); |
59 | 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 | 65 | extern TR_Logger TR_logger; |
62 | 66 | |
63 | 67 | #endif // __TR_LOGGER_H__ | ... | ... |
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | * \author Georg Hopp |
5 | 5 | * |
6 | 6 | * \copyright |
7 | - * Copyright © 2012 Georg Hopp | |
7 | + * Copyright © 2014 Georg Hopp | |
8 | 8 | * |
9 | 9 | * This program is free software: you can redistribute it and/or modify |
10 | 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 | 52 | static void loggerDtor(void * _this) {} |
53 | 53 | |
54 | 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 | 57 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | * \author Georg Hopp |
5 | 5 | * |
6 | 6 | * \copyright |
7 | - * Copyright © 2012 Georg Hopp | |
7 | + * Copyright © 2014 Georg Hopp | |
8 | 8 | * |
9 | 9 | * This program is free software: you can redistribute it and/or modify |
10 | 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 | 34 | } |
35 | 35 | |
36 | 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 | 39 | TR_INSTANCE(TR_LoggerStderr, TR_debugConlogger, {TR_LOGGER_DEBUG}); |
40 | 40 | TR_Logger TR_logger = TR_INSTANCE_CAST(TR_Logger, TR_debugConlogger); | ... | ... |
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | * \author Georg Hopp |
5 | 5 | * |
6 | 6 | * \copyright |
7 | - * Copyright © 2012 Georg Hopp | |
7 | + * Copyright © 2014 Georg Hopp | |
8 | 8 | * |
9 | 9 | * This program is free software: you can redistribute it and/or modify |
10 | 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 | 47 | } |
48 | 48 | |
49 | 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 | 52 | // vim: set ts=4 sw=4: | ... | ... |
Please
register
or
login
to post a comment