6#ifndef MIMICPP_PRINTING_TYPE_PRINT_TYPE_HPP
7#define MIMICPP_PRINTING_TYPE_PRINT_TYPE_HPP
17#ifndef MIMICPP_DETAIL_IS_MODULE
22 #include <type_traits>
62 template <pr
int_iterator OutIter>
83 template <pr
int_iterator OutIter>
87#ifdef MIMICPP_CONFIG_EXPERIMENTAL_PRETTY_TYPES
89 #if MIMICPP_DETAIL_IS_GCC || MIMICPP_DETAIL_IS_CLANG
91 #ifndef MIMICPP_DETAIL_IS_MODULE
103 void operator()(
char*
const c)
const noexcept
110 template <
typename T>
113 auto*
const rawName =
typeid(T).name();
117 std::unique_ptr<char, detail::free_deleter>
const demangledName{
118 abi::__cxa_demangle(rawName,
nullptr,
nullptr, &status)};
121 return {demangledName.get()};
132 template <
typename T>
135 return typeid(T).name();
146 template <pr
int_iterator OutIter>
155 return visitor.out();
163 if (name.ends_with(
']'))
165 auto rest = name | std::views::reverse | std::views::drop(1);
167 closingIter !=
rest.end())
169 auto const end = std::ranges::find_if_not(
173 name.erase(end.base(), name.end());
181 template <pr
int_iterator OutIter>
184 name = detail::remove_template_details(std::move(name));
192 return visitor.out();
200 template <
typename T>
203 return typeid(T).name();
206 template <pr
int_iterator OutIter>
209 return std::ranges::copy(name, std::move(out)).out;
212 template <pr
int_iterator OutIter>
215 return std::ranges::copy(name, std::move(out)).out;
221namespace mimicpp::printing::type::detail
223 template <
typename Pr
inter,
typename T,
typename OutIter>
225 &&
requires(OutIter out) {
227 { Printer::print(out) } -> std::convertible_to<OutIter>;
230 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = mimicpp::custom::TypePr
inter<T>>
231 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<4u>
const, OutIter out)
233 return Printer::print(std::move(out));
236 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = common_type_pr
inter<T>>
237 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<3u>
const, OutIter out)
239 return Printer::print(std::move(out));
242 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter = signature_type_pr
inter<T>>
243 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<2u>
const, OutIter out)
245 return Printer::print(std::move(out));
248 template <
typename T, pr
int_iterator OutIter, type_pr
inter_for<T, OutIter> Pr
inter =
template_type_pr
inter<T>>
249 constexpr OutIter print_type_to([[maybe_unused]] util::priority_tag<1u>
const, OutIter out)
251 return Printer::print(std::move(out));
254 template <
typename T, pr
int_iterator OutIter>
255 OutIter print_type_to([[maybe_unused]] util::priority_tag<0u>
const, OutIter out)
262 inline constexpr util::priority_tag<4u> maxPrintTypePriority{};
264 template <
typename T>
265 struct print_type_helper
267 template <pr
int_iterator OutIter>
269 constexpr OutIter operator()(OutIter out)
const
271 return print_type_to<T>(maxPrintTypePriority, std::move(out));
275 template <
typename T>
276 requires(!std::is_array_v<T>)
277 struct print_type_helper<volatile T>
279 template <pr
int_iterator OutIter>
281 constexpr OutIter operator()(OutIter out)
const
283 return format::format_to(
284 print_type_helper<T>{}(std::move(out)),
289 template <
typename T>
290 requires(!std::is_array_v<T>)
291 struct print_type_helper<const T>
293 template <pr
int_iterator OutIter>
295 constexpr OutIter operator()(OutIter out)
const
297 return format::format_to(
298 print_type_helper<T>{}(std::move(out)),
303 template <
typename T>
304 requires(!std::is_array_v<T>)
305 struct print_type_helper<const volatile T>
307 template <pr
int_iterator OutIter>
309 constexpr OutIter operator()(OutIter out)
const
311 return format::format_to(
312 print_type_helper<T>{}(std::move(out)),
317 template <
typename T>
318 struct print_type_helper<T&>
320 template <pr
int_iterator OutIter>
322 constexpr OutIter operator()(OutIter out)
const
324 return format::format_to(
325 print_type_helper<T>{}(std::move(out)),
330 template <
typename T>
331 struct print_type_helper<T&&>
333 template <pr
int_iterator OutIter>
335 constexpr OutIter operator()(OutIter out)
const
337 return format::format_to(
338 print_type_helper<T>{}(std::move(out)),
343 template <
typename T>
344 struct print_type_helper<T*>
346 template <pr
int_iterator OutIter>
348 constexpr OutIter operator()(OutIter out)
const
350 return format::format_to(
351 print_type_helper<T>{}(std::move(out)),
356 template <
typename T>
357 struct print_type_helper<T[]>
359 template <pr
int_iterator OutIter>
361 constexpr OutIter operator()(OutIter out)
const
363 return format::format_to(
364 print_type_helper<T>{}(std::move(out)),
369 template <
typename T, std::
size_t n>
370 struct print_type_helper<T[n]>
372 template <pr
int_iterator OutIter>
374 constexpr OutIter operator()(OutIter out)
const
376 return format::format_to(
377 print_type_helper<T>{}(std::move(out)),
385 template <
typename T, std::
size_t n, std::
size_t m>
386 struct print_type_helper<T[n][m]>
388 template <pr
int_iterator OutIter>
390 constexpr OutIter operator()(OutIter out)
const
392 return format::format_to(
393 print_type_helper<T[n]>{}(std::move(out)),
402 template <
typename T>
406 template <pr
int_iterator OutIter>
409 return type::detail::print_type_helper<T>{}(std::move(out));
416 std::invoke(*
this, std::ostreambuf_iterator{stream});
417 return std::move(stream).str();
477 template <
typename T>
#define MIMICPP_DETAIL_CONSTEXPR_STRING
Definition Config.hpp:60
#define MIMICPP_DETAIL_MODULE_EXPORT
Definition Config.hpp:19
Definition PrintType.hpp:404
constexpr OutIter operator()(OutIter out) const
Definition PrintType.hpp:407
StringT operator()() const
Definition PrintType.hpp:413
Definition NamePrintVisitor.hpp:53
Definition NameParser.hpp:30
constexpr void parse_function()
Definition NameParser.hpp:50
constexpr void parse_type()
Definition NameParser.hpp:40
Definition NameParserTokens.hpp:27
StringT type_name()
Returns the (potentially demangled) name.
Definition PrintType.hpp:201
MIMICPP_DETAIL_CONSTEXPR_STRING OutIter prettify_type(OutIter out, StringT name)
Prettifies a demangled name.
Definition PrintType.hpp:207
MIMICPP_DETAIL_CONSTEXPR_STRING OutIter prettify_function(OutIter out, StringT name)
Prettifies a function name produces by e.g. std::source_location::function_name().
Definition PrintType.hpp:213
constexpr printing::PrintTypeFn< T > print_type
Functional object, converting the given type to its textual representation.
Definition PrintType.hpp:478
std::array constexpr rest
Definition NameLexer.hpp:61
auto constexpr is_space
Definition NameLexer.hpp:28
constexpr std::ranges::borrowed_iterator_t< Range > find_closing_token(Range &&str, std::ranges::range_value_t< Range > const &openingToken, std::ranges::range_value_t< Range > const &closingToken)
Finds the next closing token in the given string.
Definition Algorithm.hpp:100
std::basic_ostringstream< CharT, CharTraitsT > StringStreamT
Definition Format.hpp:35
std::basic_string< CharT, CharTraitsT > StringT
Definition Fwd.hpp:391