TrinityCore
Loading...
Searching...
No Matches
SmartEnum.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITY_SMARTENUM_H
19#define TRINITY_SMARTENUM_H
20
21#include "Define.h"
22#include "IteratorPair.h"
23#include <iterator>
24
26{
27 EnumText(char const* c, char const* t, char const* d) : Constant(c), Title(t), Description(d) { }
28 // Enum constant of the value
29 char const* const Constant;
30 // Human-readable title of the value
31 char const* const Title;
32 // Human-readable description of the value
33 char const* const Description;
34};
35
37{
38 template <typename Enum>
39 struct EnumUtils
40 {
41 static size_t Count();
42 static EnumText ToString(Enum value);
43 static Enum FromIndex(size_t index);
44 static size_t ToIndex(Enum index);
45 };
46}
47
49{
50 public:
51 template <typename Enum>
53 template <typename Enum>
55 template <typename Enum>
56 static Enum FromIndex(size_t index) { return Trinity::Impl::EnumUtilsImpl::EnumUtils<Enum>::FromIndex(index); }
57 template <typename Enum>
59
60 template<typename Enum>
61 static bool IsValid(Enum value)
62 {
63 try
64 {
66 return true;
67 } catch (...)
68 {
69 return false;
70 }
71 }
72
73 template<typename Enum>
74 static bool IsValid(std::underlying_type_t<Enum> value) { return IsValid(static_cast<Enum>(value)); }
75
76 template <typename Enum>
78 {
79 public:
80 using iterator_category = std::random_access_iterator_tag;
81 using value_type = Enum;
82 using pointer = Enum*;
83 using reference = Enum&;
84 using difference_type = std::ptrdiff_t;
85
86 Iterator() : _index(EnumUtils::Count<Enum>()) {}
87 explicit Iterator(size_t index) : _index(index) { }
88
89 bool operator==(const Iterator& other) const = default;
90 std::strong_ordering operator<=>(const Iterator& other) const = default;
91
92 difference_type operator-(Iterator const& other) const { return _index - other._index; }
93
94 value_type operator[](difference_type d) const { return FromIndex<Enum>(_index + d); }
95 value_type operator*() const { return operator[](0); }
96
97 Iterator& operator+=(difference_type d) { _index += d; return *this; }
98 Iterator& operator++() { return operator+=(1); }
99 Iterator operator++(int) { Iterator i = *this; operator++(); return i; }
100 Iterator operator+(difference_type d) const { Iterator i = *this; i += d; return i; }
101
102 Iterator& operator-=(difference_type d) { _index -= d; return *this; }
104 Iterator operator--(int) { Iterator i = *this; operator--(); return i; }
105 Iterator operator-(difference_type d) const { Iterator i = *this; i -= d; return i; }
106
107 private:
109 };
110
111 template <typename Enum>
112 static Iterator<Enum> Begin() { return Iterator<Enum>(0); }
113
114 template <typename Enum>
115 static Iterator<Enum> End() { return Iterator<Enum>(); }
116
117 template <typename Enum>
118 static Trinity::IteratorPair<Iterator<Enum>> Iterate() { return { Begin<Enum>(), End<Enum>() }; }
119
120 template <typename Enum>
121 static char const* ToConstant(Enum value) { return ToString(value).Constant; }
122
123 template <typename Enum>
124 static char const* ToTitle(Enum value) { return ToString(value).Title; }
125
126 template <typename Enum>
127 static char const* ToDescription(Enum value) { return ToString(value).Description; }
128};
129
130#endif
uint32_t uint32
Definition Define.h:154
Iterator & operator+=(difference_type d)
Definition SmartEnum.h:97
bool operator==(const Iterator &other) const =default
Iterator & operator--()
Definition SmartEnum.h:103
Iterator operator++(int)
Definition SmartEnum.h:99
value_type operator*() const
Definition SmartEnum.h:95
std::ptrdiff_t difference_type
Definition SmartEnum.h:84
difference_type _index
Definition SmartEnum.h:108
std::random_access_iterator_tag iterator_category
Definition SmartEnum.h:80
Iterator & operator-=(difference_type d)
Definition SmartEnum.h:102
Iterator operator-(difference_type d) const
Definition SmartEnum.h:105
std::strong_ordering operator<=>(const Iterator &other) const =default
Iterator operator+(difference_type d) const
Definition SmartEnum.h:100
Iterator & operator++()
Definition SmartEnum.h:98
Iterator(size_t index)
Definition SmartEnum.h:87
value_type operator[](difference_type d) const
Definition SmartEnum.h:94
Iterator operator--(int)
Definition SmartEnum.h:104
difference_type operator-(Iterator const &other) const
Definition SmartEnum.h:92
static Trinity::IteratorPair< Iterator< Enum > > Iterate()
Definition SmartEnum.h:118
static uint32 ToIndex(Enum value)
Definition SmartEnum.h:58
static EnumText ToString(Enum value)
Definition SmartEnum.h:54
static size_t Count()
Definition SmartEnum.h:52
static bool IsValid(Enum value)
Definition SmartEnum.h:61
static Enum FromIndex(size_t index)
Definition SmartEnum.h:56
static char const * ToConstant(Enum value)
Definition SmartEnum.h:121
static char const * ToDescription(Enum value)
Definition SmartEnum.h:127
static bool IsValid(std::underlying_type_t< Enum > value)
Definition SmartEnum.h:74
static Iterator< Enum > Begin()
Definition SmartEnum.h:112
static char const * ToTitle(Enum value)
Definition SmartEnum.h:124
static Iterator< Enum > End()
Definition SmartEnum.h:115
Utility class to enable range for loop syntax for multimap.equal_range uses.
char const *const Constant
Definition SmartEnum.h:29
char const *const Title
Definition SmartEnum.h:31
EnumText(char const *c, char const *t, char const *d)
Definition SmartEnum.h:27
char const *const Description
Definition SmartEnum.h:33
static size_t ToIndex(Enum index)
static EnumText ToString(Enum value)
static Enum FromIndex(size_t index)