test_aliases.cpp
Go to the documentation of this file.
1 // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
2 // SPDX-License-Identifier: MIT
3 // Copyright (c) 2019 - 2024 Daniil Goncharov <neargye@gmail.com>.
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #include <optional>
24 #include <string>
25 #include <string_view>
26 
27 #define CATCH_CONFIG_MAIN
28 #include <catch2/catch.hpp>
29 
30 template <typename T>
31 struct MyOpt {
32  constexpr MyOpt() : mHasValue{false}, val{} {} // required
33  constexpr MyOpt(const T& v) : mHasValue{true}, val{v} {} // required
34  constexpr const T& operator*() const { return val; } // required
35  constexpr explicit operator bool() const { return mHasValue; } // required
36 
37  constexpr bool has_value() const { return mHasValue; }
38  constexpr const T& value() const { return val; }
39 
40  private:
41  bool mHasValue;
42  T val;
43 };
44 
45 struct MyString {
46  using value_type = char; // required
47  static constexpr auto npos = std::string_view::npos; // required
48 
49  MyString() : str{} {} // required
50  MyString(const char* s, std::size_t l) : str{s, l} {} // required
51  bool empty() const { return str.empty(); } // required
52  auto begin() const { return str.begin(); } // required
53  auto end() const { return str.end(); } // required
54  void append(std::size_t count, char c) { str.append(count, c); } // required
55  void append(const char* s, std::size_t size) { str.append(s, size); } // required
56 
57  std::size_t size() const { return str.size(); }
58  int compare(const char* s) const { return str.compare(s); }
59 
60  private:
61  std::string str;
62 };
63 
64 struct MyStringView {
65  using value_type = char; // required
66  static constexpr auto npos = std::string_view::npos; // required
67 
68  constexpr MyStringView() : str{} {} // required
69  constexpr MyStringView(const char* cstr, std::size_t size) : str{cstr, size} {} // required
70  constexpr bool empty() const { return str.empty(); } // required
71  constexpr std::size_t size() const { return str.size(); } // required
72  constexpr const char* data() const { return str.data(); } // required
73  constexpr const char& operator[](std::size_t i) const { return str[i]; } // required
74  constexpr auto begin() const { return str.begin(); } // required
75  constexpr auto end() const { return str.end(); } // required
76  constexpr std::size_t find(char c) const { return str.find(c); } // required
77  constexpr MyStringView substr(std::size_t p, std::size_t n) { return str.substr(p, n); } // required
78  constexpr void remove_prefix(std::size_t n) { str.remove_prefix(n); } // required
79  constexpr void remove_suffix(std::size_t n) { str.remove_suffix(n); } // required
80  friend constexpr bool operator==(MyStringView lhs, MyStringView rhs); // required
81 
82  constexpr MyStringView(const char* cstr) : str{ cstr } {}
83  constexpr int compare(const char* s) const { return str.compare(s); }
84 
85  private:
86  std::string_view str;
87 
88  constexpr MyStringView(std::string_view s) : str{s} {}
89 };
90 
91 constexpr bool operator==(MyStringView lhs, MyStringView rhs) {
92  return lhs.str == rhs.str;
93 }
94 
95 #define MAGIC_ENUM_USING_ALIAS_OPTIONAL template<typename T> using optional = MyOpt<T>;
96 #define MAGIC_ENUM_USING_ALIAS_STRING using string = MyString;
97 #define MAGIC_ENUM_USING_ALIAS_STRING_VIEW using string_view = MyStringView;
98 
101 using namespace magic_enum;
102 using namespace magic_enum::bitwise_operators;
103 
104 enum class Color { RED = 1, GREEN = 2, BLUE = 4 };
105 
106 TEST_CASE("optional") {
107  constexpr auto cr = enum_cast<Color>("RED");
108  REQUIRE(cr.has_value());
109  REQUIRE(cr.value() == Color::RED);
110 
111  constexpr auto cn = enum_cast<Color>("NONE");
112  REQUIRE_FALSE(cn.has_value());
113 }
114 
115 TEST_CASE("string") {
116  auto cr = enum_flags_name(Color::RED);
117  REQUIRE_FALSE(cr.empty());
118  REQUIRE(cr.compare("RED") == 0);
119 
121  REQUIRE_FALSE(crg.empty());
122  REQUIRE(crg.compare("RED|GREEN") == 0);
123 
124  auto cn = enum_flags_name(Color{0});
125  REQUIRE(cn.empty());
126  REQUIRE(cn.size() == 0);
127 }
128 
129 TEST_CASE("string_view") {
130  auto cr = enum_name(Color::RED);
131  REQUIRE_FALSE(cr.empty());
132  REQUIRE(cr.compare("RED") == 0);
133 
134  auto cn = enum_name(Color{0});
135  REQUIRE(cn.empty());
136  REQUIRE(cn.size() == 0);
137 }
Color::GREEN
@ GREEN
MyOpt::mHasValue
bool mHasValue
Definition: test_aliases.cpp:41
magic_enum::bitwise_operators
Definition: magic_enum.hpp:1464
MyString::size
std::size_t size() const
Definition: test_aliases.cpp:57
magic_enum.hpp
MyStringView::MyStringView
constexpr MyStringView(const char *cstr)
Definition: test_aliases.cpp:82
MyStringView::operator==
constexpr friend bool operator==(MyStringView lhs, MyStringView rhs)
Definition: test_aliases.cpp:91
MyOpt::MyOpt
constexpr MyOpt()
Definition: test_aliases.cpp:32
MyString
Definition: test_aliases.cpp:45
MyStringView::MyStringView
constexpr MyStringView()
Definition: test_aliases.cpp:68
MyString::append
void append(std::size_t count, char c)
Definition: test_aliases.cpp:54
magic_enum::enum_flags_name
auto enum_flags_name(E value, char_type sep=static_cast< char_type >('|')) -> detail::enable_if_t< E, string >
Definition: magic_enum_flags.hpp:67
MyStringView::remove_suffix
constexpr void remove_suffix(std::size_t n)
Definition: test_aliases.cpp:79
MyStringView::data
constexpr const char * data() const
Definition: test_aliases.cpp:72
MyOpt::operator*
constexpr const T & operator*() const
Definition: test_aliases.cpp:34
MyStringView::find
constexpr std::size_t find(char c) const
Definition: test_aliases.cpp:76
MyOpt
Definition: test_aliases.cpp:31
MyStringView::end
constexpr auto end() const
Definition: test_aliases.cpp:75
MyString::str
std::string str
Definition: test_aliases.cpp:61
MyStringView::compare
constexpr int compare(const char *s) const
Definition: test_aliases.cpp:83
MyStringView::MyStringView
constexpr MyStringView(const char *cstr, std::size_t size)
Definition: test_aliases.cpp:69
MyStringView::substr
constexpr MyStringView substr(std::size_t p, std::size_t n)
Definition: test_aliases.cpp:77
MyStringView
Definition: test_aliases.cpp:64
MyString::append
void append(const char *s, std::size_t size)
Definition: test_aliases.cpp:55
MyString::npos
static constexpr auto npos
Definition: test_aliases.cpp:47
MyStringView::MyStringView
constexpr MyStringView(std::string_view s)
Definition: test_aliases.cpp:88
MyStringView::begin
constexpr auto begin() const
Definition: test_aliases.cpp:74
MyStringView::empty
constexpr bool empty() const
Definition: test_aliases.cpp:70
REQUIRE
#define REQUIRE(...)
Definition: catch.hpp:17637
operator==
constexpr bool operator==(MyStringView lhs, MyStringView rhs)
Definition: test_aliases.cpp:91
MyString::compare
int compare(const char *s) const
Definition: test_aliases.cpp:58
magic_enum::detail::n
constexpr auto n() noexcept
Definition: magic_enum.hpp:421
MyStringView::size
constexpr std::size_t size() const
Definition: test_aliases.cpp:71
MyOpt::MyOpt
constexpr MyOpt(const T &v)
Definition: test_aliases.cpp:33
magic_enum_flags.hpp
MyStringView::npos
static constexpr auto npos
Definition: test_aliases.cpp:66
Color::RED
@ RED
MyString::MyString
MyString(const char *s, std::size_t l)
Definition: test_aliases.cpp:50
MyString::begin
auto begin() const
Definition: test_aliases.cpp:52
MyStringView::str
std::string_view str
Definition: test_aliases.cpp:86
MyOpt::has_value
constexpr bool has_value() const
Definition: test_aliases.cpp:37
TEST_CASE
TEST_CASE("optional")
Definition: test_aliases.cpp:106
catch.hpp
magic_enum::enum_name
constexpr auto enum_name() noexcept -> detail::enable_if_t< decltype(V), string_view >
Definition: magic_enum.hpp:1290
REQUIRE_FALSE
#define REQUIRE_FALSE(...)
Definition: catch.hpp:17638
Color
Color
Definition: example.cpp:28
MyString::value_type
char value_type
Definition: test_aliases.cpp:46
MyString::MyString
MyString()
Definition: test_aliases.cpp:49
Color::BLUE
@ BLUE
magic_enum
Definition: magic_enum.hpp:126
MyStringView::operator[]
constexpr const char & operator[](std::size_t i) const
Definition: test_aliases.cpp:73
MyString::end
auto end() const
Definition: test_aliases.cpp:53
MyString::empty
bool empty() const
Definition: test_aliases.cpp:51
MyStringView::value_type
char value_type
Definition: test_aliases.cpp:65
MyOpt::value
constexpr const T & value() const
Definition: test_aliases.cpp:38
MyOpt::val
T val
Definition: test_aliases.cpp:42
MyStringView::remove_prefix
constexpr void remove_prefix(std::size_t n)
Definition: test_aliases.cpp:78


magic_enum
Author(s):
autogenerated on Fri Feb 21 2025 03:20:19