|
stlab-enum-ops 1.1.0
Type-safe operators for enums
|
Typesafe operators for enum types enabled via opt-in customization points. More...
#include <cassert>#include <type_traits>Go to the source code of this file.
Namespaces | |
| namespace | stlab |
| The stlab namespace. | |
Functions | |
| auto | stlab::stlab_enable_bitmask_enum (...) -> std::false_type |
| Overload this for your enum in the enum namespace to return std::true_type and enable bitwise operators. | |
| auto | stlab::stlab_enable_arithmetic_enum (...) -> std::false_type |
| Overload this for your enum in the enum namespace to return std::true_type and enable arithmetic operators. | |
| auto | stlab::adobe_enable_bitmask_enum (...) -> std::false_type |
| auto | stlab::adobe_enable_arithmetic_enum (...) -> std::false_type |
| template<class T> | |
| constexpr auto | operator& (T lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Bitwise AND for bitmask-enabled enums; returns the same enum type. | |
| template<class T> | |
| constexpr auto | operator~ (T a) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Bitwise NOT for bitmask-enabled enums; returns the same enum type. | |
| template<class T> | |
| constexpr auto | operator| (T lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Bitwise OR for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator^ (T lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Bitwise XOR for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator<< (T lhs, std::size_t rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Left shift for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator>> (T lhs, std::size_t rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Right shift for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator^= (T &lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T & > |
| XOR-assign for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator&= (T &lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T & > |
| AND-assign for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator|= (T &lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T & > |
| OR-assign for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator<<= (T &lhs, std::size_t rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T & > |
| Left shift-assign for bitmask-enabled enums. | |
| template<class T> | |
| constexpr auto | operator>>= (T &lhs, std::size_t rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T & > |
| Right shift-assign for bitmask-enabled enums. | |
| template<class T, class U> | |
| constexpr auto | operator- (T lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Subtracts a 0 or 1 scalar value from a bitmask-enabled enum. Allows expressions like e & (e - 1) to clear the least set bit. | |
| template<class T> | |
| constexpr auto | operator- (std::nullptr_t lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >, T > |
| Subtracts a bitmask-enabled enum from 0 0 - rhs is equivalent to -rhs. | |
| template<class T, class U> | |
| constexpr auto | operator+ (T lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Adds a 0 or 1 scalar value to a bitmask-enabled enum. Allows expressions like e & (e + 1) to clear trailing set bits. | |
| template<class U, class T> | |
| constexpr auto | operator+ (U lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Adds a bitmask-enabled enum to 0 or 1. Allows expressions like e & (1 + e) to clear trailing set bits. | |
| template<class T> | |
| constexpr auto | operator+ (T a) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T > |
| Unary plus for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator+ (T lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T > |
| Addition for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator- (T lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T > |
| Subtraction for arithmetic-enabled enums. | |
| template<class T, class U> | |
| constexpr auto | operator* (T lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Multiplication by a scalar value. | |
| template<class U, class T> | |
| constexpr auto | operator* (U lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Multiplication by a scalar value. | |
| template<class T, class U> | |
| constexpr auto | operator/ (T lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Division by a scalar value. | |
| template<class T, class U> | |
| constexpr auto | operator% (T lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T > |
| Modulo by a scalar value. | |
| template<class T> | |
| constexpr auto | operator+= (T &lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T & > |
| Addition assignment for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator-= (T &lhs, T rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T & > |
| Subtraction assignment for arithmetic-enabled enums. | |
| template<class T, class U> | |
| constexpr auto | operator*= (T &lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T & > |
| Multiplication assignment by a scalar value. | |
| template<class T, class U> | |
| constexpr auto | operator/= (T &lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T & > |
| Division assignment by a scalar value. | |
| template<class T, class U> | |
| constexpr auto | operator%= (T &lhs, U rhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T > &&stlab::is_compatible_scalar< U, T >, T & > |
| Modulo assignment by a scalar value. | |
| template<class T> | |
| constexpr auto | operator++ (T &lhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T & > |
| Prefix increment for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator++ (T &lhs, int) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T > |
| Postfix increment for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator-- (T &lhs) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T & > |
| Prefix decrement for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator-- (T &lhs, int) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >, T > |
| Postfix decrement for arithmetic-enabled enums. | |
| template<class T> | |
| constexpr auto | operator- (T a) -> std::enable_if_t< stlab::has_enabled_arithmetic< T >||stlab::has_enabled_bitmask< T >, T > |
| Unary minus enums. For bitmask-enabled enums, this allows expressions like e & -e to return the least set bit. | |
| template<class T> | |
| constexpr auto | operator== (T lhs, std::nullptr_t) -> std::enable_if_t<(stlab::has_enabled_bitmask< T >||stlab::has_enabled_arithmetic< T >) &&!stlab::is_compatible_scalar< T, T >, bool > |
| Equality with nullptr for bitmask or arithmetic scoped enums; true when the value is zero. | |
| template<class T> | |
| constexpr auto | operator== (std::nullptr_t, T rhs) -> std::enable_if_t<(stlab::has_enabled_bitmask< T >||stlab::has_enabled_arithmetic< T >) &&!stlab::is_compatible_scalar< T, T >, bool > |
| Equality with nullptr for bitmask or arithmetic scoped enums; true when the value is zero. | |
| template<class T> | |
| constexpr auto | operator!= (T lhs, std::nullptr_t rhs) -> std::enable_if_t<(stlab::has_enabled_bitmask< T >||stlab::has_enabled_arithmetic< T >) &&!stlab::is_compatible_scalar< T, T >, bool > |
| Inequality with nullptr for bitmask or arithmetic scoped enums. | |
| template<class T> | |
| constexpr auto | operator!= (std::nullptr_t lhs, T rhs) -> std::enable_if_t<(stlab::has_enabled_bitmask< T >||stlab::has_enabled_arithmetic< T >) &&!stlab::is_compatible_scalar< T, T >, bool > |
| Inequality with nullptr for bitmask or arithmetic scoped enums. | |
| template<class T> | |
| constexpr auto | operator! (T lhs) -> std::enable_if_t< stlab::has_enabled_bitmask< T >||stlab::has_enabled_arithmetic< T >, bool > |
| Logical NOT for bitmask or arithmetic enums; true when the value converts to false. | |
Typesafe operators for enum types enabled via opt-in customization points.