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__