add bitflags API to readme

This commit is contained in:
BlackMATov
2020-12-19 01:20:48 +07:00
parent 70ae153ee8
commit 19979a728c
3 changed files with 218 additions and 15 deletions

215
README.md
View File

@@ -201,29 +201,36 @@ int main() {
## API ## API
- [Enum traits](#Enum-traits) - `enum.hpp`
- [Generic functions](#Generic-functions) - [Enum traits](#Enum-traits)
- [Enum generic functions](#Enum-generic-functions)
- `enum_bitflags.hpp`
- [Enum bitflags](#Enum-bitflags)
- [Enum operators](#Enum-operators)
- [Enum bitflags operators](#Enum-bitflags-operators)
- [Enum bitflags functions](#Enum-bitflags-functions)
### Enum traits ### Enum traits
```cpp ```cpp
// declare unscoped enumeration // declares unscoped enumeration
ENUM_HPP_DECL( ENUM_HPP_DECL(
/*enum_name*/, /*enum_name*/,
/*underlying_type*/, /*underlying_type*/,
/*fields*/) /*fields*/)
// declare scoped enumeration // declares scoped enumeration
ENUM_HPP_CLASS_DECL( ENUM_HPP_CLASS_DECL(
/*enum_name*/, /*enum_name*/,
/*underlying_type*/, /*underlying_type*/,
/*fields*/) /*fields*/)
// declare only traits for external enumerations // declares only traits for external enumerations
ENUM_HPP_TRAITS_DECL( ENUM_HPP_TRAITS_DECL(
/*enum_name*/, /*enum_name*/,
/*fields*/) /*fields*/)
// declared enumeration traits
struct /*enum_name*/_traits { struct /*enum_name*/_traits {
using enum_type = /*enum_name*/; using enum_type = /*enum_name*/;
using underlying_type = /*underlying_type*/; using underlying_type = /*underlying_type*/;
@@ -257,7 +264,7 @@ struct /*enum_name*/_traits {
}; };
``` ```
### Generic functions ### Enum generic functions
```cpp ```cpp
// should be in enum namespace // should be in enum namespace
@@ -321,6 +328,202 @@ namespace enum_hpp
} }
``` ```
### Enum bitflags
```cpp
namespace enum_hpp::bitflags
{
template < typename Enum >
class bitflags final {
public:
using enum_type = Enum;
using underlying_type = std::underlying_type_t<Enum>;
bitflags() = default;
bitflags(const bitflags&) = default;
bitflags& operator=(const bitflags&) = default;
constexpr bitflags(enum_type flags);
constexpr explicit bitflags(underlying_type flags);
constexpr void swap(bitflags& other) noexcept;
constexpr explicit operator bool() const noexcept;
constexpr underlying_type as_raw() const noexcept;
constexpr enum_type as_enum() const noexcept;
constexpr bool has(bitflags flags) const noexcept;
constexpr bitflags& set(bitflags flags) noexcept;
constexpr bitflags& toggle(bitflags flags) noexcept;
constexpr bitflags& clear(bitflags flags) noexcept;
};
template < typename Enum >
constexpr void swap(bitflags<Enum>& l, bitflags<Enum>& r) noexcept;
}
namespace std
{
template < typename Enum >
struct hash<enum_hpp::bitflags::bitflags<Enum>> {
size_t operator()(enum_hpp::bitflags::bitflags<Enum> bf) const noexcept;
};
}
```
### Enum operators
```cpp
// declares enumeration operators
ENUM_HPP_OPERATORS_DECL(/*enum_name*/)
// declared enumeration operators
constexpr bitflags<Enum> operator ~ (/*enum_name*/ l) noexcept;
constexpr bitflags<Enum> operator | (/*enum_name*/ l, /*enum_name*/ r) noexcept;
constexpr bitflags<Enum> operator & (/*enum_name*/ l, /*enum_name*/ r) noexcept;
constexpr bitflags<Enum> operator ^ (/*enum_name*/ l, /*enum_name*/ r) noexcept;
```
### Enum bitflags operators
```cpp
namespace enum_hpp::bitflags
{
template < typename Enum >
constexpr bool operator < (Enum l, bitflags<Enum> r) noexcept;
template < typename Enum >
constexpr bool operator < (bitflags<Enum> l, Enum r) noexcept;
template < typename Enum >
constexpr bool operator < (std::underlying_type_t<Enum> l, bitflags<Enum> r) noexcept;
template < typename Enum >
constexpr bool operator < (bitflags<Enum> l, std::underlying_type_t<Enum> r) noexcept;
template < typename Enum >
constexpr bool operator < (bitflags<Enum> l, bitflags<Enum> r) noexcept;
// and also for other comparison operators (<, >, <=, >=, ==, !=)
}
namespace enum_hpp::bitflags
{
template < typename Enum >
constexpr bitflags<Enum> operator ~ (bitflags<Enum> l) noexcept;
template < typename Enum >
constexpr bitflags<Enum> operator | (Enum l, bitflags<Enum> r) noexcept;
template < typename Enum >
constexpr bitflags<Enum> operator | (bitflags<Enum> l, Enum r) noexcept;
template < typename Enum >
constexpr bitflags<Enum> operator | (bitflags<Enum> l, bitflags<Enum> r) noexcept;
template < typename Enum >
constexpr bitflags<Enum>& operator |= (bitflags<Enum>& l, Enum r) noexcept;
template < typename Enum >
constexpr bitflags<Enum>& operator |= (bitflags<Enum>& l, bitflags<Enum> r) noexcept;
// and also for other bitwise logic operators (|, |=, &, &=, ^, ^=)
}
```
### Enum bitflags functions
```cpp
namespace enum_hpp::bitflags
{
// any
template < enum Enum >
constexpr bool any(Enum flags) noexcept;
template < typename Enum >
constexpr bool any(bitflags<Enum> flags) noexcept;
// none
template < enum Enum >
constexpr bool none(Enum flags) noexcept;
template < typename Enum >
constexpr bool none(bitflags<Enum> flags) noexcept;
// all_of
template < enum Enum >
constexpr bool all_of(Enum flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool all_of(Enum flags, bitflags<Enum> mask) noexcept;
template < typename Enum >
constexpr bool all_of(bitflags<Enum> flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool all_of(bitflags<Enum> flags, bitflags<Enum> mask) noexcept;
// any_of
template < enum Enum >
constexpr bool any_of(Enum flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool any_of(Enum flags, bitflags<Enum> mask) noexcept;
template < typename Enum >
constexpr bool any_of(bitflags<Enum> flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool any_of(bitflags<Enum> flags, bitflags<Enum> mask) noexcept;
// none_of
template < enum Enum >
constexpr bool none_of(Enum flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool none_of(Enum flags, bitflags<Enum> mask) noexcept;
template < typename Enum >
constexpr bool none_of(bitflags<Enum> flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool none_of(bitflags<Enum> flags, bitflags<Enum> mask) noexcept;
// any_except
template < enum Enum >
constexpr bool any_except(Enum flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool any_except(Enum flags, bitflags<Enum> mask) noexcept;
template < typename Enum >
constexpr bool any_except(bitflags<Enum> flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool any_except(bitflags<Enum> flags, bitflags<Enum> mask) noexcept;
// none_except
template < enum Enum >
constexpr bool none_except(Enum flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool none_except(Enum flags, bitflags<Enum> mask) noexcept;
template < typename Enum >
constexpr bool none_except(bitflags<Enum> flags, Enum mask) noexcept;
template < typename Enum >
constexpr bool none_except(bitflags<Enum> flags, bitflags<Enum> mask) noexcept;
}
```
## Alternatives ## Alternatives
[Better Enums](https://github.com/aantron/better-enums) [Better Enums](https://github.com/aantron/better-enums)

View File

@@ -13,7 +13,7 @@
namespace enum_hpp::bitflags namespace enum_hpp::bitflags
{ {
template < typename Enum > template < typename Enum >
class bitflags { class bitflags final {
static_assert(std::is_enum_v<Enum>); static_assert(std::is_enum_v<Enum>);
public: public:
using enum_type = Enum; using enum_type = Enum;
@@ -23,17 +23,17 @@ namespace enum_hpp::bitflags
bitflags(const bitflags&) = default; bitflags(const bitflags&) = default;
bitflags& operator=(const bitflags&) = default; bitflags& operator=(const bitflags&) = default;
constexpr void swap(bitflags& other) noexcept {
using std::swap;
swap(flags_, other.flags_);
}
constexpr bitflags(enum_type flags) constexpr bitflags(enum_type flags)
: flags_(static_cast<underlying_type>(flags)) {} : flags_(static_cast<underlying_type>(flags)) {}
constexpr explicit bitflags(underlying_type flags) constexpr explicit bitflags(underlying_type flags)
: flags_(flags) {} : flags_(flags) {}
constexpr void swap(bitflags& other) noexcept {
using std::swap;
swap(flags_, other.flags_);
}
constexpr explicit operator bool() const noexcept { constexpr explicit operator bool() const noexcept {
return !!flags_; return !!flags_;
} }
@@ -311,10 +311,10 @@ namespace enum_hpp::bitflags
} }
// //
// ENUM_HPP_REGISTER_BITFLAGS_OPERATORS // ENUM_HPP_OPERATORS_DECL
// //
#define ENUM_HPP_REGISTER_BITFLAGS_OPERATORS(Enum)\ #define ENUM_HPP_OPERATORS_DECL(Enum)\
constexpr ::enum_hpp::bitflags::bitflags<Enum> operator~ [[maybe_unused]] (Enum l) noexcept {\ constexpr ::enum_hpp::bitflags::bitflags<Enum> operator~ [[maybe_unused]] (Enum l) noexcept {\
return ~::enum_hpp::bitflags::bitflags(l);\ return ~::enum_hpp::bitflags::bitflags(l);\
}\ }\

View File

@@ -22,7 +22,7 @@ namespace
all = read_write | execute all = read_write | execute
}; };
ENUM_HPP_REGISTER_BITFLAGS_OPERATORS(access) ENUM_HPP_OPERATORS_DECL(access)
} }
TEST_CASE("enum_bitflags") { TEST_CASE("enum_bitflags") {