OGLplus  (0.59.0) a C++ wrapper for rendering APIs

strings.hpp
Go to the documentation of this file.
1 
9 #ifndef EAGINE_UNITS_STRINGS_HPP
10 #define EAGINE_UNITS_STRINGS_HPP
11 
12 #include "../fixed_size_str.hpp"
13 #include "../mp_strings.hpp"
14 #include "../string_span.hpp"
15 #include "detail.hpp"
16 #include "fwd.hpp"
17 
18 namespace eagine::units {
19 //------------------------------------------------------------------------------
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>> {
23 };
24 //------------------------------------------------------------------------------
25 template <typename MpStr>
26 struct dim_pow_superscript<MpStr, 0> : mp_string<> {};
27 //------------------------------------------------------------------------------
28 template <typename MpStr>
29 struct dim_pow_superscript<MpStr, 1> : MpStr {};
30 //------------------------------------------------------------------------------
31 template <typename MpStr, int Pow>
32 using dim_pow_superscript_t = typename dim_pow_superscript<MpStr, Pow>::type;
33 //------------------------------------------------------------------------------
34 template <typename MpStrL, typename MpStrR>
35 struct chain_term_strings
36  : mp_concat_t<MpStrL, mp_string<char(0xC3), char(0x97)>, MpStrR> {};
37 //------------------------------------------------------------------------------
38 template <typename MpStrL>
39 struct chain_term_strings<MpStrL, mp_string<>> : MpStrL {};
40 //------------------------------------------------------------------------------
41 template <typename MpStrL, typename MpStrR>
42 using chain_term_strings_t = typename chain_term_strings<MpStrL, MpStrR>::type;
43 //------------------------------------------------------------------------------
44 // generic unit system name
45 //------------------------------------------------------------------------------
46 template <template <typename> class MpStrWrap, typename X, typename MpStr>
47 struct compose_str;
48 //------------------------------------------------------------------------------
49 template <template <typename> class MpStrWrap, typename X>
50 using compose_str_t =
51  typename compose_str<MpStrWrap, X, decltype(MpStrWrap<X>::mp_str)>::type;
52 //------------------------------------------------------------------------------
53 template <template <typename> class MpStrWrap, typename X>
54 using compose_str_n = typename compose_str<MpStrWrap, X, nothing_t>::type;
55 //------------------------------------------------------------------------------
56 template <template <typename> class MpStrWrap, typename X>
57 struct compose_str<MpStrWrap, X, const nothing_t>
58  : compose_str_n<MpStrWrap, X> {};
59 //------------------------------------------------------------------------------
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>> {};
63 //------------------------------------------------------------------------------
64 template <template <typename> class MpStrWrap>
65 struct compose_str<MpStrWrap, nothing_t, nothing_t> : mp_string<> {};
66 //------------------------------------------------------------------------------
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> {};
70 //------------------------------------------------------------------------------
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>> {
74 };
75 //------------------------------------------------------------------------------
76 template <template <typename> class MpStrWrap, typename Sys>
77 struct compose_str<MpStrWrap, unit<nothing_t, Sys>, nothing_t> : mp_string<> {};
78 //------------------------------------------------------------------------------
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>,
83  Pow> {};
84 //------------------------------------------------------------------------------
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>
87  : chain_term_strings<
88  compose_str_t<MpStrWrap, unit<H, Sys>>,
89  compose_str_t<MpStrWrap, unit<T, Sys>>> {};
90 
91 //------------------------------------------------------------------------------
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>> {
95 };
96 //------------------------------------------------------------------------------
97 template <typename X>
98 static inline auto get_symbol(X) noexcept -> string_view {
99  return compose_str_t<symbol_of, X>::value;
100 }
101 //------------------------------------------------------------------------------
102 template <typename X>
103 static inline auto get_symbol_form(X) noexcept -> string_view {
104  return compose_str_n<symbol_of, X>::value;
105 }
106 //------------------------------------------------------------------------------
107 template <typename X>
108 static inline auto get_name(X) noexcept -> string_view {
109  return compose_str_t<name_of, X>::value;
110 }
111 //------------------------------------------------------------------------------
112 template <typename X>
113 static inline auto get_name_form(X) noexcept -> string_view {
114  return compose_str_n<name_of, X>::value;
115 }
116 //------------------------------------------------------------------------------
117 } // namespace eagine::units
118 
119 #endif // EAGINE_UNITS_STRINGS_HPP
basic_string_span< const char > string_view
Alias for const string views.
Definition: string_span.hpp:116

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).