Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkBitmaskEnum.h
Go to the documentation of this file.
1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7#ifndef SkEnumOperators_DEFINED
8#define SkEnumOperators_DEFINED
9
10#include <type_traits>
11
12namespace sknonstd {
13template <typename T> struct is_bitmask_enum : std::false_type {};
14
15template <typename E>
16std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, bool> constexpr Any(E e) {
17 return static_cast<std::underlying_type_t<E>>(e) != 0;
18}
19} // namespace sknonstd
20
21template <typename E>
22std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E> constexpr operator|(E l, E r) {
23 using U = std::underlying_type_t<E>;
24 return static_cast<E>(static_cast<U>(l) | static_cast<U>(r));
25}
26
27template <typename E>
28std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E&> constexpr operator|=(E& l, E r) {
29 return l = l | r;
30}
31
32template <typename E>
33std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E> constexpr operator&(E l, E r) {
34 using U = std::underlying_type_t<E>;
35 return static_cast<E>(static_cast<U>(l) & static_cast<U>(r));
36}
37
38template <typename E>
39std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E&> constexpr operator&=(E& l, E r) {
40 return l = l & r;
41}
42
43template <typename E>
44std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E> constexpr operator^(E l, E r) {
45 using U = std::underlying_type_t<E>;
46 return static_cast<E>(static_cast<U>(l) ^ static_cast<U>(r));
47}
48
49template <typename E>
50std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E&> constexpr operator^=(E& l, E r) {
51 return l = l ^ r;
52}
53
54template <typename E>
55std::enable_if_t<sknonstd::is_bitmask_enum<E>::value, E> constexpr operator~(E e) {
56 return static_cast<E>(~static_cast<std::underlying_type_t<E>>(e));
57}
58
59#endif // SkEnumOperators_DEFINED
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E > constexpr operator&(E l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E & > constexpr operator&=(E &l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E & > constexpr operator^=(E &l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E > constexpr operator~(E e)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E > constexpr operator|(E l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E & > constexpr operator|=(E &l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, E > constexpr operator^(E l, E r)
std::enable_if_t< sknonstd::is_bitmask_enum< E >::value, bool > constexpr Any(E e)