24#ifndef ODENUMCLASS_INCLUDED
25#define ODENUMCLASS_INCLUDED
27#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
37template<
typename TEnum,
38 typename std::enable_if<std::is_enum<TEnum>::value,
bool>
::type =
true>
39typename std::underlying_type<TEnum>::type
40OdEnumGetUnderlying(
const TEnum
value)
42 return static_cast<typename std::underlying_type<TEnum>::type
>(
value);
49template<
typename TEnum>
53 using underlying_t =
typename std::underlying_type<TEnum>::type;
60 template<
typename... Args>
61 OdEnumClass(
const Args... args)
71 OdEnumClass<TEnum>& operator=(
const OdEnumClass
value)
82 OdEnumClass<TEnum>& operator=(
const TEnum
value)
93 OdEnumClass<TEnum>& operator=(
const underlying_t
value)
106 return asInt() !=
value.asInt();
116 return asInt() != OdEnumGetUnderlying(
value);
126 return asInt() !=
value;
136 return asInt() ==
value.asInt();
146 return asInt() == OdEnumGetUnderlying(
value);
156 return asInt() ==
value;
166 return OdEnumClass<TEnum>(asInt() + OdEnumGetUnderlying(
value));
175 return OdEnumClass<TEnum>(asInt() +
value);
183 OdEnumClass<TEnum> operator-(
const TEnum
value)
const
185 return OdEnumClass<TEnum>(asInt() - OdEnumGetUnderlying(
value));
193 OdEnumClass<TEnum> operator-(
const underlying_t
value)
const
195 return OdEnumClass<TEnum>(asInt() -
value);
205 return OdEnumClass<TEnum>(asInt() * OdEnumGetUnderlying(
value));
215 return OdEnumClass<TEnum>(asInt() *
value);
223 OdEnumClass<TEnum> operator/(
const TEnum
value)
const
225 return OdEnumClass<TEnum>(asInt() / OdEnumGetUnderlying(
value));
233 OdEnumClass<TEnum> operator/(
const underlying_t
value)
const
235 return OdEnumClass<TEnum>(asInt() /
value);
243 OdEnumClass<TEnum> operator&(
const TEnum
value)
const
245 return OdEnumClass<TEnum>(asInt() & OdEnumGetUnderlying(
value));
253 OdEnumClass<TEnum> operator&(
const underlying_t
value)
const
255 return OdEnumClass<TEnum>(asInt() &
value);
265 return OdEnumClass<TEnum>(asInt() | OdEnumGetUnderlying(
value));
275 return OdEnumClass<TEnum>(asInt() |
value);
283 OdEnumClass<TEnum> operator^(
const TEnum
value)
const
285 return OdEnumClass<TEnum>(asInt() ^ OdEnumGetUnderlying(
value));
293 OdEnumClass<TEnum> operator^(
const underlying_t
value)
const
295 return OdEnumClass<TEnum>(asInt() ^
value);
303 OdEnumClass<TEnum> operator<<(
const TEnum
value)
const
305 return OdEnumClass<TEnum>(asInt() << OdEnumGetUnderlying(
value));
313 OdEnumClass<TEnum> operator<<(
const underlying_t
value)
const
315 return OdEnumClass<TEnum>(asInt() <<
value);
323 OdEnumClass<TEnum> operator>>(
const TEnum
value)
const
325 return OdEnumClass<TEnum>(asInt() >> OdEnumGetUnderlying(
value));
333 OdEnumClass<TEnum> operator>>(
const underlying_t
value)
const
335 return OdEnumClass<TEnum>(asInt() >>
value);
343 OdEnumClass<TEnum>& operator+=(
const TEnum
value)
345 m_value += OdEnumGetUnderlying(
value);
353 OdEnumClass<TEnum>& operator+=(
const underlying_t
value)
364 OdEnumClass<TEnum>& operator-=(
const TEnum
value)
366 m_value -= OdEnumGetUnderlying(
value);
375 OdEnumClass<TEnum>& operator-=(
const underlying_t
value)
386 OdEnumClass<TEnum>& operator*=(
const TEnum
value)
388 m_value *= OdEnumGetUnderlying(
value);
397 OdEnumClass<TEnum>& operator*=(
const underlying_t
value)
408 OdEnumClass<TEnum>& operator/=(
const TEnum
value)
410 m_value /= OdEnumGetUnderlying(
value);
419 OdEnumClass<TEnum>& operator/=(
const underlying_t
value)
430 OdEnumClass<TEnum>& operator&=(
const TEnum
value)
432 m_value &= OdEnumGetUnderlying(
value);
441 OdEnumClass<TEnum>& operator&=(
const underlying_t
value)
452 OdEnumClass<TEnum>& operator|=(
const TEnum
value)
454 m_value |= OdEnumGetUnderlying(
value);
463 OdEnumClass<TEnum>& operator|=(
const underlying_t
value)
474 OdEnumClass<TEnum>& operator^=(
const TEnum
value)
476 m_value ^= OdEnumGetUnderlying(
value);
485 OdEnumClass<TEnum>& operator^=(
const underlying_t
value)
496 OdEnumClass<TEnum>& operator<<=(
const TEnum
value)
498 m_value <<= OdEnumGetUnderlying(
value);
507 OdEnumClass<TEnum>& operator<<=(
const underlying_t
value)
518 OdEnumClass<TEnum>& operator>>=(
const TEnum
value)
520 m_value >>= OdEnumGetUnderlying(
value);
529 OdEnumClass<TEnum>& operator>>=(
const underlying_t
value)
539 void set(
const TEnum
value)
541 m_value = OdEnumGetUnderlying(
value);
548 void set(
const underlying_t
value)
558 void setBit(
const int bit,
const bool value =
true)
561 m_value |= (1 << bit);
570 void unsetBit(
const int bit)
572 m_value &= ~(1 << bit);
587 void OR(
const OdEnumClass<TEnum>
value)
589 m_value |=
value.asInt();
596 void OR(
const TEnum
value)
598 m_value |= OdEnumGetUnderlying(
value);
605 void OR(
const underlying_t
value)
616 template<
typename T,
typename... Args>
617 void OR(
const T
value,
const Args... args)
620 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
621 "This type is not allowed");
630 void AND(
const OdEnumClass<TEnum>
value)
632 m_value &=
value.asInt();
639 void AND(
const TEnum
value)
641 m_value &= OdEnumGetUnderlying(
value);
648 void AND(
const underlying_t
value)
659 template<
typename T,
typename... Args>
660 void AND(
const T
value,
const Args... args)
663 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
664 "This type is not allowed");
673 void XOR(
const OdEnumClass<TEnum>
value)
675 m_value ^=
value.asInt();
682 void XOR(
const TEnum
value)
684 m_value ^= OdEnumGetUnderlying(
value);
691 void XOR(
const underlying_t
value)
702 template<
typename T,
typename... Args>
703 void XOR(
const T
value,
const Args... args)
706 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
707 "This type is not allowed");
717 for (std::size_t i = 0; i <
sizeof (underlying_t) * CHAR_BIT; ++i)
719 if ((m_value & (1 << i)) == 0)
746 return static_cast<TEnum
>(m_value);
752 underlying_t asInt()
const
762 return (m_value ?
true :
false);
768 operator TEnum()
const {
return asEnum(); }
774 underlying_t m_value{};
AECBASE_API OdGePoint3d operator*(const AECECS &matrix, const OdGePoint3d &point)
OdGeSurfaceCurve2dTo3d::OwnershipFlag operator|(OdGeSurfaceCurve2dTo3d::OwnershipFlag a, OdGeSurfaceCurve2dTo3d::OwnershipFlag b)
bool operator!=(T left, const OdGiVariant::EnumType right)
bool operator==(T left, const OdGiVariant::EnumType right)
OdTrVisMiniVec4d< DataType > operator+(const OdTrVisMiniVec4d< DataType > &v1, const OdTrVisMiniVec4d< DataType > &v2)
GLuint GLsizei GLsizei GLint GLenum * type
GLsizei const GLfloat * value