22 #ifndef GEARS_ENUMS_HELPERS_HPP
23 #define GEARS_ENUMS_HELPERS_HPP
25 #include <type_traits>
30 template<
typename... Args>
31 struct are_enum : std::true_type {};
34 struct are_enum<T> : std::is_enum<T> {};
36 template<
typename T,
typename U,
typename... Args>
37 struct are_enum<T, U, Args...> : std::integral_constant<bool, std::is_enum<T>::value &&
38 std::is_enum<U>::value &&
39 are_enum<Args...>::value> {};
41 template<
typename... Args>
42 using EnableIfEnum =
typename std::enable_if<are_enum<typename std::remove_reference<Args>::type...>::value,
bool>::type;
57 template<typename Enum, typename Underlying = typename std::underlying_type<Enum>::type, detail::EnableIfEnum<Enum> =
true>
59 return static_cast<Underlying
>(x);
63 template<
typename Enum, detail::EnableIfEnum<Enum> = true>
68 template<
typename Enum, detail::EnableIfEnum<Enum> = true>
69 constexpr Enum
activate_flags(
const Enum& first,
const Enum& second) noexcept {
85 template<
typename Enum,
typename... Enums, detail::EnableIfEnum<Enum, Enums...> =
true>
86 constexpr Enum
activate_flags(
const Enum& first,
const Enum& second, Enums&&... rest) noexcept {
101 template<
typename Enum,
typename... Enums, detail::EnableIfEnum<Enum, Enums...> =
true>
102 inline Enum&
set_flags(Enum& flags, Enums&&... args) noexcept {
116 template<
typename Enum,
typename... Enums, detail::EnableIfEnum<Enum, Enums...> =
true>
133 template<
typename Enum,
typename... Enums, detail::EnableIfEnum<Enum, Enums...> =
true>
134 constexpr
bool has_flags(
const Enum& flags, Enums&&... args) noexcept {
140 #endif // GEARS_ENUMS_HELPERS_HPP