6#ifndef MIMICPP_PRINTING_TYPE_PRINT_TYPE_HPP
7#define MIMICPP_PRINTING_TYPE_PRINT_TYPE_HPP
18#ifndef MIMICPP_DETAIL_IS_MODULE
23 #include <type_traits>
33 consteval std::string_view raw_type_name() noexcept
35 return util::SourceLocation{}.function_name();
39 inline constexpr auto typeNameConfig = std::invoke([] {
40 auto const rawName = raw_type_name<int>();
41 std::string_view
const intName{
"int"};
42 std::size_t
const prefix = rawName.rfind(intName);
43 MIMICPP_ASSERT(prefix != std::string_view::npos,
"Did not find `int` in the type-name string.");
45 struct type_name_config
51 return type_name_config{
53 .suffix = rawName.size() - intName.size() - prefix};
71 auto typeName = detail::raw_type_name<T>();
72 typeName.remove_prefix(detail::typeNameConfig.prefix);
73 typeName.remove_suffix(detail::typeNameConfig.suffix);
97 template <pr
int_iterator OutIter>
98 constexpr OutIter
prettify_type(OutIter out, std::string_view name);
118 template <pr
int_iterator OutIter>
122#ifdef MIMICPP_CONFIG_EXPERIMENTAL_PRETTY_TYPES
129 template <pr
int_iterator OutIter>
130 constexpr OutIter
prettify_type(OutIter out, std::string_view
const name)
132 if (std::optional
const typeId =
parse_type(name))
134 parsing::PrintVisitor<OutIter> visitor{std::move(out)};
135 visitor.visit(*typeId);
137 return visitor.out();
143 template <pr
int_iterator OutIter>
149 visitor.
visit(*functionId);
151 return visitor.out();
162 template <pr
int_iterator OutIter>
165 return std::ranges::copy(name, std::move(out)).out;
168 template <pr
int_iterator OutIter>
171 return std::ranges::copy(name, std::move(out)).out;
177namespace mimicpp::printing::type::detail
179 template <
typename Pr
inter,
typename T,
typename OutIter>
181 &&
requires(OutIter out) {
183 { Printer::print(out) } -> std::convertible_to<OutIter>;
186 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = mimicpp::custom::TypePr
inter<T>>
187 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<4u>
const, OutIter out)
189 return Printer::print(std::move(out));
192 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = common_type_pr
inter<T>>
193 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<3u>
const, OutIter out)
195 return Printer::print(std::move(out));
198 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = signature_type_pr
inter<T>>
199 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<2u>
const, OutIter out)
201 return Printer::print(std::move(out));
204 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter =
template_type_pr
inter<T>>
205 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<1u>
const, OutIter out)
207 return Printer::print(std::move(out));
210 template <
typename T, pr
int_iterator OutIter>
211 OutIter print_type_to([[maybe_unused]] util::priority_tag<0u>
const, OutIter out)
218 inline constexpr util::priority_tag<4u> maxPrintTypePriority{};
220 template <
typename T>
221 struct print_type_helper
223 template <pr
int_iterator OutIter>
225 constexpr OutIter operator()(OutIter out)
const
227 return print_type_to<T>(maxPrintTypePriority, std::move(out));
231 template <
typename T>
232 requires(!std::is_array_v<T>)
233 struct print_type_helper<volatile T>
235 template <pr
int_iterator OutIter>
237 constexpr OutIter operator()(OutIter out)
const
240 print_type_helper<T>{}(std::move(out)),
245 template <
typename T>
246 requires(!std::is_array_v<T>)
247 struct print_type_helper<const T>
249 template <pr
int_iterator OutIter>
251 constexpr OutIter operator()(OutIter out)
const
254 print_type_helper<T>{}(std::move(out)),
259 template <
typename T>
260 requires(!std::is_array_v<T>)
261 struct print_type_helper<const volatile T>
263 template <pr
int_iterator OutIter>
265 constexpr OutIter operator()(OutIter out)
const
268 print_type_helper<T>{}(std::move(out)),
273 template <
typename T>
274 struct print_type_helper<T&>
276 template <pr
int_iterator OutIter>
278 constexpr OutIter operator()(OutIter out)
const
281 print_type_helper<T>{}(std::move(out)),
286 template <
typename T>
287 struct print_type_helper<T&&>
289 template <pr
int_iterator OutIter>
291 constexpr OutIter operator()(OutIter out)
const
294 print_type_helper<T>{}(std::move(out)),
299 template <
typename T>
300 struct print_type_helper<T*>
302 template <pr
int_iterator OutIter>
304 constexpr OutIter operator()(OutIter out)
const
307 print_type_helper<T>{}(std::move(out)),
312 template <
typename T>
313 struct print_type_helper<T[]>
315 template <pr
int_iterator OutIter>
317 constexpr OutIter operator()(OutIter out)
const
320 print_type_helper<T>{}(std::move(out)),
325 template <
typename T, std::
size_t n>
326 struct print_type_helper<T[n]>
328 template <pr
int_iterator OutIter>
330 constexpr OutIter operator()(OutIter out)
const
333 print_type_helper<T>{}(std::move(out)),
341 template <
typename T, std::
size_t n, std::
size_t m>
342 struct print_type_helper<T[n][m]>
344 template <pr
int_iterator OutIter>
346 constexpr OutIter operator()(OutIter out)
const
349 print_type_helper<T[n]>{}(std::move(out)),
358 template <
typename T>
362 template <pr
int_iterator OutIter>
365 return type::detail::print_type_helper<T>{}(std::move(out));
372 std::invoke(*
this, std::ostreambuf_iterator{stream});
373 return std::move(stream).str();
430 template <
typename T>
#define MIMICPP_ASSERT(condition, msg)
Definition Config.hpp:54
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Definition PrintType.hpp:360
constexpr OutIter operator()(OutIter out) const
Definition PrintType.hpp:363
StringT operator()() const
Definition PrintType.hpp:369
Definition PrintVisitor.hpp:26
constexpr void visit(state::TypeId const &typeId)
Definition PrintVisitor.hpp:40
constexpr OutIter prettify_function(OutIter out, std::string_view name)
Prettifies a function name, generated by e.g. std::source_location::function_name().
Definition PrintType.hpp:169
consteval std::string_view type_name() noexcept
Returns the raw type-name.
Definition PrintType.hpp:69
constexpr printing::PrintTypeFn< T > print_type
Functional object, converting the given type to its textual representation.
Definition PrintType.hpp:431
constexpr OutIter prettify_type(OutIter out, std::string_view name)
Prettifies a typen-name.
Definition PrintType.hpp:163
MIMICPP_DETAIL_CONSTEXPR_PRETTY_TYPES std::optional< parsing::state::FunctionId > parse_function(std::string_view const text)
Definition Parser.hpp:1399
MIMICPP_DETAIL_CONSTEXPR_PRETTY_TYPES std::optional< parsing::state::TypeId > parse_type(std::string_view const text)
Definition Parser.hpp:1385
std::basic_ostringstream< CharT, CharTraitsT > StringStreamT
Definition Format.hpp:38
std::basic_string< CharT, CharTraitsT > StringT
Definition Fwd.hpp:397