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

0001 /*
0002  * SPDX-FileCopyrightText: 2008 Trevor Pounds
0003  * SPDX-License-Identifier: MIT
0004  */
0005 
0006 #ifndef __MOCKITOPP_REMOVE_MEMBER_FUNCTION_POINTER_CV_HPP__
0007 #define __MOCKITOPP_REMOVE_MEMBER_FUNCTION_POINTER_CV_HPP__
0008 
0009 namespace mockitopp
0010 {
0011    namespace detail
0012    {
0013       /** 
0014        * Simple meta-prorgramming template that removes
0015        * const/volatile from member function pointers
0016        * making them suitable for internal use.
0017        * 
0018        * @author Trevor Pounds
0019        */
0020       template <typename T>
0021       struct remove_member_function_pointer_cv
0022          { typedef T type; };
0023 
0024       // 0 argument MFP remove const template
0025       template <typename R, typename C>
0026       struct remove_member_function_pointer_cv<R (C::*)() const>
0027          { typedef R (C::*type)(); };
0028 
0029       // 0 argument MFP remove const volatile template
0030       template <typename R, typename C>
0031       struct remove_member_function_pointer_cv<R (C::*)() const volatile>
0032          { typedef R (C::*type)(); };
0033 
0034       // 1 argument MFP remove const template
0035       template <typename R, typename C, typename A0>
0036       struct remove_member_function_pointer_cv<R (C::*)(A0) const>
0037          { typedef R (C::*type)(A0); };
0038 
0039       // 1 argument MFP remove const volatile template
0040       template <typename R, typename C, typename A0>
0041       struct remove_member_function_pointer_cv<R (C::*)(A0) const volatile>
0042          { typedef R (C::*type)(A0); };
0043 
0044       // 2 argument MFP remove const template
0045       template <typename R, typename C, typename A0, typename A1>
0046       struct remove_member_function_pointer_cv<R (C::*)(A0, A1) const>
0047          { typedef R (C::*type)(A0, A1); };
0048 
0049       // 2 argument MFP remove const volatile template
0050       template <typename R, typename C, typename A0, typename A1>
0051       struct remove_member_function_pointer_cv<R (C::*)(A0, A1) const volatile>
0052          { typedef R (C::*type)(A0, A1); };
0053 
0054       // 3 argument MFP remove const template
0055       template <typename R, typename C, typename A0, typename A1, typename A2>
0056       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2) const>
0057          { typedef R (C::*type)(A0, A1, A2); };
0058 
0059       // 3 argument MFP remove const volatile template
0060       template <typename R, typename C, typename A0, typename A1, typename A2>
0061       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2) const volatile>
0062          { typedef R (C::*type)(A0, A1, A2); };
0063 
0064       // 4 argument MFP remove const template
0065       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3>
0066       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3) const>
0067          { typedef R (C::*type)(A0, A1, A2, A3); };
0068 
0069       // 4 argument MFP remove const volatile template
0070       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3>
0071       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3) const volatile>
0072          { typedef R (C::*type)(A0, A1, A2, A3); };
0073 
0074       // 5 argument MFP remove const template
0075       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4>
0076       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4) const>
0077          { typedef R (C::*type)(A0, A1, A2, A3, A4); };
0078 
0079       // 5 argument MFP remove const volatile template
0080       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4>
0081       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4) const volatile>
0082          { typedef R (C::*type)(A0, A1, A2, A3, A4); };
0083 
0084       // 6 argument MFP remove const template
0085       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
0086       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5) const>
0087          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5); };
0088 
0089       // 6 argument MFP remove const volatile template
0090       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
0091       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5) const volatile>
0092          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5); };
0093 
0094       // 7 argument MFP remove const template
0095       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
0096       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6) const>
0097          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6); };
0098 
0099       // 7 argument MFP remove const volatile template
0100       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
0101       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6) const volatile>
0102          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6); };
0103 
0104       // 8 argument MFP remove const template
0105       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
0106       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7) const>
0107          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7); };
0108 
0109       // 8 argument MFP remove const volatile template
0110       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
0111       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7) const volatile>
0112          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7); };
0113 
0114       // 9 argument MFP remove const template
0115       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
0116       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7, A8) const>
0117          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7, A8); };
0118 
0119       // 9 argument MFP remove const volatile template
0120       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
0121       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7, A8) const volatile>
0122          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7, A8); };
0123 
0124       // 10 argument MFP remove const template
0125       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
0126       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) const>
0127          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9); };
0128 
0129       // 10 argument MFP remove const volatile template
0130       template <typename R, typename C, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
0131       struct remove_member_function_pointer_cv<R (C::*)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9) const volatile>
0132          { typedef R (C::*type)(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9); };
0133 
0134    } // namespace detail
0135 } // namespace mockitopp
0136 
0137 #endif //__MOCKITOPP_TR1_TYPE_TRAITS_HPP__