20#if defined(__cpp_lib_format)
29 template <std::ranges::input_range R>
30 requires(std::ranges::sized_range<R>)
33 return static_cast<std::size_t
>(std::ranges::size(r));
36 template <std::ranges::input_range R>
37 requires(!std::ranges::sized_range<R>)
40 return static_cast<std::size_t
>(std::ranges::distance(r));
43 template <std::ranges::range Range>
44 requires std::ranges::sized_range<std::ranges::range_value_t<Range>>
55 if (std::ranges::empty(range))
60 const std::size_t first_size = range.front().size();
61 return std::ranges::all_of(
63 [first_size](
const auto& element)
65 return element.size() == first_size;
72#if defined(__cpp_lib_format) && !defined(__cpp_lib_format_ranges)
74template <
typename T, std::
size_t N>
75struct std::formatter<
std::array<T, N>>
78 constexpr auto parse(std::format_parse_context& ctx)
83 auto format(
const std::array<T, N>& array, std::format_context& ctx)
const
89 for (
const auto& elem : array)
96 out = std::format_to(out,
"{}", elem);
constexpr bool all_same_size(const Range &range)
std::size_t range_size(R &&r)