tuple_tools 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef __GBLIBCPP_BITS_TUPLE_TOOLS__
  2. #define __GBLIBCPP_BITS_TUPLE_TOOLS__
  3. #include <cstddef>
  4. #include <bits/type_traits/remove_add>
  5. #include <bits/forward>
  6. #include <bits/sequence>
  7. #include <bits/fwd_functional>
  8. namespace std {
  9. template <typename... Types>
  10. class tuple;
  11. template <std::size_t I, typename T>
  12. struct tuple_element;
  13. template <std::size_t I, typename T>
  14. using tuple_element_t = typename tuple_element<I, T>::type;
  15. template <typename T>
  16. struct tuple_size;
  17. template <typename T>
  18. inline constexpr std::size_t tuple_size_v = tuple_size<T>::value;
  19. template <std::size_t I, typename... Types>
  20. constexpr auto get(std::tuple<Types...>& tpl) noexcept
  21. -> tuple_element_t<I, std::tuple<Types...>>&
  22. { return tpl.template _getl<I>(); }
  23. template <std::size_t I, typename... Types>
  24. constexpr auto get(std::tuple<Types...>&& tpl) noexcept
  25. -> tuple_element_t<I, std::tuple<Types...>>&&
  26. { return tpl.template _getr<I>(); }
  27. template <std::size_t I, typename... Types>
  28. constexpr auto get(const std::tuple<Types...>& tpl) noexcept
  29. -> tuple_element_t<I, std::tuple<Types...>> const&
  30. { return tpl.template _getl<I>(); }
  31. template <std::size_t I, typename... Types>
  32. constexpr auto get(const std::tuple<Types...>&& tpl) noexcept
  33. -> tuple_element_t<I, std::tuple<Types...>> const&&
  34. { return tpl.template _getr<I>(); }
  35. namespace __helpers {
  36. template <typename T, typename Tuple, std::size_t... I>
  37. constexpr T make_from_tuple_impl(Tuple&& tpl, std::index_sequence<I...>)
  38. {
  39. return T(std::get<I>(std::forward<Tuple>(tpl))...);
  40. }
  41. template <typename _T, typename T = std::decay_t<_T>>
  42. struct __to_tuple_type { using type = T; };
  43. template <typename _T, typename T>
  44. struct __to_tuple_type<_T, std::reference_wrapper<T>>
  45. { using type = std::add_lvalue_reference_t<T>; };
  46. template <typename T>
  47. using to_tuple_type_t = typename __to_tuple_type<T>::type;
  48. } // namespace __helpers
  49. template <typename T, typename Tuple>
  50. constexpr T make_from_tuple(Tuple&& tpl)
  51. {
  52. return __helpers::make_from_tuple_impl<T>(
  53. std::forward<Tuple>(tpl),
  54. std::make_index_sequence<
  55. std::tuple_size_v<std::remove_cvref_t<Tuple>>> {}
  56. );
  57. }
  58. }
  59. #endif