MDL SDK API nvidia_logo_transpbg.gif Up
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
enum_util.h
1 /***************************************************************************************************
2  * Copyright 2022 NVIDIA Corporation. All rights reserved.
3  **************************************************************************************************/
4 
5 #ifndef MI_BASE_ENUM_UTIL_H
6 #define MI_BASE_ENUM_UTIL_H
7 
8 #if (__cplusplus >= 201103L)
9 #include "config.h"
10 
11 #include <type_traits>
12 
13 // internal utility for MI_MAKE_ENUM_BITOPS
14 #define MI_MAKE_ENUM_BITOPS_PAIR(Enum,OP) \
15 MI_HOST_DEVICE_INLINE constexpr Enum operator OP(const Enum l, const Enum r) { \
16  using Basic = typename std::underlying_type<Enum>::type; \
17  return static_cast<Enum>(static_cast<Basic>(l) OP static_cast<Basic>(r)); } \
18 MI_HOST_DEVICE_INLINE Enum& operator OP##=(Enum& l, const Enum r) { \
19  using Basic = typename std::underlying_type<Enum>::type; \
20  return reinterpret_cast<Enum&>(reinterpret_cast<Basic&>(l) OP##= static_cast<Basic>(r)); }
21 
22 
26 #define MI_MAKE_ENUM_BITOPS(Enum) \
27 MI_MAKE_ENUM_BITOPS_PAIR(Enum,|) \
28 MI_MAKE_ENUM_BITOPS_PAIR(Enum,&) \
29 MI_MAKE_ENUM_BITOPS_PAIR(Enum,^) \
30 MI_HOST_DEVICE_INLINE constexpr Enum operator ~(const Enum e) { \
31  return static_cast<Enum>(~static_cast<std::underlying_type_t<Enum>>(e)); }
32 
33 #else
34 #define MI_MAKE_ENUM_BITOPS(Enum)
35 #endif
36 
37 #endif //MI_BASE_ENUM_UTIL_H