X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=common%2Fenum_class.h;h=54336823bfd4de3d8b968745d58a4a5532f1ce79;hb=0b5b222f19eaa060db90dbe3d2dce1b8d43b816f;hp=76db19b1feccbe9e1e21917dd50708d295dfcb9c;hpb=40ee6eeb1cc1486ba665c05ec256b8196952c73e;p=casparcg diff --git a/common/enum_class.h b/common/enum_class.h index 76db19b1f..54336823b 100644 --- a/common/enum_class.h +++ b/common/enum_class.h @@ -1,40 +1,68 @@ -#pragma once - -#include - -#include - -#include "linq.h" - -// Macro that defines & and &= for an enum class. Add more when needed. - -#define ENUM_ENABLE_BITWISE(enum_class) \ - static enum_class operator&(enum_class lhs, enum_class rhs) \ - { \ - return static_cast( \ - static_cast::type>(lhs) \ - & static_cast::type>(rhs)); \ - }; \ - static enum_class& operator&=(enum_class& lhs, enum_class rhs) \ - { \ - lhs = lhs & rhs; \ - return lhs; \ - }; - -namespace caspar { - -// For enum classes starting at 0 and without any gaps with a terminating count constant. -template -const std::vector& enum_constants() -{ - typedef typename std::underlying_type::type integer; - - static const auto ints = boost::irange(static_cast(0), static_cast(E::count)); - static const auto result = cpplinq::from(ints.begin(), ints.end()) - .cast() - .to_vector(); - - return result; -} - -} \ No newline at end of file +#pragma once + +#include + +#include + +#include "linq.h" + +// Macro that defines & and &= for an enum class. Add more when needed. + +#define ENUM_ENABLE_BITWISE(enum_class) \ + static enum_class operator&(enum_class lhs, enum_class rhs) \ + { \ + return static_cast( \ + static_cast::type>(lhs) \ + & static_cast::type>(rhs)); \ + }; \ + static enum_class& operator&=(enum_class& lhs, enum_class rhs) \ + { \ + lhs = lhs & rhs; \ + return lhs; \ + }; \ + static enum_class operator | (enum_class lhs, enum_class rhs) \ + { \ + return static_cast( \ + static_cast::type>(lhs) \ + | static_cast::type>(rhs)); \ + }; \ + static enum_class& operator|=(enum_class& lhs, enum_class rhs) \ + { \ + lhs = lhs | rhs; \ + return lhs; \ + }; \ + static enum_class operator ^ (enum_class lhs, enum_class rhs) \ + { \ + return static_cast( \ + static_cast::type>(lhs) \ + ^ static_cast::type>(rhs)); \ + }; \ + static enum_class& operator^=(enum_class& lhs, enum_class rhs) \ + { \ + lhs = lhs ^ rhs; \ + return lhs; \ + }; \ + static enum_class operator~ (enum_class e) \ + { \ + return static_cast( \ + ~static_cast::type>(e)); \ + }; + +namespace caspar { + +// For enum classes starting at 0 and without any gaps with a terminating count constant. +template +const std::vector& enum_constants() +{ + typedef typename std::underlying_type::type integer; + + static const auto ints = boost::irange(static_cast(0), static_cast(E::count)); + static const auto result = cpplinq::from(ints.begin(), ints.end()) + //.cast() + .select([](int i) { return static_cast(i); }) + .to_vector(); + + return result; +} + +}