/***************************************************************************** * Copyright(C)2009-2019 by GorgonMeducer * * * * 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. * * * ****************************************************************************/ #ifndef __PROTECTED_LOW_OVERHEAD_OBJECT_ORIENTED_C_H__ #define __PROTECTED_LOW_OVERHEAD_OBJECT_ORIENTED_C_H__ /*============================ INCLUDES ======================================*/ #if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && \ !defined(__cplusplus) //! you have to define this by yourselves #else #include #include #endif /*! \NOTE the uint_fast8_t used in this header file is defined in stdint.h if you don't have stdint.h supported in your toolchain, you should define uint_fast8_t all by yourself with following rule: a. if the target processor is 8 bits, define it as uint8_t b. if the target processor is 16 bits, define it as uint16_t c. if the target processor is 32 bits, define it as uint32_t d. if the target processor is 64 bits, define it as either uint32_t or uint64_t */ #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunknown-warning-option" #pragma clang diagnostic ignored "-Wreserved-identifier" #pragma clang diagnostic ignored "-Wtypedef-redefinition" #pragma clang diagnostic ignored "-Wmissing-declarations" #pragma clang diagnostic ignored "-Wempty-body" #pragma clang diagnostic ignored "-Wmicrosoft-anon-tag" #elif ((__ARMCC_VERSION >= 5000000) && (__ARMCC_VERSION < 6000000)) /*! arm compiler 5 */ #pragma push #pragma diag_suppress 1, 64, 174, 177, 188, 68, 513, 144, 2525 #elif defined(__IAR_SYSTEMS_ICC__) /*! IAR */ #elif defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-declarations" #pragma GCC diagnostic ignored "-Wempty-body" #pragma GCC diagnostic ignored "-Wpragmas" #pragma GCC diagnostic ignored "-Wformat=" #pragma GCC diagnostic ignored "-Wmissing-braces" #endif #ifdef __cplusplus extern "C" { #endif /*============================ MACROS ========================================*/ #ifndef __cplusplus #ifndef plooc_private #define plooc_private static #endif #ifndef plooc_public #define plooc_public #endif #endif /*============================ MACROFIED FUNCTIONS ===========================*/ /*! \note add which macro to support multiple inheriting and implementations *! *! declare_interface( i_lv0_abc_t ) *! declare_interface( i_lv0_efg_t ) *! def_interface( i_lv0_abc_t ) *! ... *! end_def_interface( i_lv0_abc_t ) *! *! def_interface( i_lv0_efg_t ) *! ... *! end_def_interface( i_lv0_efg_t ) *! *! declare_interface( i_lv1_t ) *! def_interface( i_lv1_t, which( inherit( i_lv0_abc_t ) *! inherit( i_lv0_efg_t ) ) ) *! ... *! end_def_interface( i_lv1_t ) */ #define __declare_interface(__name) typedef struct __name __name; #define __declare_structure(__name) typedef struct __name __name; #if (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L) && \ !defined(__cplusplus) //! \name interface definition //! @{ #define __def_interface(__name) \ /*typedef struct __name __name;*/ \ struct __name { #define __end_def_interface(__name) \ } \ ; //! @} //! \name structure definition //! @{ #define __def_structure(__name) \ /*typedef struct __name __name; */ \ struct __name { #define __end_def_structure(__name) \ } \ ; //! @} #else //! \name interface definition //! @{ #define __def_interface(__name, ...) \ typedef struct __name __name; \ __VA_ARGS__ \ struct __name { #define __end_def_interface(__name) \ } \ ; //! @} //! \name structure definition //! @{ #define __def_structure(__name, ...) \ typedef struct __name __name; \ __VA_ARGS__ \ struct __name { #define __end_def_structure(__name) \ } \ ; //! @} #endif //! \brief macro for inheritance #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L #define __IMPLEMENT_EX(__TYPE, __NAME) __TYPE __NAME; #else #define __IMPLEMENT_EX(__TYPE, __NAME) \ union { \ __TYPE __NAME; \ __TYPE; \ }; #endif #define __INHERIT_EX(__TYPE, __NAME) __TYPE __NAME; #define INHERIT_EX(__TYPE, __NAME) __INHERIT_EX(__TYPE, __NAME) #define __INHERIT(__TYPE) INHERIT_EX(__TYPE, use_as__##__TYPE) #define INHERIT(__TYPE) __INHERIT(__TYPE) /*! \note You can only use IMPLEMENT when defining INTERFACE. For Implement * interface when defining class, you should use DEF_CLASS_IMPLEMENT * instead. */ #define __IMPLEMENT(__INTERFACE) \ __IMPLEMENT_EX(__INTERFACE, use_as__##__INTERFACE) #define IMPLEMENT(__INTERFACE) __IMPLEMENT(__INTERFACE) /*! \note if you have used INHERIT or IMPLEMENT to define a class / INTERFACE, you can use OBJ_CONVERT_AS to extract the reference to the inherited object. \*/ #define __OBJ_CONVERT_AS(__OBJ, __INTERFACE) (__OBJ.use_as__##__INTERFACE) #define OBJ_CONVERT_AS(__OBJ, __INTERFACE) \ __OBJ_CONVERT_AS((__OBJ), __INTERFACE) #define __REF_OBJ_AS(__OBJ, __TYPE) (&(__OBJ.use_as__##__TYPE)) #define REF_OBJ_AS(__OBJ, __TYPE) __REF_OBJ_AS((__OBJ), __TYPE) #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \ defined(__cplusplus) /*! \brief You can use __PLOOC_EVAL() to dynamically select the right API which *! has the right number of parameters (no more than 8). */ //! @{ #define __PLOOC_VA_NUM_ARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \ _11, _12, _13, _14, _15, _16, __N, ...) \ __N #define __PLOOC_VA_NUM_ARGS(...) \ __PLOOC_VA_NUM_ARGS_IMPL(0, ##__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, \ 8, 7, 6, 5, 4, 3, 2, 1, 0) #define __16_PLOOC_EVAL(__FUNC, __NO_ARGS) __FUNC##__NO_ARGS #define __15_PLOOC_EVAL(__FUNC, __NO_ARGS) __16_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __14_PLOOC_EVAL(__FUNC, __NO_ARGS) __15_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __13_PLOOC_EVAL(__FUNC, __NO_ARGS) __14_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __12_PLOOC_EVAL(__FUNC, __NO_ARGS) __13_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __11_PLOOC_EVAL(__FUNC, __NO_ARGS) __12_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __10_PLOOC_EVAL(__FUNC, __NO_ARGS) __11_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __9_PLOOC_EVAL(__FUNC, __NO_ARGS) __10_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __8_PLOOC_EVAL(__FUNC, __NO_ARGS) __9_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __7_PLOOC_EVAL(__FUNC, __NO_ARGS) __8_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __6_PLOOC_EVAL(__FUNC, __NO_ARGS) __7_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __5_PLOOC_EVAL(__FUNC, __NO_ARGS) __6_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __4_PLOOC_EVAL(__FUNC, __NO_ARGS) __5_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __3_PLOOC_EVAL(__FUNC, __NO_ARGS) __4_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __2_PLOOC_EVAL(__FUNC, __NO_ARGS) __3_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __1_PLOOC_EVAL(__FUNC, __NO_ARGS) __2_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __0_PLOOC_EVAL(__FUNC, __NO_ARGS) __1_PLOOC_EVAL(__FUNC, __NO_ARGS) #define __PLOOC_EVAL(__FUNC, ...) \ __0_PLOOC_EVAL(__FUNC, __PLOOC_VA_NUM_ARGS(__VA_ARGS__)) //! @} #endif /*----------------------------------------------------------------------------* * new standard (lower case) * *----------------------------------------------------------------------------*/ #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L #define def_interface(__name) __def_interface(__name) #define define_interface(__name) __def_interface(__name) #define def_structure(__name) __def_structure(__name) #define define_structure(__name) __def_structure(__name) #define def_params(__code) __code #define define_params(__code) __code #define end_def_params() #define end_define_params() #define def_members(__code) __code #define define_members(__code) __code #define end_def_members() #define end_define_members() #else #define def_interface(__name, ...) __def_interface(__name, __VA_ARGS__) #define define_interface(__name, ...) __def_interface(__name, __VA_ARGS__) #define def_structure(__name, ...) __def_structure(__name, __VA_ARGS__) #define define_structure(__name, ...) __def_structure(__name, __VA_ARGS__) #define def_params(...) __VA_ARGS__ #define define_params(...) __VA_ARGS__ #define end_def_params(...) #define end_define_params(...) #define def_members(...) __VA_ARGS__ #define define_members(...) __VA_ARGS__ #define end_def_members(...) #define end_define_members(...) #endif #define implement(__type) IMPLEMENT(__type) #define implement_ex(__type, __name) __IMPLEMENT_EX(__type, __name) #define inherit_ex(__type, __name) INHERIT_EX(__type, __name) #define inherit(__type) INHERIT(__type) #define ref_interface(__INTERFACE) const __INTERFACE* ptMethod; #define convert_obj_as(__obj, __type) OBJ_CONVERT_AS(__obj, __type) #define obj_convert_as(__obj, __type) \ OBJ_CONVERT_AS(__obj, __type) /* obsolete */ #define ref_obj_as(__obj, __type) REF_OBJ_AS(__obj, __type) #define end_def_interface(__name) __end_def_interface(__name) #define end_define_interface(__name) __end_def_interface(__name) #define dcl_interface(__name) __declare_interface(__name) #define declare_interface(__name) __declare_interface(__name) #define end_def_structure(__name) __end_def_structure(__name) #define end_define_structure(__name) __end_def_structure(__name) #define dcl_structure(__name) __declare_structure(__name) #define declare_structure(__name) __declare_structure(__name) #define this_interface(__INTERFACE) convert_obj_as(this, __INTERFACE) #define base_obj(__type) convert_obj_as(this, __type) /*============================ TYPES =========================================*/ //! \name interface: u32_property_t //! @{ dcl_interface(u32_property_t) def_interface(u32_property_t) bool (*Set)(uint32_t wValue); uint32_t (*Get)(void); end_def_interface(u32_property_t) //! @} //! \name interface: u16_property_t //! @{ dcl_interface(u16_property_t) def_interface(u16_property_t) bool (*Set)(uint_fast16_t wValue); uint_fast16_t (*Get)(void); end_def_interface(u16_property_t) //! @} //! \name interface: u8_property_t //! @{ dcl_interface(u8_property_t) def_interface(u8_property_t) bool (*Set)(uint_fast8_t wValue); uint_fast8_t (*Get)(void); end_def_interface(u8_property_t) //! @} //! \name interface: i32_property_t //! @{ dcl_interface(i32_property_t) def_interface(i32_property_t) bool (*Set)(int32_t wValue); int32_t (*Get)(void); end_def_interface(i32_property_t) //! @} //! \name interface: i16_property_t //! @{ dcl_interface(i16_property_t) def_interface(i16_property_t) bool (*Set)(int_fast16_t wValue); int_fast16_t (*Get)(void); end_def_interface(i16_property_t) //! @} //! \name interface: u8_property_t //! @{ dcl_interface(i8_property_t) def_interface(i8_property_t) bool (*Set)(int_fast8_t wValue); int_fast8_t (*Get)(void); end_def_interface(i8_property_t) //! @} //! \name interface: bool_property_t //! @{ dcl_interface(bool_property_t) def_interface(bool_property_t) bool (*Set)(bool bValue); bool (*Get)(void); end_def_interface(bool_property_t) //! @} //! \name interface: bool_property_t //! @{ dcl_interface(en_property_t) def_interface(en_property_t) bool (*Enable)(void); bool (*Disable)(void); end_def_interface(en_property_t) //! @} /*============================ GLOBAL VARIABLES ==============================*/ /*============================ LOCAL VARIABLES ===============================*/ /*============================ PROTOTYPES ====================================*/ #ifdef __cplusplus } #endif //#if defined(__clang__) //# pragma clang diagnostic pop //#endif #endif /* EOF */