stlab-enum-ops 1.1.0
Type-safe operators for enums
Loading...
Searching...
No Matches
enum_ops.hpp File Reference

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.

Variables

template<class T>
constexpr bool stlab::has_enabled_bitmask
 Whether the enum type has enabled bitmask operations.
template<class T>
constexpr bool stlab::has_enabled_arithmetic
 Whether the enum type has enabled arithmetic operations.
template<class U, class T>
constexpr bool stlab::is_compatible_scalar
 Whether the scalar type U is compatible with the enum type T.

Detailed Description

Typesafe operators for enum types enabled via opt-in customization points.