aboutsummaryrefslogtreecommitdiff
path: root/gdbsupport
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2024-12-20 13:45:51 -0700
committerTom Tromey <tromey@adacore.com>2025-01-06 06:46:35 -0700
commit99e2df0090faba0705aabd2792fe427de20b8e46 (patch)
tree3ba017fca581b2256de952f5f900672c308cfaa2 /gdbsupport
parenta189db13c4889548be4439314a956f2ab910166b (diff)
downloadbinutils-99e2df0090faba0705aabd2792fe427de20b8e46.zip
binutils-99e2df0090faba0705aabd2792fe427de20b8e46.tar.gz
binutils-99e2df0090faba0705aabd2792fe427de20b8e46.tar.bz2
Simplify traits.h using C++17
This patch simplifies gdbsupport/traits.h by reusing some C++17 type traits. I kept the local names, since they are generally better. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31423 Approved-By: Simon Marchi <simon.marchi@efficios.com>
Diffstat (limited to 'gdbsupport')
-rw-r--r--gdbsupport/traits.h55
1 files changed, 9 insertions, 46 deletions
diff --git a/gdbsupport/traits.h b/gdbsupport/traits.h
index 7350cc4..62e6de7 100644
--- a/gdbsupport/traits.h
+++ b/gdbsupport/traits.h
@@ -89,54 +89,17 @@ template<typename To, template<typename...> class Op, typename... Args>
using is_detected_convertible
= std::is_convertible<detected_t<Op, Args...>, To>;
-/* A few trait helpers, mainly stolen from libstdc++. Uppercase
- because "and/or", etc. are reserved keywords. */
+/* A few trait helpers -- standard traits but with slightly nicer
+ names. Uppercase because "and/or", etc. are reserved keywords. */
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
-{};
-
-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
-{};
-
-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
-{};
+using Not = std::negation<Predicate>;
+
+template<typename ...T>
+using Or = std::disjunction<T...>;
+
+template<typename ...T>
+using And = std::conjunction<T...>;
/* Concepts-light-like helper to make SFINAE logic easier to read. */
template<typename Condition>