diff options
author | Tom Tromey <tromey@adacore.com> | 2024-12-20 13:45:51 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2025-01-06 06:46:35 -0700 |
commit | 99e2df0090faba0705aabd2792fe427de20b8e46 (patch) | |
tree | 3ba017fca581b2256de952f5f900672c308cfaa2 | |
parent | a189db13c4889548be4439314a956f2ab910166b (diff) | |
download | gdb-99e2df0090faba0705aabd2792fe427de20b8e46.zip gdb-99e2df0090faba0705aabd2792fe427de20b8e46.tar.gz gdb-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>
-rw-r--r-- | gdbsupport/traits.h | 55 |
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> |