mirror of https://github.com/axmolengine/axmol.git
65 lines
1.6 KiB
C
65 lines
1.6 KiB
C
|
#pragma once
|
||
|
|
||
|
#include <type_traits>
|
||
|
|
||
|
namespace cocos2d{
|
||
|
|
||
|
template<typename Enum>
|
||
|
struct EnableBitMaskOperators
|
||
|
{
|
||
|
static const bool enable = false;
|
||
|
};
|
||
|
|
||
|
template<typename Enum>
|
||
|
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
|
||
|
operator |(Enum lhs, Enum rhs)
|
||
|
{
|
||
|
using underlying = typename std::underlying_type<Enum>::type;
|
||
|
return static_cast<Enum> (
|
||
|
static_cast<underlying>(lhs) |
|
||
|
static_cast<underlying>(rhs)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
template<typename Enum>
|
||
|
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, bool>::type
|
||
|
operator ==(Enum lhs, Enum rhs)
|
||
|
{
|
||
|
using underlying = typename std::underlying_type<Enum>::type;
|
||
|
static_cast<underlying>(lhs) == static_cast<underlying>(rhs);
|
||
|
}
|
||
|
|
||
|
template<typename Enum>
|
||
|
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
|
||
|
operator |=(Enum& lhs, Enum rhs)
|
||
|
{
|
||
|
using underlying = typename std::underlying_type<Enum>::type;
|
||
|
lhs = static_cast<Enum> (
|
||
|
static_cast<underlying>(lhs) |
|
||
|
static_cast<underlying>(rhs)
|
||
|
);
|
||
|
|
||
|
return lhs;
|
||
|
}
|
||
|
|
||
|
template<typename Enum>
|
||
|
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, unsigned int>::type
|
||
|
operator &(Enum lhs, Enum rhs)
|
||
|
{
|
||
|
using underlying = typename std::underlying_type<Enum>::type;
|
||
|
using impl_type = typename std::make_unsigned<underlying>::type;
|
||
|
return impl_type (
|
||
|
static_cast<impl_type>(lhs) &
|
||
|
static_cast<impl_type>(rhs)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
#define ENABLE_BITMASK_OPERATORS(x) \
|
||
|
template<> \
|
||
|
struct EnableBitMaskOperators<x> \
|
||
|
{ \
|
||
|
static const bool enable = true; \
|
||
|
};
|
||
|
|
||
|
} // end of namespace cocos2d{
|