12    { \
   13        typedef std::underlying_type<__enum_name__>::type etype; \
   14        return __enum_name__ (
static_cast<etype
> (
x) & 
static_cast<etype
> (
y)); \
 
   15    } \
   16    NCPP_API_EXPORT constexpr __enum_name__& operator&= (__enum_name__& 
x, __enum_name__ 
y) \
 
   17    { \
   18        typedef std::underlying_type<__enum_name__>::type etype; \
   19        return x = __enum_name__ (
static_cast<etype
> (
x) & 
static_cast<etype
> (
y)); \
 
   20    } \
   21    NCPP_API_EXPORT constexpr __enum_name__ operator| (__enum_name__ 
x, __enum_name__ 
y) \
 
   22    { \
   23        typedef std::underlying_type<__enum_name__>::type etype; \
   24        return __enum_name__ (
static_cast<etype
> (
x) | 
static_cast<etype
> (
y)); \
 
   25    } \
   26    NCPP_API_EXPORT constexpr __enum_name__& operator|= (__enum_name__& 
x, __enum_name__ 
y) \
 
   27    { \
   28        typedef std::underlying_type<__enum_name__>::type etype; \
   29        return x = __enum_name__ (
static_cast<etype
> (
x) | 
static_cast<etype
> (
y)); \
 
   30    } \
   31    NCPP_API_EXPORT constexpr __enum_name__ operator^ (__enum_name__ 
x, __enum_name__ 
y) \
 
   32    { \
   33        typedef std::underlying_type<__enum_name__>::type etype; \
   34        return __enum_name__ (
static_cast<etype
> (
x) ^ 
static_cast<etype
> (
y)); \
 
   35    } \
   36    NCPP_API_EXPORT constexpr __enum_name__& operator^= (__enum_name__& 
x, __enum_name__ 
y) \
 
   37    { \
   38        typedef std::underlying_type<__enum_name__>::type etype; \
   39        return x = __enum_name__ (
static_cast<etype
> (
x) ^ 
static_cast<etype
> (
y)); \
 
   40    } \
   42    { \
   43        typedef std::underlying_type<__enum_name__>::type etype; \
   44        return x = __enum_name__ (~
static_cast<etype
> (
x)); \
 
   45    } \
   47    { \
   48        typedef std::underlying_type<__enum_name__>::type etype; \
   49        return __enum_name__ (~
static_cast<etype
> (
x)); \
 
   50    }