21#if defined(__cpp_lib_format)
30 template <std::ranges::input_range R>
31 requires(std::ranges::sized_range<R>)
34 return static_cast<std::size_t
>(std::ranges::size(r));
37 template <std::ranges::input_range R>
38 requires(!std::ranges::sized_range<R>)
41 return static_cast<std::size_t
>(std::ranges::distance(r));
44 template <std::ranges::range Range>
45 requires std::ranges::sized_range<std::ranges::range_value_t<Range>>
56 if (std::ranges::empty(range))
61 const std::size_t first_size = range.front().size();
62 return std::ranges::all_of(
64 [first_size](
const auto& element)
66 return element.size() == first_size;
74 template <
typename InputRange,
typename OutputIterator>
77 std::ranges::copy(input, output)
78 } -> std::same_as<std::ranges::copy_result<std::ranges::iterator_t<InputRange>, OutputIterator>>;
88 template <std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
89 requires std::indirectly_copyable<I, O>
90 constexpr std::ranges::copy_result<I, O>
operator()(I first, S last, O result)
const
92 for (; first != last; ++first, (void) ++result)
94#if defined(__GNUC__) && __GNUC__ < 12
95# pragma GCC diagnostic push
96# pragma GCC diagnostic ignored "-Wnull-dereference"
99#if defined(__GNUC__) && __GNUC__ < 12
100# pragma GCC diagnostic pop
103 return {std::move(first), std::move(result)};
106 template <std::ranges::input_range R, std::weakly_incrementable O>
107 requires std::indirectly_copyable<std::ranges::iterator_t<R>, O>
108 constexpr std::ranges::copy_result<std::ranges::borrowed_iterator_t<R>, O>
111 return (*
this)(std::ranges::begin(r), std::ranges::end(r), std::move(result));
115 template <std::ranges::input_range R, std::weakly_incrementable O>
116 requires std::indirectly_copyable<std::ranges::iterator_t<R>, O>
117 constexpr std::ranges::copy_result<std::ranges::borrowed_iterator_t<R>, O>
copy(R&& r, O result)
121 return std::ranges::copy(std::forward<R>(r), std::move(result));
125 return copy_fn{}(std::forward<R>(r), std::move(result));
131#if defined(__cpp_lib_format)
133template <
typename T, std::
size_t N>
134struct std::formatter<
std::array<T, N>>
136 constexpr auto parse(std::format_parse_context& ctx)
141 auto format(
const std::array<T, N>& array, std::format_context& ctx)
const
143 auto out = ctx.out();
147 for (
const auto& elem : array)
154 out = std::format_to(out,
"{}", elem);
164struct std::formatter<
std::vector<T>>
166 constexpr auto parse(std::format_parse_context& ctx)
171 auto format(
const std::vector<T>& vector, std::format_context& ctx)
const
173 auto out = ctx.out();
177 for (
const auto& elem : vector)
184 out = std::format_to(out,
"{}", elem);
193template <std::
size_t T>
194struct std::formatter<
std::bitset<T>>
196 constexpr auto parse(std::format_parse_context& ctx)
201 auto format(
const std::bitset<T>& vector, std::format_context& ctx)
const
203 auto out = ctx.out();
207 for (
const auto& elem : vector)
214 out = std::format_to(out,
"{}", elem);
Concept for std::array types.
constexpr std::ranges::copy_result< std::ranges::borrowed_iterator_t< R >, O > copy(R &&r, O result)
constexpr bool all_same_size(const Range &range)
constexpr std::size_t range_size(R &&r)
Copies the elements from the input range to the output iterator.
constexpr std::ranges::copy_result< I, O > operator()(I first, S last, O result) const
constexpr std::ranges::copy_result< std::ranges::borrowed_iterator_t< R >, O > operator()(R &&r, O result) const