File indexing completed on 2024-06-23 05:21:36
0001 /* 0002 * SPDX-FileCopyrightText: 2008 Trevor Pounds 0003 * SPDX-License-Identifier: MIT 0004 */ 0005 0006 #ifndef __MOCKITOPP_TR1_TUPLE_HPP__ 0007 #define __MOCKITOPP_TR1_TUPLE_HPP__ 0008 0009 #include <mockitopp/detail/util/tr1_type_traits.hpp> 0010 0011 /** 0012 * partial implementation of tr1 <tuple> 0013 * for internal mockitopp use 0014 * 0015 * unsupported functionality: 0016 * 0017 * get 0018 * make_tuple 0019 * tie 0020 * tuple_element 0021 * tuple_size 0022 */ 0023 namespace mockitopp 0024 { 0025 namespace detail 0026 { 0027 namespace tr1 0028 { 0029 struct tuple_null_type {}; 0030 0031 template <typename H, typename T> 0032 struct tuple_cons 0033 { 0034 H head_; 0035 T tail_; 0036 0037 tuple_cons(typename add_reference<typename add_const<H>::type>::type head, 0038 typename add_reference<typename add_const<T>::type>::type tail) 0039 : head_(head) 0040 , tail_(tail) 0041 {} 0042 }; 0043 0044 // 10 element template 0045 template <typename T0 = tuple_null_type, typename T1 = tuple_null_type, typename T2 = tuple_null_type, typename T3 = tuple_null_type, typename T4 = tuple_null_type, typename T5 = tuple_null_type, typename T6 = tuple_null_type, typename T7 = tuple_null_type, typename T8 = tuple_null_type, typename T9 = tuple_null_type> 0046 struct tuple : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, tuple_null_type> > 0047 { 0048 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4, typename add_reference<typename add_const<T5 >::type>::type t5, typename add_reference<typename add_const<T6 >::type>::type t6, typename add_reference<typename add_const<T7 >::type>::type t7, typename add_reference<typename add_const<T8 >::type>::type t8, typename add_reference<typename add_const<T9 >::type>::type t9) 0049 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, tuple_null_type> > 0050 (t0, tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, tuple_null_type> 0051 (t1, t2, t3, t4, t5, t6, t7, t8, t9)) 0052 {} 0053 }; 0054 0055 // 2 element template 0056 template <typename T0, typename T1> 0057 struct tuple<T0, T1 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0058 : tuple_cons<T0, tuple<T1> > 0059 { 0060 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1) 0061 : tuple_cons<T0, tuple<T1> > 0062 (t0, tuple<T1> 0063 (t1)) 0064 {} 0065 }; 0066 0067 // 3 element template 0068 template <typename T0, typename T1, typename T2> 0069 struct tuple<T0, T1, T2 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0070 : tuple_cons<T0, tuple<T1, T2> > 0071 { 0072 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2) 0073 : tuple_cons<T0, tuple<T1, T2> > 0074 (t0, tuple<T1, T2> 0075 (t1, t2)) 0076 {} 0077 }; 0078 0079 // 4 element template 0080 template <typename T0, typename T1, typename T2, typename T3> 0081 struct tuple<T0, T1, T2, T3 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0082 : tuple_cons<T0, tuple<T1, T2, T3> > 0083 { 0084 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3) 0085 : tuple_cons<T0, tuple<T1, T2, T3> > 0086 (t0, tuple<T1, T2, T3> 0087 (t1, t2, t3)) 0088 {} 0089 }; 0090 0091 // 5 element template 0092 template <typename T0, typename T1, typename T2, typename T3, typename T4> 0093 struct tuple<T0, T1, T2, T3, T4 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0094 : tuple_cons<T0, tuple<T1, T2, T3, T4> > 0095 { 0096 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4) 0097 : tuple_cons<T0, tuple<T1, T2, T3, T4> > 0098 (t0, tuple<T1, T2, T3, T4> 0099 (t1, t2, t3, t4)) 0100 {} 0101 }; 0102 0103 // 6 element template 0104 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5> 0105 struct tuple<T0, T1, T2, T3, T4, T5 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0106 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5> > 0107 { 0108 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4, typename add_reference<typename add_const<T5 >::type>::type t5) 0109 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5> > 0110 (t0, tuple<T1, T2, T3, T4, T5> 0111 (t1, t2, t3, t4, t5)) 0112 {} 0113 }; 0114 0115 // 7 element template 0116 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 0117 struct tuple<T0, T1, T2, T3, T4, T5, T6 , tuple_null_type , tuple_null_type , tuple_null_type> 0118 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6> > 0119 { 0120 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4, typename add_reference<typename add_const<T5 >::type>::type t5, typename add_reference<typename add_const<T6 >::type>::type t6) 0121 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6> > 0122 (t0, tuple<T1, T2, T3, T4, T5, T6> 0123 (t1, t2, t3, t4, t5, t6)) 0124 {} 0125 }; 0126 0127 // 8 element template 0128 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 0129 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7 , tuple_null_type , tuple_null_type> 0130 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7> > 0131 { 0132 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4, typename add_reference<typename add_const<T5 >::type>::type t5, typename add_reference<typename add_const<T6 >::type>::type t6, typename add_reference<typename add_const<T7 >::type>::type t7) 0133 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7> > 0134 (t0, tuple<T1, T2, T3, T4, T5, T6, T7> 0135 (t1, t2, t3, t4, t5, t6, t7)) 0136 {} 0137 }; 0138 0139 // 9 element template 0140 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 0141 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8 , tuple_null_type> 0142 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7, T8> > 0143 { 0144 tuple(typename add_reference<typename add_const<T0 >::type>::type t0, typename add_reference<typename add_const<T1 >::type>::type t1, typename add_reference<typename add_const<T2 >::type>::type t2, typename add_reference<typename add_const<T3 >::type>::type t3, typename add_reference<typename add_const<T4 >::type>::type t4, typename add_reference<typename add_const<T5 >::type>::type t5, typename add_reference<typename add_const<T6 >::type>::type t6, typename add_reference<typename add_const<T7 >::type>::type t7, typename add_reference<typename add_const<T8 >::type>::type t8) 0145 : tuple_cons<T0, tuple<T1, T2, T3, T4, T5, T6, T7, T8> > 0146 (t0, tuple<T1, T2, T3, T4, T5, T6, T7, T8> 0147 (t1, t2, t3, t4, t5, t6, t7, t8)) 0148 {} 0149 }; 0150 0151 0152 0153 // 1 element template 0154 template <typename T0> 0155 struct tuple<T0 , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type> 0156 : tuple_cons<T0, tuple_null_type> 0157 { 0158 tuple(typename add_reference<typename add_const<T0 >::type>::type t0) 0159 : tuple_cons<T0, tuple_null_type> 0160 (t0, tuple_null_type()) 0161 {} 0162 }; 0163 0164 // 0 element template 0165 template <> 0166 struct tuple< tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type , tuple_null_type > 0167 : tuple_cons<tuple_null_type, tuple_null_type> 0168 { 0169 tuple() 0170 : tuple_cons<tuple_null_type, tuple_null_type> 0171 (tuple_null_type(), tuple_null_type()) 0172 {} 0173 }; 0174 } // namespace tr1 0175 } // namespace detail 0176 } // namespace mockitopp 0177 0178 inline bool operator== (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return true; } 0179 inline bool operator!= (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return false; } 0180 inline bool operator< (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return false; } 0181 inline bool operator<= (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return true; } 0182 inline bool operator> (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return false; } 0183 inline bool operator>= (mockitopp::detail::tr1::tuple_null_type, mockitopp::detail::tr1::tuple_null_type) { return true; } 0184 0185 template <typename L0, typename L1, typename R0, typename R1> 0186 inline bool operator== (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0187 { return (lhs.head_ == rhs.head_) && (lhs.tail_ == rhs.tail_); } 0188 0189 template <typename L0, typename L1, typename R0, typename R1> 0190 inline bool operator!= (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0191 { return !(lhs == rhs); } 0192 0193 template <typename L0, typename L1, typename R0, typename R1> 0194 inline bool operator< (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0195 { return (lhs.head_ < rhs.head_) || (lhs.tail_ < rhs.tail_); } 0196 0197 template <typename L0, typename L1, typename R0, typename R1> 0198 inline bool operator<= (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0199 { return (lhs == rhs) || (lhs < rhs); } 0200 0201 template <typename L0, typename L1, typename R0, typename R1> 0202 inline bool operator> (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0203 { return (lhs.head_ > rhs.head_) && (lhs.tail_ > rhs.tail_); } 0204 0205 template <typename L0, typename L1, typename R0, typename R1> 0206 inline bool operator>= (const mockitopp::detail::tr1::tuple_cons<L0, L1>& lhs, const mockitopp::detail::tr1::tuple_cons<R0, R1>& rhs) 0207 { return (lhs == rhs) || (lhs > rhs); } 0208 0209 #endif //__MOCKITOPP_TR1_TUPLE_HPP__