/**************************************************************************** * 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 //#include #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 */