9 #ifndef EAGINE_UNITS_STRINGS_HPP
10 #define EAGINE_UNITS_STRINGS_HPP
12 #include "../fixed_size_str.hpp"
13 #include "../mp_strings.hpp"
14 #include "../string_span.hpp"
18 namespace eagine::units {
20 template <
typename MpStr,
int Pow>
21 struct dim_pow_superscript
22 : mp_concat<MpStr, mp_translate_t<mp_int_to_string_t<Pow>, mp_superscript>> {
25 template <
typename MpStr>
26 struct dim_pow_superscript<MpStr, 0> : mp_string<> {};
28 template <
typename MpStr>
29 struct dim_pow_superscript<MpStr, 1> : MpStr {};
31 template <
typename MpStr,
int Pow>
32 using dim_pow_superscript_t =
typename dim_pow_superscript<MpStr, Pow>::type;
34 template <
typename MpStrL,
typename MpStrR>
35 struct chain_term_strings
36 : mp_concat_t<MpStrL, mp_string<char(0xC3), char(0x97)>, MpStrR> {};
38 template <
typename MpStrL>
39 struct chain_term_strings<MpStrL, mp_string<>> : MpStrL {};
41 template <
typename MpStrL,
typename MpStrR>
42 using chain_term_strings_t =
typename chain_term_strings<MpStrL, MpStrR>::type;
46 template <
template <
typename>
class MpStrWrap,
typename X,
typename MpStr>
49 template <
template <
typename>
class MpStrWrap,
typename X>
51 typename compose_str<MpStrWrap, X, decltype(MpStrWrap<X>::mp_str)>::type;
53 template <
template <
typename>
class MpStrWrap,
typename X>
54 using compose_str_n =
typename compose_str<MpStrWrap, X, nothing_t>::type;
56 template <
template <
typename>
class MpStrWrap,
typename X>
57 struct compose_str<MpStrWrap, X, const nothing_t>
58 : compose_str_n<MpStrWrap, X> {};
60 template <
template <
typename>
class MpStrWrap,
typename X, std::size_t N>
61 struct compose_str<MpStrWrap, X, const char[N]>
62 : mp_make_string_t<MpStrWrap<X>> {};
64 template <
template <
typename>
class MpStrWrap>
65 struct compose_str<MpStrWrap, nothing_t, nothing_t> : mp_string<> {};
67 template <
template <
typename>
class MpStrWrap,
typename BaseDim,
int Pow>
68 struct compose_str<MpStrWrap, bits::dim_pow<BaseDim, Pow>, nothing_t>
69 : dim_pow_superscript_t<mp_make_string_t<MpStrWrap<BaseDim>>, Pow> {};
71 template <
template <
typename>
class MpStrWrap,
typename H,
typename T>
72 struct compose_str<MpStrWrap, bits::dims<H, T>, nothing_t>
73 : chain_term_strings<compose_str_t<MpStrWrap, H>, compose_str_t<MpStrWrap, T>> {
76 template <
template <
typename>
class MpStrWrap,
typename Sys>
77 struct compose_str<MpStrWrap, unit<nothing_t, Sys>, nothing_t> : mp_string<> {};
79 template <
template <
typename>
class MpStrWrap,
typename Dim,
int Pow,
typename Sys>
80 struct compose_str<MpStrWrap, unit<bits::dim_pow<Dim, Pow>, Sys>, nothing_t>
81 : dim_pow_superscript_t<
82 compose_str_t<MpStrWrap, typename Sys::template base_unit<Dim>::type>,
85 template <
template <
typename>
class MpStrWrap,
typename H,
typename T,
typename Sys>
86 struct compose_str<MpStrWrap, unit<bits::dims<H, T>, Sys>, nothing_t>
88 compose_str_t<MpStrWrap, unit<H, Sys>>,
89 compose_str_t<MpStrWrap, unit<T, Sys>>> {};
92 template <
template <
typename>
class MpStrWrap,
typename Scale,
typename Unit>
93 struct compose_str<MpStrWrap, base::scaled_unit<Scale, Unit>, nothing_t>
94 : mp_concat<compose_str_t<MpStrWrap, Scale>, compose_str_t<MpStrWrap, Unit>> {
98 static inline auto get_symbol(X) noexcept ->
string_view {
99 return compose_str_t<symbol_of, X>::value;
102 template <
typename X>
103 static inline auto get_symbol_form(X) noexcept ->
string_view {
104 return compose_str_n<symbol_of, X>::value;
107 template <
typename X>
108 static inline auto get_name(X) noexcept ->
string_view {
109 return compose_str_t<name_of, X>::value;
112 template <
typename X>
113 static inline auto get_name_form(X) noexcept ->
string_view {
114 return compose_str_n<name_of, X>::value;
119 #endif // EAGINE_UNITS_STRINGS_HPP