aboutsummaryrefslogtreecommitdiff
path: root/gdbsupport/traits.h
diff options
context:
space:
mode:
Diffstat (limited to 'gdbsupport/traits.h')
-rw-r--r--gdbsupport/traits.h77
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 */