Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1373)

Unified Diff: base/template_util.h

Issue 2000043002: Make base::Optional trivially destructible when possible. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/template_util.h
diff --git a/base/template_util.h b/base/template_util.h
index 74c8e5afdc63dfb63f25922fc62835d854a8d48b..fbff1f14d8bc2ade67ac72c3bef258fbd6badafc 100644
--- a/base/template_util.h
+++ b/base/template_util.h
@@ -11,6 +11,26 @@
#include "build/build_config.h"
+// libc++ uses namespace std { inline namespace <libc++-version> { } }
+// so redeclaration in namespace std does not work.
+#ifdef _LIBCPP_BEGIN_NAMESPACE_STD
+_LIBCPP_BEGIN_NAMESPACE_STD
+#else
+namespace std {
Nico 2016/05/25 13:56:59 defining stuff in namespace std in user code has u
alshabalin 2016/05/26 09:18:46 Done. Removed in favor of macro from https://coder
+#endif // _LIBCPP_BEGIN_NAMESPACE_STD
+
+template <class T>
+struct is_trivially_destructible;
+
+template <class T>
+struct has_trivial_destructor;
+
+#ifdef _LIBCPP_END_NAMESPACE_STD
+_LIBCPP_END_NAMESPACE_STD
+#else
+} // namespace std
+#endif // _LIBCPP_END_NAMESPACE_STD
+
namespace base {
template <class T> struct is_non_const_reference : std::false_type {};
@@ -82,6 +102,36 @@ struct is_move_assignable
const typename std::add_rvalue_reference<T>::type> {
};
+// is_trivially_destructible
+
+namespace internal {
danakj 2016/05/25 20:02:09 Sorry I've been thinking about how to do this in a
alshabalin 2016/05/26 09:18:46 Done. Defined a macro CR_USE_FALLBACKS_FOR_OLD_GLI
+
+// From C++17.
+template <typename... Ts>
+struct make_void {
+ typedef void type;
+};
+
+template <typename... Ts>
+using void_t = typename make_void<Ts...>::type;
+
+template <class T, class = void>
+struct IsTriviallyDestructibleImpl : public std::has_trivial_destructor<T> {};
+
+template <class T>
+struct IsTriviallyDestructibleImpl<
+ T,
+ void_t<typename std::is_trivially_destructible<T>::type>>
+ : public std::is_trivially_destructible<T> {};
+
+} // namespace internal
+
+// TODO(crbug.com/554293): Remove this when all platforms have this in the std
+// namespace.
+template <class T>
+struct is_trivially_destructible
+ : public internal::IsTriviallyDestructibleImpl<T> {};
+
} // namespace base
#endif // BASE_TEMPLATE_UTIL_H_

Powered by Google App Engine
This is Rietveld 408576698