🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
EnumDescriptor.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include "AstUtil/Span.hpp"
25#include <string> // for std::string
26#include <vector> // for std::vector
27#include <utility> // for std::pair
28
29
30AST_NAMESPACE_BEGIN
31
38class AST_UTIL_API EnumDescriptorData
39{
40public:
41 using NumberType = int; // 枚举值类型
42 using ValueList = Span<std::pair<NumberType, char*>>; // 枚举值列表
43public:
44 EnumDescriptorData() = default;
45 ~EnumDescriptorData() = default;
46
47 EnumDescriptorData(ValueList values) : values_(values) {}
48
49public:
50 const char* nameOf(NumberType value) const;
51
52 NumberType valueOf(StringView name) const;
53
54 NumberType valueOf(StringView name, bool& found) const;
55
56private:
57 ValueList values_;
58};
59
61template<typename EnumType>
63{
64public:
65 using EnumDescriptorData::EnumDescriptorData;
66 static_assert(std::is_enum<EnumType>::value, "EnumType must be an enum type");
67 static_assert(sizeof(NumberType) >= sizeof(EnumType), "sizeof(NumberType) must be at least sizeof(EnumType) in order to store EnumType");
68
69 const char* nameOf(EnumType value) const
70 {
71 return EnumDescriptorData::nameOf(static_cast<NumberType>(value));
72 }
73
74 EnumType valueOf(StringView name) const
75 {
76 return static_cast<EnumType>(EnumDescriptorData::valueOf(name));
77 }
78
79 EnumType valueOf(StringView name, bool& found) const
80 {
81 return static_cast<EnumType>(EnumDescriptorData::valueOf(name, found));
82 }
83};
84
85template<typename EnumType>
86EnumDescriptor<EnumType>& aEnumDescriptor();
87
88
93#define AST_ENUM_VALUE(Enumerator, Name) {static_cast<EnumDescriptorData::NumberType>(_EnumType::Enumerator), const_cast<char*>(Name)}
94
98#define AST_ENUM_DESCRIPTOR(EnumType, ...) \
99 template<> \
100 EnumDescriptor<EnumType>& aEnumDescriptor<EnumType>() \
101 { \
102 using _EnumType = EnumType; \
103 static_assert(sizeof(EnumType) <= sizeof(EnumDescriptorData::NumberType), "size of " #EnumType " must be less than or equal to size of EnumDescriptorData::NumberType"); \
104 static std::pair<EnumDescriptorData::NumberType, char*> _values[] = {__VA_ARGS__}; \
105 static EnumDescriptor<EnumType> descriptor{_values}; \
106 return descriptor; \
107 }
108
109
112AST_NAMESPACE_END
枚举描述符数据
定义 EnumDescriptor.hpp:39
枚举描述符
定义 EnumDescriptor.hpp:63