6#ifndef MIMICPP_PRINTING_STATE_CXX23_BACKPORTS_HPP
7#define MIMICPP_PRINTING_STATE_CXX23_BACKPORTS_HPP
15#ifndef MIMICPP_DETAIL_IS_MODULE
23namespace mimicpp::printing::detail::state
25 template <std::ranges::forward_range Range>
26 struct cxx23_backport_printer<Range>
28 template <pr
int_iterator OutIter>
29 static constexpr OutIter
print(OutIter out,
auto& range)
31 out = format::format_to(std::move(out),
"[");
32 auto iter = std::ranges::begin(range);
33 if (
const auto end = std::ranges::end(range);
38 for (; iter != end; ++iter)
40 out = format::format_to(std::move(out),
", ");
45 return format::format_to(std::move(out),
"]");
49 template <std::
size_t index, pr
int_iterator OutIter>
50 constexpr OutIter print_tuple_element(OutIter out,
auto& tuple)
52 if constexpr (0u != index)
54 out = format::format_to(std::move(out),
", ");
61 template <
typename Tuple,
typename IndexSequence>
62 struct has_tuple_element;
65 template <
typename Tuple, std::
size_t index>
66 struct has_tuple_element<Tuple, std::index_sequence<index>>
67 : std::bool_constant<requires {typename std::tuple_element_t<index, Tuple>; }>
73 template <
typename Tuple, std::size_t... indices>
74 struct has_tuple_element<Tuple, std::index_sequence<indices...>>
76 has_tuple_element<Tuple, std::index_sequence<indices>>...>
81 concept tuple_like =
requires {
82 typename std::tuple_size<T>::type;
83 { std::tuple_size_v<T> } -> std::convertible_to<std::size_t>;
84 requires 0u <= std::tuple_size_v<T>;
85 requires has_tuple_element<T, std::make_index_sequence<std::tuple_size_v<T>>>::value;
88 template <tuple_like T>
89 struct cxx23_backport_printer<T>
91 template <pr
int_iterator OutIter>
92 static constexpr OutIter
print(OutIter out,
auto& tuple)
94 out = format::format_to(std::move(out),
"(");
96 [&]<std::size_t... indices>(std::index_sequence<indices...>
const ) {
98 (out = state::print_tuple_element<indices>(std::move(out), tuple)));
100 std::make_index_sequence<std::tuple_size_v<T>>{});
102 return format::format_to(std::move(out),
")");
constexpr printing::PrintFn print
Functional object, converting the given object to its textual representation.
Definition Print.hpp:183