Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.71 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3.  
  4. namespace au
  5. {
  6.  
  7. template<class ... Types>
  8. struct tuple;
  9.  
  10.  
  11. template<class ... Types>
  12. struct tuple_sizeof;
  13.  
  14.  
  15. template<class T, class ... Types>
  16. struct tuple_sizeof<T, Types...>
  17. {
  18. static const size_t value = tuple_sizeof<Types...>::value + 1;
  19. };
  20.  
  21. template<>
  22. struct tuple_sizeof<>
  23. {
  24. static const size_t value = 0;
  25. };
  26.  
  27.  
  28. template<class T>
  29. struct tuple_size;
  30.  
  31. template<class ... Types>
  32. struct tuple_size<tuple<Types...>>
  33. {
  34. static const size_t value = tuple_sizeof<Types...>::value;
  35. };
  36.  
  37. template<size_t I, class ... Types>
  38. struct get_type;
  39.  
  40. template<size_t I, class T, class ... Types>
  41. struct get_type<I, T, Types...>
  42. {
  43. typedef typename get_type<I-1, Types...>::type type;
  44. };
  45.  
  46. template<class T, class ... Types>
  47. struct get_type<0, T, Types...>
  48. {
  49. typedef T type;
  50. };
  51.  
  52.  
  53. template<size_t I, class T>
  54. struct tuple_element;
  55.  
  56.  
  57. template<size_t I, class ... Types>
  58. struct tuple_element<I, tuple<Types...>>
  59. {
  60. typedef typename get_type<I, Types...>::type type;
  61. };
  62.  
  63.  
  64. template <>
  65. struct tuple<> { };
  66.  
  67. template<class T, class ... Types>
  68. struct tuple<T, Types...>
  69. {
  70. tuple() = default;
  71.  
  72. tuple(T&& arg, Types&& ... args)
  73. : head(std::forward<T>(arg))
  74. , tail(std::forward<Types>(args)...){}
  75.  
  76.  
  77. tuple(tuple<T, Types...> const &other)
  78. : head(other.head)
  79. , tail(other.tail){}
  80.  
  81. tuple(tuple<T, Types...> &&other)
  82. : head(std::move(other.head))
  83. , tail(std::move(other.tail)){}
  84.  
  85.  
  86.  
  87. tuple<T, Types...>& operator=(const tuple<T, Types...>& other)
  88. {
  89. head = other.head;
  90. tail = other.tail;
  91. return *this;
  92. }
  93.  
  94. tuple<T, Types...>& operator=(tuple<T, Types...>&& other)
  95. {
  96. head = std::move(other.head);
  97. tail = std::move(other.tail);
  98. return *this;
  99. }
  100.  
  101.  
  102. T head;
  103. tuple<Types...> tail;
  104. };
  105.  
  106.  
  107.  
  108. template<size_t I, class ... UTypes>
  109. struct get_value;
  110.  
  111. template<size_t I, class U, class ... UTypes>
  112. struct get_value<I, U, UTypes...>
  113. {
  114. static typename tuple_element<I, tuple<U, UTypes...> >::type const& value(tuple<U, UTypes...>const & t)
  115. {
  116. return get_value<I-1, UTypes...>::value(t.tail);
  117. }
  118.  
  119. static typename tuple_element<I, tuple<U, UTypes...> >::type& value(tuple<U, UTypes...>& t)
  120. {
  121. return get_value<I-1, UTypes...>::value(t.tail);
  122. }
  123. };
  124.  
  125. template<class U, class ... UTypes>
  126. struct get_value<0, U, UTypes...>
  127. {
  128. static typename tuple_element<0, tuple<U, UTypes...> >::type const& value(tuple<U, UTypes...>const & t)
  129. {
  130. return t.head;
  131. }
  132.  
  133. static typename tuple_element<0, tuple<U, UTypes...> >::type& value(tuple<U, UTypes...>& t)
  134. {
  135. return t.head;
  136. }
  137. };
  138.  
  139.  
  140. template<class U, class ... UTypes>
  141. struct find;
  142.  
  143. template<class T, class U, class ... UTypes>
  144. struct find<T, U, UTypes...>
  145. {
  146. static constexpr T& value(tuple<U, UTypes...>& t)
  147. {
  148. return t.tail;
  149. }
  150.  
  151. static constexpr T const& value(tuple<U, UTypes...>const & t)
  152. {
  153. return t.tail;
  154. }
  155. };
  156.  
  157.  
  158. template<class T, class ... UTypes>
  159. struct find<T, T, UTypes...>
  160. {
  161.  
  162. static constexpr T& value(tuple<T, UTypes...>& t)
  163. {
  164. return t.head;
  165. }
  166.  
  167. static constexpr T const& value(tuple<T, UTypes...>const & t)
  168. {
  169. return t.head;
  170. }
  171. };
  172.  
  173. template <class... Types>
  174. tuple<Types...> make_tuple(Types... args)
  175. {
  176. return tuple<Types...>(std::forward<Types>(args)...);
  177. }
  178.  
  179. template<size_t I, class... Types>
  180. typename tuple_element<I, tuple<Types...> >::type const& get(tuple<Types...> const & t)
  181. {
  182. return get_value<I, Types...>::value(t);
  183. };
  184.  
  185.  
  186. template<size_t I, class... Types>
  187. typename tuple_element<I, tuple<Types...> >::type& get(tuple<Types...> & t)
  188. {
  189. return get_value<I, Types...>::value(t);
  190. };
  191.  
  192.  
  193. template< class T, class... Types >
  194. constexpr T& get(tuple<Types...>& t) noexcept
  195. {
  196. return find<T, Types...>::value(t);
  197. }
  198.  
  199. template< class T, class... Types >
  200. constexpr T const& get(tuple<Types...> const& t) noexcept
  201. {
  202. return find<T, Types...>::value(t);
  203. }
  204.  
  205. } //au
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement