CFx SDK Documentation 2026 SP0
Loading...
Searching...
No Matches
OdEnumClass.h
Go to the documentation of this file.
1
2// Copyright (C) 2002-2024, Open Design Alliance (the "Alliance").
3// All rights reserved.
4//
5// This software and its documentation and related materials are owned by
6// the Alliance. The software may only be incorporated into application
7// programs owned by members of the Alliance, subject to a signed
8// Membership Agreement and Supplemental Software License Agreement with the
9// Alliance. The structure and organization of this software are the valuable
10// trade secrets of the Alliance and its suppliers. The software is also
11// protected by copyright law and international treaty provisions. Application
12// programs incorporating this software must include the following statement
13// with their copyright notices:
14//
15// This application incorporates Open Design Alliance software pursuant to a license
16// agreement with Open Design Alliance.
17// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.
18// All rights reserved.
19//
20// By use of this software, its documentation or related materials, you
21// acknowledge and accept the above terms.
23
24#ifndef ODENUMCLASS_INCLUDED
25#define ODENUMCLASS_INCLUDED
26
27#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
28
29#include <type_traits>
30#include <cstdarg>
31
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)
41{
42 return static_cast<typename std::underlying_type<TEnum>::type>(value);
43}
44
49template<typename TEnum>
50class OdEnumClass
51{
52public:
53 using underlying_t = typename std::underlying_type<TEnum>::type;
54
60 template<typename... Args>
61 OdEnumClass(const Args... args)
62 {
63 OR(args...);
64 }
65
71 OdEnumClass<TEnum>& operator=(const OdEnumClass value)
72 {
73 set(value.asInt());
74 return *this;
75 }
76
82 OdEnumClass<TEnum>& operator=(const TEnum value)
83 {
84 set(value);
85 return *this;
86 }
87
93 OdEnumClass<TEnum>& operator=(const underlying_t value)
94 {
95 set(value);
96 return *this;
97 }
98
104 bool operator!=(const OdEnumClass<TEnum> value) const
105 {
106 return asInt() != value.asInt();
107 }
108
114 bool operator!=(const TEnum value) const
115 {
116 return asInt() != OdEnumGetUnderlying(value);
117 }
118
124 bool operator!=(const underlying_t value) const
125 {
126 return asInt() != value;
127 }
128
134 bool operator==(const OdEnumClass<TEnum> value) const
135 {
136 return asInt() == value.asInt();
137 }
138
144 bool operator==(const TEnum value) const
145 {
146 return asInt() == OdEnumGetUnderlying(value);
147 }
148
154 bool operator==(const underlying_t value) const
155 {
156 return asInt() == value;
157 }
158
164 OdEnumClass<TEnum> operator+(const TEnum value) const
165 {
166 return OdEnumClass<TEnum>(asInt() + OdEnumGetUnderlying(value));
167 }
173 OdEnumClass<TEnum> operator+(const underlying_t value) const
174 {
175 return OdEnumClass<TEnum>(asInt() + value);
176 }
177
183 OdEnumClass<TEnum> operator-(const TEnum value) const
184 {
185 return OdEnumClass<TEnum>(asInt() - OdEnumGetUnderlying(value));
186 }
187
193 OdEnumClass<TEnum> operator-(const underlying_t value) const
194 {
195 return OdEnumClass<TEnum>(asInt() - value);
196 }
197
203 OdEnumClass<TEnum> operator*(const TEnum value) const
204 {
205 return OdEnumClass<TEnum>(asInt() * OdEnumGetUnderlying(value));
206 }
207
213 OdEnumClass<TEnum> operator*(const underlying_t value) const
214 {
215 return OdEnumClass<TEnum>(asInt() * value);
216 }
217
223 OdEnumClass<TEnum> operator/(const TEnum value) const
224 {
225 return OdEnumClass<TEnum>(asInt() / OdEnumGetUnderlying(value));
226 }
227
233 OdEnumClass<TEnum> operator/(const underlying_t value) const
234 {
235 return OdEnumClass<TEnum>(asInt() / value);
236 }
237
243 OdEnumClass<TEnum> operator&(const TEnum value) const
244 {
245 return OdEnumClass<TEnum>(asInt() & OdEnumGetUnderlying(value));
246 }
247
253 OdEnumClass<TEnum> operator&(const underlying_t value) const
254 {
255 return OdEnumClass<TEnum>(asInt() & value);
256 }
257
263 OdEnumClass<TEnum> operator|(const TEnum value) const
264 {
265 return OdEnumClass<TEnum>(asInt() | OdEnumGetUnderlying(value));
266 }
267
273 OdEnumClass<TEnum> operator|(const underlying_t value) const
274 {
275 return OdEnumClass<TEnum>(asInt() | value);
276 }
277
283 OdEnumClass<TEnum> operator^(const TEnum value) const
284 {
285 return OdEnumClass<TEnum>(asInt() ^ OdEnumGetUnderlying(value));
286 }
287
293 OdEnumClass<TEnum> operator^(const underlying_t value) const
294 {
295 return OdEnumClass<TEnum>(asInt() ^ value);
296 }
297
303 OdEnumClass<TEnum> operator<<(const TEnum value) const
304 {
305 return OdEnumClass<TEnum>(asInt() << OdEnumGetUnderlying(value));
306 }
307
313 OdEnumClass<TEnum> operator<<(const underlying_t value) const
314 {
315 return OdEnumClass<TEnum>(asInt() << value);
316 }
317
323 OdEnumClass<TEnum> operator>>(const TEnum value) const
324 {
325 return OdEnumClass<TEnum>(asInt() >> OdEnumGetUnderlying(value));
326 }
327
333 OdEnumClass<TEnum> operator>>(const underlying_t value) const
334 {
335 return OdEnumClass<TEnum>(asInt() >> value);
336 }
337
343 OdEnumClass<TEnum>& operator+=(const TEnum value)
344 {
345 m_value += OdEnumGetUnderlying(value);
346 return *this;
347 }
353 OdEnumClass<TEnum>& operator+=(const underlying_t value)
354 {
355 m_value += value;
356 return *this;
357 }
358
364 OdEnumClass<TEnum>& operator-=(const TEnum value)
365 {
366 m_value -= OdEnumGetUnderlying(value);
367 return *this;
368 }
369
375 OdEnumClass<TEnum>& operator-=(const underlying_t value)
376 {
377 m_value -= value;
378 return *this;
379 }
380
386 OdEnumClass<TEnum>& operator*=(const TEnum value)
387 {
388 m_value *= OdEnumGetUnderlying(value);
389 return *this;
390 }
391
397 OdEnumClass<TEnum>& operator*=(const underlying_t value)
398 {
399 m_value *= value;
400 return *this;
401 }
402
408 OdEnumClass<TEnum>& operator/=(const TEnum value)
409 {
410 m_value /= OdEnumGetUnderlying(value);
411 return *this;
412 }
413
419 OdEnumClass<TEnum>& operator/=(const underlying_t value)
420 {
421 m_value /= value;
422 return *this;
423 }
424
430 OdEnumClass<TEnum>& operator&=(const TEnum value)
431 {
432 m_value &= OdEnumGetUnderlying(value);
433 return *this;
434 }
435
441 OdEnumClass<TEnum>& operator&=(const underlying_t value)
442 {
443 m_value &= value;
444 return *this;
445 }
446
452 OdEnumClass<TEnum>& operator|=(const TEnum value)
453 {
454 m_value |= OdEnumGetUnderlying(value);
455 return *this;
456 }
457
463 OdEnumClass<TEnum>& operator|=(const underlying_t value)
464 {
465 m_value |= value;
466 return *this;
467 }
468
474 OdEnumClass<TEnum>& operator^=(const TEnum value)
475 {
476 m_value ^= OdEnumGetUnderlying(value);
477 return *this;
478 }
479
485 OdEnumClass<TEnum>& operator^=(const underlying_t value)
486 {
487 m_value ^= value;
488 return *this;
489 }
490
496 OdEnumClass<TEnum>& operator<<=(const TEnum value)
497 {
498 m_value <<= OdEnumGetUnderlying(value);
499 return *this;
500 }
501
507 OdEnumClass<TEnum>& operator<<=(const underlying_t value)
508 {
509 m_value <<= value;
510 return *this;
511 }
512
518 OdEnumClass<TEnum>& operator>>=(const TEnum value)
519 {
520 m_value >>= OdEnumGetUnderlying(value);
521 return *this;
522 }
523
529 OdEnumClass<TEnum>& operator>>=(const underlying_t value)
530 {
531 m_value >>= value;
532 return *this;
533 }
534
539 void set(const TEnum value)
540 {
541 m_value = OdEnumGetUnderlying(value);
542 }
543
548 void set(const underlying_t value)
549 {
550 m_value = value;
551 }
552
558 void setBit(const int bit, const bool value = true)
559 {
560 if (value)
561 m_value |= (1 << bit);
562 else
563 unsetBit(bit);
564 }
565
570 void unsetBit(const int bit)
571 {
572 m_value &= ~(1 << bit);
573 }
574
578 void clear()
579 {
580 m_value = 0;
581 }
582
587 void OR(const OdEnumClass<TEnum> value)
588 {
589 m_value |= value.asInt();
590 }
591
596 void OR(const TEnum value)
597 {
598 m_value |= OdEnumGetUnderlying(value);
599 }
600
605 void OR(const underlying_t value)
606 {
607 m_value |= value;
608 }
609
616 template<typename T, typename... Args>
617 void OR(const T value, const Args... args)
618 {
619 static_assert(
620 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
621 "This type is not allowed");
622 OR(value);
623 OR(args...);
624 }
625
630 void AND(const OdEnumClass<TEnum> value)
631 {
632 m_value &= value.asInt();
633 }
634
639 void AND(const TEnum value)
640 {
641 m_value &= OdEnumGetUnderlying(value);
642 }
643
648 void AND(const underlying_t value)
649 {
650 m_value &= value;
651 }
652
659 template<typename T, typename... Args>
660 void AND(const T value, const Args... args)
661 {
662 static_assert(
663 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
664 "This type is not allowed");
665 AND(value);
666 AND(args...);
667 }
668
673 void XOR(const OdEnumClass<TEnum> value)
674 {
675 m_value ^= value.asInt();
676 }
677
682 void XOR(const TEnum value)
683 {
684 m_value ^= OdEnumGetUnderlying(value);
685 }
686
691 void XOR(const underlying_t value)
692 {
693 m_value ^= value;
694 }
695
702 template<typename T, typename... Args>
703 void XOR(const T value, const Args... args)
704 {
705 static_assert(
706 std::is_convertible<T, TEnum>::value || std::is_convertible<T, underlying_t>::value,
707 "This type is not allowed");
708 XOR(value);
709 XOR(args...);
710 }
711
715 bool all() const
716 {
717 for (std::size_t i = 0; i < sizeof (underlying_t) * CHAR_BIT; ++i)
718 {
719 if ((m_value & (1 << i)) == 0)
720 return false;
721 }
722 return true;
723 }
724
728 bool any() const
729 {
730 return asBool();
731 }
732
736 bool none() const
737 {
738 return !any();
739 }
740
744 TEnum asEnum() const
745 {
746 return static_cast<TEnum>(m_value);
747 }
748
752 underlying_t asInt() const
753 {
754 return m_value;
755 }
756
760 bool asBool() const
761 {
762 return (m_value ? true : false);
763 }
764
768 operator TEnum() const { return asEnum(); }
769
770private:
774 underlying_t m_value{};
775};
776
777#endif //#if __cplusplus >= 201103L
778
779#endif //#ifndef ODENUMCLASS_INCLUDED
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)
Definition GiVariant.h:405
bool operator==(T left, const OdGiVariant::EnumType right)
Definition GiVariant.h:399
OdTrVisMiniVec4d< DataType > operator+(const OdTrVisMiniVec4d< DataType > &v1, const OdTrVisMiniVec4d< DataType > &v2)
GLuint GLsizei GLsizei GLint GLenum * type
Definition gles2_ext.h:274
GLsizei const GLfloat * value
Definition gles2_ext.h:302