22#if defined(__cpp_lib_format)
33 template <std::ranges::input_range R>
34 requires(std::ranges::sized_range<R>)
37 return static_cast<std::size_t
>(std::ranges::size(r));
40 template <std::ranges::input_range R>
41 requires(!std::ranges::sized_range<R>)
44 return static_cast<std::size_t
>(std::ranges::distance(r));
47 template <std::ranges::range Range>
48 requires std::ranges::sized_range<std::ranges::range_value_t<Range>>
61 if (std::ranges::empty(range))
70# pragma GCC diagnostic push
71# pragma GCC diagnostic ignored "-Wnull-dereference"
73 const std::size_t first_size = range.front().size();
74 return std::ranges::all_of(
76 [first_size](
const auto& element)
78 return element.size() == first_size;
82# pragma GCC diagnostic pop
89 template <
typename InputRange,
typename OutputIterator>
92 std::ranges::copy(input, output)
93 } -> std::same_as<std::ranges::copy_result<std::ranges::iterator_t<InputRange>, OutputIterator>>;
103 template <std::input_iterator I, std::sentinel_for<I> S, std::weakly_incrementable O>
104 requires std::indirectly_copyable<I, O>
105 constexpr std::ranges::copy_result<I, O>
operator()(I first, S last, O result)
const
107 for (; first != last; ++first, (void) ++result)
109#if defined(__GNUC__) && __GNUC__ < 12
110# pragma GCC diagnostic push
111# pragma GCC diagnostic ignored "-Wnull-dereference"
114#if defined(__GNUC__) && __GNUC__ < 12
115# pragma GCC diagnostic pop
118 return {std::move(first), std::move(result)};
121 template <std::ranges::input_range R, std::weakly_incrementable O>
122 requires std::indirectly_copyable<std::ranges::iterator_t<R>, O>
123 constexpr std::ranges::copy_result<std::ranges::borrowed_iterator_t<R>, O>
126 return (*
this)(std::ranges::begin(r), std::ranges::end(r), std::move(result));
130 template <std::ranges::input_range R, std::weakly_incrementable O>
131 requires std::indirectly_copyable<std::ranges::iterator_t<R>, O>
132 constexpr std::ranges::copy_result<std::ranges::borrowed_iterator_t<R>, O>
copy(R&& r, O result)
136 return std::ranges::copy(std::forward<R>(r), std::move(result));
140 return copy_fn{}(std::forward<R>(r), std::move(result));
144 template <std::ranges::input_range R,
class T>
147 return std::accumulate(r.begin(), r.end(), init);
150 template <std::ranges::input_range R,
class T, std::copy_constructible Op>
153 return std::accumulate(r.begin(), r.end(), init, op);
158#if defined(__cpp_lib_format)
160template <
typename T, std::
size_t N>
161struct std::formatter<
std::array<T, N>>
163 constexpr auto parse(std::format_parse_context& ctx)
165 return m_spec.parse(ctx.begin(), ctx.end());
168 auto format(
const std::array<T, N>& array, std::format_context& ctx)
const
170 std::string core = m_spec.build_core(array);
171 std::string out_str = m_spec.apply_alignment(std::move(core));
172 return std::ranges::copy(out_str, ctx.out()).out;
177 sparrow::detail::sequence_format_spec m_spec;
181struct std::formatter<
std::vector<T>>
183 constexpr auto parse(std::format_parse_context& ctx)
185 return m_spec.parse(ctx.begin(), ctx.end());
188 auto format(
const std::vector<T>& vector, std::format_context& ctx)
const
190 std::string core = m_spec.build_core(vector);
191 std::string out_str = m_spec.apply_alignment(std::move(core));
192 return std::ranges::copy(out_str, ctx.out()).out;
197 sparrow::detail::sequence_format_spec m_spec;
200template <std::
size_t T>
201struct std::formatter<
std::bitset<T>>
203 constexpr auto parse(std::format_parse_context& ctx)
205 return m_spec.parse(ctx.begin(), ctx.end());
208 auto format(
const std::bitset<T>& vector, std::format_context& ctx)
const
210 std::string core = m_spec.build_core(vector);
211 std::string out_str = m_spec.apply_alignment(std::move(core));
212 return std::ranges::copy(out_str, ctx.out()).out;
217 sparrow::detail::sequence_format_spec m_spec;
Concept for std::array types.
constexpr T accumulate(R &&r, T init)
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)
Extensions to the C++ standard library.
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