Add BOOST_CONSTEXPR where required by C++ Std [bitmark.types].

Add operator! and function bitmask_set as Boost extensions.
This commit is contained in:
Beman
2017-08-28 07:32:08 -04:00
parent 782208b04d
commit ce79a887c4

View File

@@ -6,32 +6,35 @@
// http://www.boost.org/LICENSE_1_0.txt // http://www.boost.org/LICENSE_1_0.txt
// Usage: enum foo { a=1, b=2, c=4 }; // Usage: enum foo { a=1, b=2, c=4 };
// BOOST_BITMASK( foo ); // BOOST_BITMASK( foo )
// //
// void f( foo arg ); // void f( foo arg );
// ... // ...
// f( a | c ); // f( a | c );
//
// See [bitmask.types] in the C++ standard for the formal specification
#ifndef BOOST_BITMASK_HPP #ifndef BOOST_BITMASK_HPP
#define BOOST_BITMASK_HPP #define BOOST_BITMASK_HPP
#include <boost/config.hpp>
#include <boost/cstdint.hpp> #include <boost/cstdint.hpp>
#define BOOST_BITMASK(Bitmask) \ #define BOOST_BITMASK(Bitmask) \
\ \
inline Bitmask operator| (Bitmask x , Bitmask y ) \ inline BOOST_CONSTEXPR Bitmask operator| (Bitmask x , Bitmask y ) \
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \ { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
| static_cast<boost::int_least32_t>(y)); } \ | static_cast<boost::int_least32_t>(y)); } \
\ \
inline Bitmask operator& (Bitmask x , Bitmask y ) \ inline BOOST_CONSTEXPR Bitmask operator& (Bitmask x , Bitmask y ) \
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \ { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
& static_cast<boost::int_least32_t>(y)); } \ & static_cast<boost::int_least32_t>(y)); } \
\ \
inline Bitmask operator^ (Bitmask x , Bitmask y ) \ inline BOOST_CONSTEXPR Bitmask operator^ (Bitmask x , Bitmask y ) \
{ return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \ { return static_cast<Bitmask>( static_cast<boost::int_least32_t>(x) \
^ static_cast<boost::int_least32_t>(y)); } \ ^ static_cast<boost::int_least32_t>(y)); } \
\ \
inline Bitmask operator~ (Bitmask x ) \ inline BOOST_CONSTEXPR Bitmask operator~ (Bitmask x ) \
{ return static_cast<Bitmask>(~static_cast<boost::int_least32_t>(x)); } \ { return static_cast<Bitmask>(~static_cast<boost::int_least32_t>(x)); } \
\ \
inline Bitmask & operator&=(Bitmask& x , Bitmask y) \ inline Bitmask & operator&=(Bitmask& x , Bitmask y) \
@@ -41,7 +44,15 @@
{ x = x | y ; return x ; } \ { x = x | y ; return x ; } \
\ \
inline Bitmask & operator^=(Bitmask& x , Bitmask y) \ inline Bitmask & operator^=(Bitmask& x , Bitmask y) \
{ x = x ^ y ; return x ; } { x = x ^ y ; return x ; } \
\
/* Boost extensions to [bitmask.types] */ \
\
inline BOOST_CONSTEXPR bool operator!(Bitmask x) \
{ return !static_cast<int>(x); } \
\
inline BOOST_CONSTEXPR bool bitmask_set(Bitmask x) \
{ return !!x; }
#endif // BOOST_BITMASK_HPP #endif // BOOST_BITMASK_HPP