1 #ifndef LIBJMMCG_CORE_ENUM_AS_CHAR_ARRAY_HPP
2 #define LIBJMMCG_CORE_ENUM_AS_CHAR_ARRAY_HPP
24 #include <boost/mpl/assert.hpp>
28 #include <type_traits>
36 template<
class EnumT,
std::size_t N>
37 constexpr inline typename std::enable_if<N>=
sizeof(EnumT), EnumT>::
type
38 convert(
const char (&s)[N])
noexcept(
true) {
39 using u_t=
typename std::underlying_type<EnumT>::type;
41 std::size_t n=
sizeof(EnumT);
44 t+=
static_cast<u_t>(s[n-1])<<((n-1)*8);
46 return static_cast<EnumT>(t);
54 constexpr inline EnumT
55 convert(
std::array<
char,
sizeof(EnumT)>
const &s)
noexcept(
true) {
56 using u_t=
typename std::underlying_type<EnumT>::type;
58 std::array<
char,
sizeof(EnumT)> str;
61 conv_t()
noexcept(
true)
65 return static_cast<EnumT>(conv.t);
72 template<
char c1,
char c2=
'\0',
char c3=
'\0',
char c4=
'\0',
char c5=
'\0',
char c6=
'\0',
char c7=
'\0',
char c8=
'\0'>
74 using type=
std::uint64_t;
76 template<
char c1,
char c2,
char c3,
char c4,
char c5,
char c6,
char c7>
78 using type=
std::uint64_t;
80 template<
char c1,
char c2,
char c3,
char c4,
char c5,
char c6>
82 using type=
std::uint64_t;
84 template<
char c1,
char c2,
char c3,
char c4,
char c5>
86 using type=
std::uint64_t;
88 template<
char c1,
char c2,
char c3,
char c4>
90 using type=
std::uint32_t;
92 template<
char c1,
char c2,
char c3>
94 using type=
std::uint32_t;
96 template<
char c1,
char c2>
98 using type=
std::uint16_t;
108 typename std::underlying_type<EnumT>::type i=(
static_cast<
typename std::underlying_type<EnumT>::type>(t)>>8),
109 bool is_digit=(
static_cast<
bool>(i))
112 enum :
typename std::underlying_type<EnumT>::type {
113 value=1+count_digits<EnumT, t, (i>>8)>::value
133 template<
char c1,
char c2=
'\0',
char c3=
'\0',
char c4=
'\0',
char c5=
'\0',
char c6=
'\0',
char c7=
'\0',
char c8=
'\0'>
137 enum : element_type {
139 (
static_cast<element_type>(c8)<<56)
140 +(
static_cast<element_type>(c7)<<48)
141 +(
static_cast<element_type>(c6)<<40)
142 +(
static_cast<element_type>(c5)<<32)
143 +(
static_cast<element_type>(c4)<<24)
144 +(
static_cast<element_type>(c3)<<16)
145 +(
static_cast<element_type>(c2)<<8)
146 +
static_cast<element_type>(c1)
149 template<
char c1,
char c2,
char c3,
char c4,
char c5,
char c6,
char c7>
150 struct to_tag<c1, c2, c3, c4, c5, c6, c7,
'\0'> {
153 enum : element_type {
155 (
static_cast<element_type>(c7)<<48)
156 +(
static_cast<element_type>(c6)<<40)
157 +(
static_cast<element_type>(c5)<<32)
158 +(
static_cast<element_type>(c4)<<24)
159 +(
static_cast<element_type>(c3)<<16)
160 +(
static_cast<element_type>(c2)<<8)
161 +
static_cast<element_type>(c1)
164 template<
char c1,
char c2,
char c3,
char c4,
char c5,
char c6>
165 struct to_tag<c1, c2, c3, c4, c5, c6,
'\0',
'\0'> {
168 enum : element_type {
170 (
static_cast<element_type>(c6)<<40)
171 +(
static_cast<element_type>(c5)<<32)
172 +(
static_cast<element_type>(c4)<<24)
173 +(
static_cast<element_type>(c3)<<16)
174 +(
static_cast<element_type>(c2)<<8)
175 +
static_cast<element_type>(c1)
178 template<
char c1,
char c2,
char c3,
char c4,
char c5>
179 struct to_tag<c1, c2, c3, c4, c5,
'\0',
'\0',
'\0'> {
182 enum : element_type {
184 (
static_cast<element_type>(c5)<<32)
185 +(
static_cast<element_type>(c4)<<24)
186 +(
static_cast<element_type>(c3)<<16)
187 +(
static_cast<element_type>(c2)<<8)
188 +
static_cast<element_type>(c1)
191 template<
char c1,
char c2,
char c3,
char c4>
192 struct to_tag<c1, c2, c3, c4,
'\0',
'\0',
'\0',
'\0'> {
195 enum : element_type {
197 (
static_cast<element_type>(c4)<<24)
198 +(
static_cast<element_type>(c3)<<16)
199 +(
static_cast<element_type>(c2)<<8)
200 +
static_cast<element_type>(c1)
203 template<
char c1,
char c2,
char c3>
204 struct to_tag<c1, c2, c3,
'\0',
'\0',
'\0',
'\0',
'\0'> {
207 enum : element_type {
209 (
static_cast<element_type>(c3)<<16)
210 +(
static_cast<element_type>(c2)<<8)
211 +
static_cast<element_type>(c1)
214 template<
char c1,
char c2>
215 struct to_tag<c1, c2,
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'> {
218 enum : element_type {
220 (
static_cast<element_type>(c2)<<8)
221 +
static_cast<element_type>(c1)
225 struct to_tag<c1,
'\0',
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'> {
228 enum : element_type {
240 unsigned num_digits=private_::count_digits<EnumT, t>::value
456 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e1>::size), ==, 2);
457 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e1>::value[0]), ==,
'0');
458 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e1>::value[1]), ==,
'0');
461 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e2>::size), ==, 2);
462 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e2>::value[0]), ==,
'1');
463 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e2>::value[1]), ==,
'2');
466 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e3>::size), ==, 1);
467 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs1, enum_tags_as_strs1::e3>::value[0]), ==,
'3');
481 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::size), ==, 8);
482 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[0]), ==,
'2');
483 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[1]), ==,
'.');
484 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[2]), ==,
'7');
485 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[3]), ==,
'1');
486 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[4]), ==,
'8');
487 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[5]), ==,
'2');
488 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[6]), ==,
'8');
489 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e8>::value[7]), ==,
'1');
492 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::size), ==, 7);
493 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[0]), ==,
'1');
494 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[1]), ==,
'2');
495 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[2]), ==,
'3');
496 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[3]), ==,
'4');
497 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[4]), ==,
'5');
498 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[5]), ==,
'6');
499 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e7>::value[6]), ==,
'7');
502 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::size), ==, 6);
503 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[0]), ==,
'1');
504 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[1]), ==,
'2');
505 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[2]), ==,
'3');
506 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[3]), ==,
'4');
507 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[4]), ==,
'5');
508 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e6>::value[5]), ==,
'6');
511 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::size), ==, 5);
512 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::value[0]), ==,
'1');
513 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::value[1]), ==,
'2');
514 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::value[2]), ==,
'3');
515 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::value[3]), ==,
'4');
516 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e5>::value[4]), ==,
'5');
519 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e4>::size), ==, 4);
520 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e4>::value[0]), ==,
'1');
521 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e4>::value[1]), ==,
'2');
522 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e4>::value[2]), ==,
'3');
523 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e4>::value[3]), ==,
'4');
526 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e3>::size), ==, 3);
527 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e3>::value[0]), ==,
'3');
528 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e3>::value[1]), ==,
'1');
529 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e3>::value[2]), ==,
'4');
532 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e2>::size), ==, 2);
533 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e2>::value[0]), ==,
'3');
534 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e2>::value[1]), ==,
'1');
537 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e1>::size), ==, 1);
538 BOOST_MPL_ASSERT_RELATION((to_array<enum_tags_as_strs2, enum_tags_as_strs2::e2>::value[0]), ==,
'3');