diff options
Diffstat (limited to 'gdbsupport/traits.h')
-rw-r--r-- | gdbsupport/traits.h | 77 |
1 files changed, 43 insertions, 34 deletions
diff --git a/gdbsupport/traits.h b/gdbsupport/traits.h index f6bb649..f3088f8 100644 --- a/gdbsupport/traits.h +++ b/gdbsupport/traits.h @@ -22,7 +22,7 @@ /* GCC does not understand __has_feature. */ #if !defined(__has_feature) -# define __has_feature(x) 0 +#define __has_feature(x) 0 #endif /* HAVE_IS_TRIVIALLY_COPYABLE is defined as 1 iff @@ -30,7 +30,7 @@ in GCC 5. */ #if (__has_feature(is_trivially_copyable) \ || (defined __GNUC__ && __GNUC__ >= 5)) -# define HAVE_IS_TRIVIALLY_COPYABLE 1 +#define HAVE_IS_TRIVIALLY_COPYABLE 1 #endif /* HAVE_IS_TRIVIALLY_CONSTRUCTIBLE is defined as 1 iff @@ -38,16 +38,20 @@ in GCC 5. */ #if (__has_feature(is_trivially_constructible) \ || (defined __GNUC__ && __GNUC__ >= 5)) -# define HAVE_IS_TRIVIALLY_CONSTRUCTIBLE 1 +#define HAVE_IS_TRIVIALLY_CONSTRUCTIBLE 1 #endif -namespace gdb { +namespace gdb +{ /* Pre C++14-safe (CWG 1558) version of C++17's std::void_t. See <http://en.cppreference.com/w/cpp/types/void_t>. */ template<typename... Ts> -struct make_void { typedef void type; }; +struct make_void +{ + typedef void type; +}; template<typename... Ts> using void_t = typename make_void<Ts...>::type; @@ -67,10 +71,11 @@ struct nonesuch void operator= (const nonesuch &) = delete; }; -namespace detection_detail { +namespace detection_detail +{ /* Implementation of the detection idiom (negative case). */ -template<typename Default, typename AlwaysVoid, - template<typename...> class Op, typename... Args> +template<typename Default, typename AlwaysVoid, template<typename...> class Op, + typename... Args> struct detector { using value_t = std::false_type; @@ -86,25 +91,22 @@ struct detector<Default, void_t<Op<Args...>>, Op, Args...> }; /* Detect whether Op<Args...> is a valid type, use Default if not. */ -template<typename Default, template<typename...> class Op, - typename... Args> +template<typename Default, template<typename...> class Op, typename... Args> using detected_or = detector<Default, void, Op, Args...>; /* Op<Args...> if that is a valid type, otherwise Default. */ -template<typename Default, template<typename...> class Op, - typename... Args> -using detected_or_t - = typename detected_or<Default, Op, Args...>::type; +template<typename Default, template<typename...> class Op, typename... Args> +using detected_or_t = typename detected_or<Default, Op, Args...>::type; -} /* detection_detail */ +} // namespace detection_detail template<template<typename...> class Op, typename... Args> -using is_detected - = typename detection_detail::detector<nonesuch, void, Op, Args...>::value_t; +using is_detected = + typename detection_detail::detector<nonesuch, void, Op, Args...>::value_t; template<template<typename...> class Op, typename... Args> -using detected_t - = typename detection_detail::detector<nonesuch, void, Op, Args...>::type; +using detected_t = + typename detection_detail::detector<nonesuch, void, Op, Args...>::type; template<typename Default, template<typename...> class Op, typename... Args> using detected_or = detection_detail::detected_or<Default, Op, Args...>; @@ -124,53 +126,60 @@ using is_detected_convertible template<typename Predicate> struct Not : public std::integral_constant<bool, !Predicate::value> -{}; +{ +}; template<typename...> struct Or; template<> struct Or<> : public std::false_type -{}; +{ +}; template<typename B1> struct Or<B1> : public B1 -{}; +{ +}; template<typename B1, typename B2> -struct Or<B1, B2> - : public std::conditional<B1::value, B1, B2>::type -{}; +struct Or<B1, B2> : public std::conditional<B1::value, B1, B2>::type +{ +}; -template<typename B1,typename B2,typename B3, typename... Bn> +template<typename B1, typename B2, typename B3, typename... Bn> struct Or<B1, B2, B3, Bn...> : public std::conditional<B1::value, B1, Or<B2, B3, Bn...>>::type -{}; +{ +}; template<typename...> struct And; template<> struct And<> : public std::true_type -{}; +{ +}; template<typename B1> struct And<B1> : public B1 -{}; +{ +}; template<typename B1, typename B2> -struct And<B1, B2> - : public std::conditional<B1::value, B2, B1>::type -{}; +struct And<B1, B2> : public std::conditional<B1::value, B2, B1>::type +{ +}; template<typename B1, typename B2, typename B3, typename... Bn> struct And<B1, B2, B3, Bn...> : public std::conditional<B1::value, And<B2, B3, Bn...>, B1>::type -{}; +{ +}; /* Concepts-light-like helper to make SFINAE logic easier to read. */ template<typename Condition> using Requires = typename std::enable_if<Condition::value, void>::type; -} +} // namespace gdb #endif /* COMMON_TRAITS_H */ |