FCT
载入中...
搜索中...
未找到
Flags.h
浏览该文件的文档.
1
2
3#ifndef FLAGS_H
4#define FLAGS_H
5#include "../ThirdParty.h"
6#include <type_traits>
7
8namespace FCT
9{
10 template <typename BitType>
11 struct FlagTraits;
12
13 //learning from vulkan-hpp
28 template <typename BitType>
29 class Flags {
30 public:
31 using MaskType = typename std::underlying_type<BitType>::type;
32
33 constexpr Flags() noexcept : m_mask(0) {}
34 constexpr Flags(BitType bit) noexcept : m_mask(static_cast<MaskType>(bit)) {}
35 constexpr Flags(Flags<BitType> const & rhs) noexcept = default;
36 constexpr explicit Flags(MaskType flags) noexcept : m_mask(flags) {}
37
38 constexpr bool operator<(Flags<BitType> const & rhs) const noexcept { return m_mask < rhs.m_mask; }
39 constexpr bool operator<=(Flags<BitType> const & rhs) const noexcept { return m_mask <= rhs.m_mask; }
40 constexpr bool operator>(Flags<BitType> const & rhs) const noexcept { return m_mask > rhs.m_mask; }
41 constexpr bool operator>=(Flags<BitType> const & rhs) const noexcept { return m_mask >= rhs.m_mask; }
42 constexpr bool operator==(Flags<BitType> const & rhs) const noexcept { return m_mask == rhs.m_mask; }
43 constexpr bool operator!=(Flags<BitType> const & rhs) const noexcept { return m_mask != rhs.m_mask; }
44
45 constexpr bool operator!() const noexcept { return !m_mask; }
46
47 constexpr Flags<BitType> operator&(Flags<BitType> const & rhs) const noexcept { return Flags<BitType>(m_mask & rhs.m_mask); }
48 constexpr Flags<BitType> operator|(Flags<BitType> const & rhs) const noexcept { return Flags<BitType>(m_mask | rhs.m_mask); }
49 constexpr Flags<BitType> operator^(Flags<BitType> const & rhs) const noexcept { return Flags<BitType>(m_mask ^ rhs.m_mask); }
50 constexpr Flags<BitType> operator~() const noexcept { return Flags<BitType>(~m_mask); }
51
52 Flags<BitType> & operator=(Flags<BitType> const & rhs) noexcept = default;
53 Flags<BitType> & operator=(BitType bit) noexcept { m_mask = static_cast<MaskType>(bit); return *this; }
54 Flags<BitType> & operator|=(Flags<BitType> const & rhs) noexcept { m_mask |= rhs.m_mask; return *this; }
55 Flags<BitType> & operator&=(Flags<BitType> const & rhs) noexcept { m_mask &= rhs.m_mask; return *this; }
56 Flags<BitType> & operator^=(Flags<BitType> const & rhs) noexcept { m_mask ^= rhs.m_mask; return *this; }
57
58 explicit constexpr operator bool() const noexcept { return !!m_mask; }
59 explicit constexpr operator MaskType() const noexcept { return m_mask; }
60
61
62
63 private:
65 };
66
67 template <typename BitType>
69 {
70 static constexpr bool isBitmask = false;
71 };
72
73 template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>
74 constexpr Flags<BitType> operator|(BitType lhs, BitType rhs) noexcept
75 {
76 return Flags<BitType>(lhs) | Flags<BitType>(rhs);
77 }
78
79 template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>
80 constexpr Flags<BitType> operator&(BitType lhs, BitType rhs) noexcept
81 {
82 return Flags<BitType>(lhs) & Flags<BitType>(rhs);
83 }
84
85 template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>
86 constexpr Flags<BitType> operator^(BitType lhs, BitType rhs) noexcept
87 {
88 return Flags<BitType>(lhs) ^ Flags<BitType>(rhs);
89 }
90
91 template <typename BitType, typename std::enable_if<FlagTraits<BitType>::isBitmask, bool>::type = true>
92 constexpr Flags<BitType> operator~(BitType bits) noexcept
93 {
94 return ~(Flags<BitType>(bits));
95 }
96
97 template <typename BitType>
98 constexpr Flags<BitType> operator|(BitType bit, Flags<BitType> const& flags) noexcept
99 {
100 return flags | bit;
101 }
102
103 template <typename BitType>
104 constexpr Flags<BitType> operator&(BitType bit, Flags<BitType> const& flags) noexcept
105 {
106 return flags & bit;
107 }
108
109 template <typename BitType>
110 constexpr Flags<BitType> operator^(BitType bit, Flags<BitType> const& flags) noexcept
111 {
112 return flags ^ bit;
113 }
114
115
116 #define FCT_DECLARE_FLAGS(BitType) \
117 template<> \
118 struct FCT::FlagTraits<BitType> \
119 { \
120 static constexpr bool isBitmask = true; \
121 }; \
122 using BitType##s = FCT::Flags<BitType>;
123
124 #define FCT_DECLARE_FLAG(BitType,flags) \
125 template<> \
126 struct FCT::FlagTraits<BitType> \
127 { \
128 static constexpr bool isBitmask = true; \
129 }; \
130 using flags = FCT::Flags<BitType>;
131 #define FCT_TO_FLAG(name,translateBitFunc,FlagBitType,FlagType) \
132 inline auto name(FlagType flags) \
133 { \
134 auto result = translateBitFunc(static_cast<FlagBitType>(0)) | translateBitFunc(static_cast<FlagBitType>(0)); \
135 for (uint32_t i = 0; i < 32; ++i) { \
136 FlagBitType singleFlag = static_cast<FlagBitType>(1u << i); \
137 if (flags & singleFlag) { \
138 result |= translateBitFunc(singleFlag); \
139 } \
140 } \
141 return result; \
142 }
143 #define FCT_TO_FLAGS(name,translateBitFunc,FlagBitType) FCT_TO_FLAG(name, translateBitFunc, FlagBitType, FlagBitType##s)
144#ifdef FCT_USE_VULKAN
145 #define FCT_TO_VK_FLAG_BIT_BEGIN(FlagBit) \
146 inline vk::##FlagBit##FlagBits ToVk##FlagBit(FlagBit bit) \
147 { \
148 switch (bit) \
149 {
150 #define FCT_TO_VK_FLAG_BIT_CASE(FlagBit,value,Value) \
151 case FlagBit::value: \
152 return vk::##FlagBit##FlagBits::e##Value;
153 #define FCT_TO_VK_FLAG_BIT_END(FlagBit) \
154 default: \
155 return vk::##FlagBit##FlagBits(0); \
156 } \
157 }
158 #define FCT_TO_VK_FLAGS(FlagBit) \
159 FCT_TO_FLAGS(ToVk##FlagBit##s,ToVk##FlagBit,FlagBit)
160#endif
161}
162
163#endif //FLAGS_H
constexpr Flags(BitType bit) noexcept
定义 Flags.h:34
constexpr Flags< BitType > operator~() const noexcept
定义 Flags.h:50
constexpr Flags() noexcept
定义 Flags.h:33
constexpr Flags< BitType > operator|(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:48
Flags< BitType > & operator|=(Flags< BitType > const &rhs) noexcept
定义 Flags.h:54
constexpr Flags< BitType > operator&(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:47
constexpr bool operator!() const noexcept
定义 Flags.h:45
constexpr bool operator>(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:40
Flags< BitType > & operator^=(Flags< BitType > const &rhs) noexcept
定义 Flags.h:56
MaskType m_mask
定义 Flags.h:64
Flags< BitType > & operator=(BitType bit) noexcept
定义 Flags.h:53
constexpr Flags< BitType > operator^(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:49
constexpr bool operator<(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:38
constexpr Flags(Flags< BitType > const &rhs) noexcept=default
typename std::underlying_type< BitType >::type MaskType
定义 Flags.h:31
constexpr bool operator!=(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:43
constexpr bool operator<=(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:39
constexpr bool operator>=(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:41
Flags< BitType > & operator=(Flags< BitType > const &rhs) noexcept=default
Flags< BitType > & operator&=(Flags< BitType > const &rhs) noexcept
定义 Flags.h:55
constexpr bool operator==(Flags< BitType > const &rhs) const noexcept
定义 Flags.h:42
constexpr Flags(MaskType flags) noexcept
定义 Flags.h:36
constexpr Flags< BitType > operator~(BitType bits) noexcept
定义 Flags.h:92
constexpr Flags< BitType > operator^(BitType lhs, BitType rhs) noexcept
定义 Flags.h:86
constexpr Flags< BitType > operator|(BitType lhs, BitType rhs) noexcept
定义 Flags.h:74
constexpr Flags< BitType > operator&(BitType lhs, BitType rhs) noexcept
定义 Flags.h:80
static constexpr bool isBitmask
定义 Flags.h:70