14#ifndef RANGES_V3_UTILITY_VARIANT_HPP
15#define RANGES_V3_UTILITY_VARIANT_HPP
19#include <range/v3/detail/variant.hpp>
26#include <range/v3/detail/prologue.hpp>
33 template<
typename T, std::
size_t N,
typename Index>
34 struct indexed_datum<T[N], Index>
42 void fill_default_(T * p, std::true_type)
44 for(; p != ranges::end(data_); ++p)
47 void fill_default_(T * p, std::false_type)
49 RANGES_EXPECT(p == ranges::end(data_));
54 constexpr CPP_ctor(indexed_datum)(
meta::nil_ = {})(
55 requires default_constructible<T>)
59 CPP_ctor(indexed_datum)(indexed_datum && that)(
60 requires move_constructible<T>)
62 std::uninitialized_copy_n(make_move_iterator(that.data_), N, data_);
65 CPP_ctor(indexed_datum)(indexed_datum
const & that)(
66 requires copy_constructible<T>)
68 std::uninitialized_copy_n(that.data_, N, data_);
72 template(
typename I,
typename S)(
73 requires sentinel_for<S, I> AND input_iterator<I> AND
74 constructible_from<T, iter_reference_t<I>>)
75 indexed_datum(I first, S last)
77 T * p = detail::uninitialized_copy(first, last, data_);
78 this->fill_default_(p,
meta::bool_<default_constructible<T>>{});
83 requires input_range<R> AND constructible_from<T, range_reference_t<R>>)
84 explicit indexed_datum(R && r)
85 : indexed_datum{ranges::begin(r), ranges::end(r)}
88 auto operator=(indexed_datum && that)
89 -> CPP_ret(indexed_datum &)(
90 requires assignable_from<T &, T>)
92 ranges::move(that.data_, data_);
96 auto operator=(indexed_datum
const & that)
97 -> CPP_ret(indexed_datum &)(
98 requires assignable_from<T &, T const &>)
100 ranges::copy(that.data_, data_);
104 template(
typename R)(
105 requires input_range<R> AND assignable_from<T &, range_reference_t<R>>)
106 indexed_datum & operator=(R && r)
108 ranges::copy(r, data_);
113 return indexed_element<T(&)[N], Index::value>{data_};
115 constexpr auto ref()
const
117 return indexed_element<T
const(&)[N], Index::value>{data_};
119 constexpr T (&get()
noexcept)[N]
123 constexpr T
const (&get() const noexcept)[N]
132#include <range/v3/detail/epilogue.hpp>
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition meta.hpp:168