Simplify traits.h using C++17

Message ID 20241220204800.3247089-1-tromey@adacore.com
State New
Headers
Series Simplify traits.h using C++17 |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gdb_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gdb_check--master-aarch64 success Test passed
linaro-tcwg-bot/tcwg_gdb_check--master-arm success Test passed

Commit Message

Tom Tromey Dec. 20, 2024, 8:48 p.m. UTC
  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
---
 gdbsupport/traits.h | 55 ++++++++-------------------------------------
 1 file changed, 9 insertions(+), 46 deletions(-)
  

Comments

Simon Marchi Dec. 20, 2024, 9:14 p.m. UTC | #1
On 2024-12-20 15:48, Tom Tromey wrote:
> 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

Agreed that they are clearer names.

Approved-By: Simon Marchi <simon.marchi@efficios.com>

Simon
  

Patch

diff --git a/gdbsupport/traits.h b/gdbsupport/traits.h
index 7350cc45d9c..62e6de7deaa 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>