25#ifndef LSST_GAUSS2D_TYPE_NAME_H
26#define LSST_GAUSS2D_TYPE_NAME_H
31#include "string_utils.h"
33namespace lsst::gauss2d {
36constexpr std::string_view type_name();
39constexpr std::string_view type_name<void>() {
47using type_name_prober = void;
50constexpr std::string_view wrapped_type_name() {
52 return __PRETTY_FUNCTION__;
53#elif defined(__GNUC__)
54 return __PRETTY_FUNCTION__;
55#elif defined(_MSC_VER)
58#error "Unsupported compiler"
62constexpr std::size_t wrapped_type_name_prefix_length() {
63 return wrapped_type_name<type_name_prober>().find(type_name<type_name_prober>());
66constexpr std::size_t wrapped_type_name_suffix_length() {
67 return wrapped_type_name<type_name_prober>().length() - wrapped_type_name_prefix_length()
68 - type_name<type_name_prober>().length();
71constexpr std::string_view NAMESPACE_SEPARATOR =
"::";
84constexpr std::string_view type_name() {
85 constexpr auto wrapped_name = detail::wrapped_type_name<T>();
86 constexpr auto prefix_length = detail::wrapped_type_name_prefix_length();
87 constexpr auto suffix_length = detail::wrapped_type_name_suffix_length();
88 constexpr auto type_name_length = wrapped_name.length() - prefix_length - suffix_length;
89 return wrapped_name.substr(prefix_length, type_name_length);
104std::string type_name_str(
bool strip_namespace =
false,
105 std::string_view namespace_str = detail::NAMESPACE_SEPARATOR) {
106 std::string name = std::string(type_name<T>());
107 if (strip_namespace) {
109 auto prefix = name.substr(0, name.find_first_of(
'<'));
110 return name.substr(prefix.find_last_of(
':') + 1, std::string::npos);
111 }
else if (namespace_str != detail::NAMESPACE_SEPARATOR) {
112 name = replace_all(name, detail::NAMESPACE_SEPARATOR, namespace_str);