865d0259086a98d8013425b667722d3378cd4b50
[platform/core/uifw/aurum.git] / libaurum / inc / Misc / bitmask.h
1 #pragma once
2
3 #include <type_traits>
4
5 template<typename E>
6 struct enable_bitmask_operators{
7     static const bool enable=false;
8 };
9
10 #define enableEnumClassBitfield(E) template<> \
11         struct enable_bitmask_operators<E>{   \
12             static const bool enable=true;    \
13         }
14
15 template<typename E>
16 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
17 operator|(E lhs,E rhs){
18     typedef typename std::underlying_type_t<E> underlying;
19     return static_cast<E>(
20         static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
21 }
22
23 template<typename E>
24 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
25 operator&(E lhs,E rhs){
26     typedef typename std::underlying_type_t<E> underlying;
27     return static_cast<E>(
28         static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
29 }
30
31 template<typename E>
32 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
33 operator^(E lhs,E rhs){
34     typedef typename std::underlying_type_t<E> underlying;
35     return static_cast<E>(
36         static_cast<underlying>(lhs) ^ static_cast<underlying>(rhs));
37 }
38
39 template<typename E>
40 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E>
41 operator~(E lhs){
42     typedef typename std::underlying_type_t<E> underlying;
43     return static_cast<E>(
44         ~static_cast<underlying>(lhs));
45 }
46
47 template<typename E>
48 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
49 operator|=(E& lhs,E rhs){
50     typedef typename std::underlying_type_t<E> underlying;
51     lhs=static_cast<E>(
52         static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
53     return lhs;
54 }
55
56 template<typename E>
57 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
58 operator&=(E& lhs,E rhs){
59     typedef typename std::underlying_type_t<E> underlying;
60     lhs=static_cast<E>(
61         static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
62     return lhs;
63 }
64
65 template<typename E>
66 typename std::enable_if_t<enable_bitmask_operators<E>::enable,E&>
67 operator^=(E& lhs,E rhs){
68     typedef typename std::underlying_type_t<E> underlying;
69     lhs=static_cast<E>(
70         static_cast<underlying>(lhs) ^ static_cast<underlying>(rhs));
71     return lhs;
72 }
73