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.