File indexing completed on 2024-09-22 04:53:11

0001 #ifndef __MOCKITOPP_REMOVE_MEMBER_FUNCTION_POINTER_CV_HPP__
0002 #define __MOCKITOPP_REMOVE_MEMBER_FUNCTION_POINTER_CV_HPP__
0003 
0004 include(`mockitopp/detail/m4/ENUM_PARAMS.m4')dnl
0005 include(`mockitopp/detail/m4/ENUM_TRAILING_PARAMS.m4')dnl
0006 include(`mockitopp/detail/m4/REPEAT.m4')dnl
0007 namespace mockitopp
0008 {
0009    namespace detail
0010    {
0011       /** 
0012        * Simple meta-prorgramming template that removes
0013        * const/volatile from member function pointers
0014        * making them suitable for internal use.
0015        * 
0016        * @author Trevor Pounds
0017        */
0018       template <typename T>
0019       struct remove_member_function_pointer_cv
0020          { typedef T type; };
0021 
0022 define(`REMOVE_MFP_CV_TEMPLATE',
0023 `     // $1 argument MFP remove const template
0024       template <typename R, typename C`'M4_ENUM_TRAILING_PARAMS($1, typename A)>
0025       struct remove_member_function_pointer_cv<R (C::*)(M4_ENUM_PARAMS($1, A)) const>
0026          { typedef R (C::*type)(M4_ENUM_PARAMS($1, A)); };
0027 
0028       // $1 argument MFP remove const volatile template
0029       template <typename R, typename C`'M4_ENUM_TRAILING_PARAMS($1, typename A)>
0030       struct remove_member_function_pointer_cv<R (C::*)(M4_ENUM_PARAMS($1, A)) const volatile>
0031          { typedef R (C::*type)(M4_ENUM_PARAMS($1, A)); };
0032 
0033 ')dnl
0034 M4_REPEAT(eval(MOCKITOPP_MAX_VIRTUAL_FUNCTION_ARITY + 1), `REMOVE_MFP_CV_TEMPLATE')dnl
0035    } // namespace detail
0036 } // namespace mockitopp
0037 
0038 #endif //__MOCKITOPP_TR1_TYPE_TRAITS_HPP__