Poison non-POD memset & non-trivially-copyable memcpy/memmove
[deliverable/binutils-gdb.git] / gdb / common / traits.h
index c8f29cccbedbf5ad0b450f8766c8cbb72adc3632..4f7161bdec424abcb973c47cb47f3df5c182e484 100644 (file)
@@ -32,7 +32,32 @@ template<typename... Ts>
 using void_t = typename make_void<Ts...>::type;
 
 /* A few trait helpers, mainly stolen from libstdc++.  Uppercase
-   because "and" is a keyword.  */
+   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;
@@ -55,6 +80,9 @@ 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;
 }
 
 #endif /* COMMON_TRAITS_H */
This page took 0.024108 seconds and 4 git commands to generate.