1 //  boost/detail/bitmask.hpp  ------------------------------------------------//
2 
3 //  Copyright Beman Dawes 2006
4 
5 //  Distributed under the Boost Software License, Version 1.0
6 //  http://www.boost.org/LICENSE_1_0.txt
7 
8 //  Usage:  enum foo { a=1, b=2, c=4 };
9 //          BOOST_BITMASK( foo )
10 //
11 //          void f( foo arg );
12 //          ...
13 //          f( a | c );
14 //
15 //  See [bitmask.types] in the C++ standard for the formal specification
16 
17 #ifndef BOOST_BITMASK_HPP
18 #define BOOST_BITMASK_HPP
19 
20 #include <boost/config.hpp>
21 #include <boost/cstdint.hpp>
22 
23 #define BOOST_BITMASK(Bitmask)                                            \
24                                                                           \
25   inline BOOST_CONSTEXPR Bitmask operator| (Bitmask x , Bitmask y )       \
26   { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
27       | static_cast<boost::int_least32_t>(y)); }                          \
28                                                                           \
29   inline BOOST_CONSTEXPR Bitmask operator& (Bitmask x , Bitmask y )       \
30   { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
31       & static_cast<boost::int_least32_t>(y)); }                          \
32                                                                           \
33   inline BOOST_CONSTEXPR Bitmask operator^ (Bitmask x , Bitmask y )       \
34   { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x)     \
35       ^ static_cast<boost::int_least32_t>(y)); }                          \
36                                                                           \
37   inline BOOST_CONSTEXPR Bitmask operator~ (Bitmask x )                   \
38   { return static_cast<Bitmask>(~static_cast<boost::int_least32_t>(x)); } \
39                                                                           \
40   inline Bitmask & operator&=(Bitmask& x , Bitmask y)                     \
41   { x = x & y ; return x ; }                                              \
42                                                                           \
43   inline Bitmask & operator|=(Bitmask& x , Bitmask y)                     \
44   { x = x | y ; return x ; }                                              \
45                                                                           \
46   inline Bitmask & operator^=(Bitmask& x , Bitmask y)                     \
47   { x = x ^ y ; return x ; }                                              \
48                                                                           \
49   /* Boost extensions to [bitmask.types] */                               \
50                                                                           \
51   inline BOOST_CONSTEXPR bool operator!(Bitmask x)                        \
52   { return !static_cast<int>(x); }                                        \
53                                                                           \
54   inline BOOST_CONSTEXPR bool bitmask_set(Bitmask x)                      \
55   { return !!x; }
56 
57 #endif // BOOST_BITMASK_HPP
58 
59