9 #ifndef EAGINE_MP_STRING_HPP
10 #define EAGINE_MP_STRING_HPP
21 using type = mp_string;
23 using value_type =
const char[
sizeof...(C) + 1];
24 static constexpr
const char value[
sizeof...(C) + 1] = {C...,
'\0'};
32 constexpr
const char mp_string<C...>::value[
sizeof...(C) + 1];
35 template <
typename String>
39 struct mp_strlen<mp_string<C...>> :
size_constant<sizeof...(C)> {};
42 template <
typename... S>
45 template <
typename... S>
46 using mp_concat_t =
typename mp_concat<S...>::type;
49 struct mp_concat<mp_string<C...>> : mp_string<C...> {};
51 template <
char... C1,
char... C2,
typename... S>
52 struct mp_concat<mp_string<C1...>, mp_string<C2...>, S...>
53 : mp_concat_t<mp_string<C1..., C2...>, S...> {};
56 template <
typename S,
template <
char>
class Transf>
59 template <
typename S,
template <
char>
class Transf>
60 using mp_translate_t =
typename mp_translate<S, Transf>::type;
62 template <
char... C,
template <
char>
class Transf>
63 struct mp_translate<mp_string<C...>, Transf>
64 : mp_concat_t<typename Transf<C>::type...> {};
68 struct mp_uint_to_string;
71 using mp_uint_to_string_t =
typename mp_uint_to_string<I>::type;
74 struct mp_uint_to_string<0U> : mp_string<'0'> {};
76 struct mp_uint_to_string<1U> : mp_string<'1'> {};
78 struct mp_uint_to_string<2U> : mp_string<'2'> {};
80 struct mp_uint_to_string<3U> : mp_string<'3'> {};
82 struct mp_uint_to_string<4U> : mp_string<'4'> {};
84 struct mp_uint_to_string<5U> : mp_string<'5'> {};
86 struct mp_uint_to_string<6U> : mp_string<'6'> {};
88 struct mp_uint_to_string<7U> : mp_string<'7'> {};
90 struct mp_uint_to_string<8U> : mp_string<'8'> {};
92 struct mp_uint_to_string<9U> : mp_string<'9'> {};
95 struct mp_uint_to_string
96 : mp_concat_t<mp_uint_to_string_t<I / 10>, mp_uint_to_string_t<I % 10>> {};
100 struct mp_int_to_string
101 : std::conditional_t<
103 mp_concat<mp_string<'-'>, mp_uint_to_string_t<unsigned(-I)>>,
104 mp_uint_to_string_t<unsigned(I)>> {};
107 using mp_int_to_string_t = typename mp_int_to_string<I>::type;
113 template <typename S, typename IS>
114 struct mp_create_string;
116 template <typename S, std::size_t... I>
117 struct mp_create_string<S, std::index_sequence<I...>>
118 : mp_string<S::mp_str[I]...> {};
121 template <typename S, typename A>
122 struct mp_do_make_string;
124 template <typename S, std::size_t N>
125 struct mp_do_make_string<S, const char[N]>
126 : mp_create_string<S, std::make_index_sequence<N - 1>> {};
128 template <typename X>
129 auto does_have_mp_str_const(X*, decltype(X::mp_str) = X::mp_str)
132 auto does_have_mp_str_const(...) -> std::false_type;
137 template <typename T>
138 struct has_mp_str_const
139 : decltype(bits::does_have_mp_str_const(static_cast<T*>(nullptr))) {};
141 template <
typename T>
142 using has_mp_str_const_t =
typename has_mp_str_const<T>::type;
145 template <
typename S>
146 struct mp_make_string : bits::mp_do_make_string<S, decltype(S::mp_str)> {};
148 template <
typename S>
149 using mp_make_string_t =
typename mp_make_string<S>::type;
153 #endif // EAGINE_MP_STRING_HPP