15#ifndef RANGES_V3_UTILITY_COMPRESSED_PAIR_HPP
16#define RANGES_V3_UTILITY_COMPRESSED_PAIR_HPP
28#include <range/v3/utility/static_const.hpp>
30#include <range/v3/detail/prologue.hpp>
35 namespace compressed_tuple_detail
39 template<
typename T, std::size_t I,
typename... Ts>
40 using storage = box<T, meta::list<meta::size_t<I>, Ts...>>;
42 template<
typename List,
typename Indices>
43 struct compressed_tuple_;
44 template<
typename... Ts, std::size_t... Is>
45 struct RANGES_EMPTY_BASES
47 : storage<Ts, Is, Ts...>...
51 "What madness is this?!?");
53 compressed_tuple_() =
default;
55 template<
typename... Args,
57 constexpr compressed_tuple_(Args &&... args)
noexcept(
60 : storage<Ts, Is, Ts...>{
static_cast<Args &&
>(args)}...
66 constexpr operator std::tuple<Us...>()
const noexcept(
69 return std::tuple<Us...>{get<Is>(*this)...};
73 friend constexpr T & get(compressed_tuple_ & tuple)
noexcept
75 return static_cast<storage<T, I, Ts...
> &>(tuple).get();
78 friend constexpr T
const & get(compressed_tuple_
const & tuple)
noexcept
80 return static_cast<storage<T, I, Ts...
> const &>(tuple).get();
83 friend constexpr T && get(compressed_tuple_ && tuple)
noexcept
85 return static_cast<storage<T, I, Ts...
> &&>(tuple).get();
88 friend constexpr T
const && get(compressed_tuple_
const && tuple)
noexcept
90 return static_cast<storage<T, I, Ts...
> const &&>(tuple).get();
94 template<
typename... Ts>
95 using compressed_tuple RANGES_DEPRECATED(
96 "ranges::compressed_tuple is deprecated.") =
102 using compressed_tuple_detail::compressed_tuple;
107 template<
typename... Args>
108 constexpr auto CPP_auto_fun(
operator())(Args &&... args) (
const)
110 return compressed_tuple<bind_element_t<Args>...>{
111 static_cast<Args &&
>(args)...}
120 template<
typename First,
typename Second>
122 :
box<First, meta::size_t<0>>
123 ,
box<Second, meta::size_t<1>>
125 using first_type = First;
126 using second_type = Second;
130 template(
typename U,
typename V)(
131 requires constructible_from<First, U> AND constructible_from<Second, V>)
133 noexcept(
noexcept(First((U &&) u)) &&
noexcept(Second((V &&) v)))
138 constexpr First & first() &
142 constexpr First
const & first()
const &
146 constexpr First && first() &&
151 constexpr Second & second() &
155 constexpr Second
const & second()
const &
159 constexpr Second && second() &&
164 template(
typename F,
typename S)(
165 requires convertible_to<First const &, F> AND
166 convertible_to<Second const &, S>)
168 operator std::pair<F, S>()
const
170 return std::pair<F, S>{first(), second()};
177 template<
typename First,
typename Second>
178 constexpr auto CPP_auto_fun(
operator())(First &&f, Second &&s) (
const)
181 static_cast<First &&
>(f),
static_cast<Second &&
>(s)
192RANGES_DIAGNOSTIC_PUSH
193RANGES_DIAGNOSTIC_IGNORE_MISMATCHED_TAGS
196 template<
typename... Ts,
size_t... Is>
197 struct tuple_size<::ranges::compressed_tuple_detail::compressed_tuple_<
198 ::meta::list<Ts...>, ::meta::index_sequence<Is...>>>
199 : integral_constant<size_t, sizeof...(Ts)>
202 template<
size_t I,
typename... Ts,
size_t... Is>
203 struct tuple_element<I, ::ranges::compressed_tuple_detail::compressed_tuple_<
204 ::meta::list<Ts...>, ::meta::index_sequence<Is...>>>
209 template<
typename First,
typename Second>
211 : integral_constant<size_t, 2>
214 template<
typename First,
typename Second>
220 template<
typename First,
typename Second>
228#include <range/v3/detail/epilogue.hpp>
_t< detail::make_indices_< N, index_sequence< 0 >, detail::strategy_(1, N)> > make_index_sequence
Generate index_sequence containing integer constants [0,1,2,...,N-1].
Definition meta.hpp:473
_t< detail::at_< L, N > > at_c
Return the N th element in the meta::list L.
Definition meta.hpp:1962
_t< detail::_if_< list< Args... > > > if_
Select one type or another depending on a compile-time Boolean.
Definition meta.hpp:1247
Definition compressed_pair.hpp:124
Definition compressed_pair.hpp:175
Definition compressed_pair.hpp:105