-
Notifications
You must be signed in to change notification settings - Fork 88
/
plooc_class_black_box.h
249 lines (192 loc) · 11 KB
/
plooc_class_black_box.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/****************************************************************************
* Copyright 2017 Gorgon Meducer (Email:embedded_zhuoran@hotmail.com) *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
****************************************************************************/
/*============================ INCLUDES ======================================*/
//#include <stdint.h>
//#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/*============================ MACROS ========================================*/
#undef declare_class
#undef dcl_class
#undef def_class
#undef define_class
#undef __def_class
#undef end_def_class
#undef end_define_class
#undef __end_def_class
#undef extern_class
#undef __extern_class
#undef end_extern_class
#undef __end_extern_class
#undef class
#undef __class
/*============================ MACROFIED FUNCTIONS ===========================*/
#if defined(__PLOOC_CLASS_IMPLEMENT__) || defined(__PLOOC_CLASS_IMPLEMENT)
# ifdef __OOC_DEBUG__
# define __def_class(__name, __public ,...) \
typedef struct __name __name; \
typedef struct __##__name __##__name; \
struct __##__name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
}; \
struct __name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
};
# else
# define __def_class(__name, __public, ...) \
typedef struct __name __name; \
typedef struct __##__name __##__name; \
struct __##__name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
}; \
struct __name { \
__public \
PLOOC_INVISIBLE(__VA_ARGS__) \
};
# endif
# define __end_def_class(__name, ...)
# undef private_member
# define private_member(...) PLOOC_VISIBLE(__VA_ARGS__)
# undef public_member
# define public_member(...) PLOOC_VISIBLE(__VA_ARGS__)
# undef __class
# define __class(__name) __##__name
# define class(__name) __class(__name)
#define __extern_class(__name,...)
#define __end_extern_class(__name, ...)
#else
#ifndef __OOC_DEBUG__
# define __def_class(__name, __public, ...) \
typedef struct __name __name; \
typedef struct __##__name __##__name; \
struct __##__name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
};
#define __extern_class(__name,__public, ...) \
typedef struct __name __name; \
struct __name { \
__public \
PLOOC_INVISIBLE(__VA_ARGS__) \
};
#define __end_extern_class(__name, ...)
# undef private_member
# define private_member(...) PLOOC_VISIBLE(__VA_ARGS__)
# undef public_member
# define public_member(...) PLOOC_VISIBLE(__VA_ARGS__)
#else
# define __def_class(__name, __public, ...) \
typedef struct __name __name; \
typedef struct __##__name __##__name; \
struct __##__name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
};
#define __extern_class(__name,__public, ...) \
typedef struct __name __name; \
struct __name { \
__public \
PLOOC_VISIBLE(__VA_ARGS__) \
};
#define __end_extern_class(__name, ...)
# undef private_member
# define private_member(...) PLOOC_INVISIBLE(__VA_ARGS__)
# undef public_member
# define public_member(...) PLOOC_VISIBLE(__VA_ARGS__)
#endif
# define __end_def_class(__name, ...)
#endif
# undef __class
# define __class(__name) __##__name
# undef class
# define class(__name) __class(__name)
#define declare_class(__name) typedef struct __name __name;
#define dcl_class(__name) declare_class(__name)
#define end_def_class(__name, ...) __end_def_class(__name, __VA_ARGS__)
#define end_define_class(__name, ...) end_def_class(__name, ...)
#define def_class(__name,__public, ...) \
__def_class(__name, __public, __VA_ARGS__)
#define define_class(__name, __public, ...) \
def_class(__name,__public, __VA_ARGS__)
#define class(__name) __class(__name)
#define extern_class(__name, __public, ...) \
__extern_class(__name, __public,__VA_ARGS__)
#define end_extern_class(__name, ...) __end_extern_class(__name, __VA_ARGS__)
#ifndef __PLOOC_CLASS_BLACK_BOX_H__
#define __PLOOC_CLASS_BLACK_BOX_H__
/*! \brief macro for initializing class in compiler-time
*! \param __type class name
*! \param __obj target object
*! \param ... initialization list
*/
#define __INIT_CLASS_OBJ(__type, __obj, ...) \
union { \
class(__type) __##__obj; \
__type; \
} __obj = { \
.__##__obj = __VA_ARGS__ \
}
#define init_class_obj(__type, __obj, ...) \
__INIT_CLASS_OBJ(__type, __obj, __VA_ARGS__)
#define __EXTERN_CLASS_OBJ( __type, __obj ) \
extern union { \
class(__type) __##__obj; \
__type; \
}__obj;
#define extern_class_obj(__type, __obj) \
__EXTERN_CLASS_OBJ( __type, __obj )
#endif
/*----------------------------------------------------------------------------*
* new standard (lower case) *
*----------------------------------------------------------------------------*/
# undef __class_internal
# define __class_internal(__src, __des, __type, ...) \
class(__type) *(__des) = (class(__type) *)(__src); \
PLOOC_UNUSED_PARAM(__des); \
__with_class(__type, (__src), __VA_ARGS__)
# undef class_internal
# define class_internal(__src, __des, __type,...) \
__class_internal(__src, __des, __type, __VA_ARGS__)
# undef __with_class
# define __with_class(__type, __src, ...) \
{ \
class(__type)*_ =(class(__type) *)(__src); \
PLOOC_UNUSED_PARAM(_); \
__VA_ARGS__; \
} \
for (class(__type)*_ =(class(__type) *)(__src); NULL != _; _ = NULL)
# undef with_class
# define with_class(__type, __src, ...) \
__with_class(__type, __src, __VA_ARGS__)
#undef which
#define which(...) PLOOC_VISIBLE(__VA_ARGS__)
/*============================ TYPES =========================================*/
/*============================ GLOBAL VARIABLES ==============================*/
/*============================ LOCAL VARIABLES ===============================*/
/*============================ PROTOTYPES ====================================*/
#undef __PLOOC_CLASS_IMPLEMENT__
#undef __PLOOC_CLASS_INHERIT__
#undef __PLOOC_CLASS_IMPLEMENT
#undef __PLOOC_CLASS_INHERIT
#ifdef __cplusplus
}
#endif
/* EOF */