Commit c5c48bb32051fa8e3fc6755475fb72276cd43482
1 parent
bbf4463f
modify static instance generation so that static instances of a class can now be…
… created anywhere. But the class needs to be prepared for this after its definition (TR_INSTANCE_INIT).
Showing
2 changed files
with
13 additions
and
8 deletions
| @@ -61,11 +61,18 @@ | @@ -61,11 +61,18 @@ | ||
| 61 | * that are needed to create a new class. | 61 | * that are needed to create a new class. |
| 62 | */ | 62 | */ |
| 63 | #define TR_CLASS(name) \ | 63 | #define TR_CLASS(name) \ |
| 64 | + struct TR_class c_##name; \ | ||
| 64 | struct c_##name; \ | 65 | struct c_##name; \ |
| 65 | typedef struct c_##name * name; \ | 66 | typedef struct c_##name * name; \ |
| 66 | extern struct TR_class * const _##name; \ | 67 | extern struct TR_class * const _##name; \ |
| 67 | struct c_##name | 68 | struct c_##name |
| 68 | 69 | ||
| 70 | +#define TR_INSTANCE_INIT(name) \ | ||
| 71 | + struct c_##name##_object { \ | ||
| 72 | + void * TR_class; \ | ||
| 73 | + struct c_##name data; \ | ||
| 74 | + } | ||
| 75 | + | ||
| 69 | /** | 76 | /** |
| 70 | * Make the new class a child of an existing class. | 77 | * Make the new class a child of an existing class. |
| 71 | * This is used within the class declaration and can | 78 | * This is used within the class declaration and can |
| @@ -97,25 +104,19 @@ | @@ -97,25 +104,19 @@ | ||
| 97 | * created. | 104 | * created. |
| 98 | */ | 105 | */ |
| 99 | #define TR_CREATE_CLASS(name,_parent,...) \ | 106 | #define TR_CREATE_CLASS(name,_parent,...) \ |
| 100 | - static struct TR_class c_##name; \ | ||
| 101 | static TR_class_ptr _classInit##name##_(void) { \ | 107 | static TR_class_ptr _classInit##name##_(void) { \ |
| 102 | c_##name.parent = _##_parent; \ | 108 | c_##name.parent = _##_parent; \ |
| 103 | c_##name.init = NULL; \ | 109 | c_##name.init = NULL; \ |
| 104 | return &c_##name; \ | 110 | return &c_##name; \ |
| 105 | }; \ | 111 | }; \ |
| 106 | - static struct TR_class c_##name = { \ | 112 | + struct TR_class c_##name = { \ |
| 107 | TR_CLASS_MAGIC, \ | 113 | TR_CLASS_MAGIC, \ |
| 108 | NULL, \ | 114 | NULL, \ |
| 109 | sizeof(struct c_##name), \ | 115 | sizeof(struct c_##name), \ |
| 110 | _classInit##name##_, \ | 116 | _classInit##name##_, \ |
| 111 | TR_INIT_IFACE_IMPL(__VA_ARGS__) \ | 117 | TR_INIT_IFACE_IMPL(__VA_ARGS__) \ |
| 112 | }; \ | 118 | }; \ |
| 113 | - struct TR_class * const _##name = &c_##name; \ | ||
| 114 | - struct c_##name##_object { \ | ||
| 115 | - void * TR_class; \ | ||
| 116 | - struct c_##name data; \ | ||
| 117 | - } | ||
| 118 | - | 119 | + struct TR_class * const _##name = &c_##name |
| 119 | 120 | ||
| 120 | /** | 121 | /** |
| 121 | * Create a static instance of a class. | 122 | * Create a static instance of a class. |
| @@ -54,6 +54,10 @@ TR_CLASS(TR_LoggerSyslog) { | @@ -54,6 +54,10 @@ TR_CLASS(TR_LoggerSyslog) { | ||
| 54 | TR_EXTENDS(TR_Logger); | 54 | TR_EXTENDS(TR_Logger); |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | +TR_INSTANCE_INIT(TR_Logger); | ||
| 58 | +TR_INSTANCE_INIT(TR_LoggerStderr); | ||
| 59 | +TR_INSTANCE_INIT(TR_LoggerSyslog); | ||
| 60 | + | ||
| 57 | extern TR_Logger TR_logger; | 61 | extern TR_Logger TR_logger; |
| 58 | 62 | ||
| 59 | #endif // __TR_LOGGER_H__ | 63 | #endif // __TR_LOGGER_H__ |
Please
register
or
login
to post a comment