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)
32 auto iter = std::ranges::begin(range);
33 if (
const auto end = std::ranges::end(range);
38 for (; iter != end; ++iter)
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)
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 requires(!std::ranges::forward_range<T>)
90 struct cxx23_backport_printer<T>
92 template <pr
int_iterator OutIter>
93 static constexpr OutIter print(OutIter out,
auto& tuple)
97 [&]<std::size_t... indices>(std::index_sequence<indices...>
const ) {
99 (out = state::print_tuple_element<indices>(std::move(out), tuple)));
101 std::make_index_sequence<std::tuple_size_v<T>>{});
constexpr printing::PrintFn print
Functional object, converting the given object to its textual representation.
Definition Print.hpp:183