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__