1 Star 1 Fork 3

Aladdin-Wang / PLOOC

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
plooc_class_black_box.h 10.56 KB
一键复制 编辑 原始数据 按行查看 历史
GorgonMeducer 提交于 2020-01-21 17:36 . Misc update for C90 enhancement
/****************************************************************************
* 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>
/*============================ MACROS ========================================*/
#undef def_class
#undef __def_class
#undef end_def_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)
# 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
# undef class
# 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)
#undef declare_class
#define declare_class(__NAME) typedef struct __NAME __NAME;
#define end_def_class(__NAME, ...) __end_def_class(__NAME, __VA_ARGS__)
#define def_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
/* EOF */
1
https://gitee.com/Aladdin-Wang/PLOOC.git
git@gitee.com:Aladdin-Wang/PLOOC.git
Aladdin-Wang
PLOOC
PLOOC
master

搜索帮助