Replace template_util.h with C++14 STL methods
Bug: None
Change-Id: Ib24889db4f452353afab816af4f9618b2767021f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/160760
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29942}
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 154f3ec..d626add 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -104,7 +104,6 @@
"rate_tracker.cc",
"rate_tracker.h",
"swap_queue.h",
- "template_util.h",
"timestamp_aligner.cc",
"timestamp_aligner.h",
"trace_event.h",
diff --git a/rtc_base/bind.h b/rtc_base/bind.h
index 16ac556..b61d189 100644
--- a/rtc_base/bind.h
+++ b/rtc_base/bind.h
@@ -65,7 +65,6 @@
#include <type_traits>
#include "api/scoped_refptr.h"
-#include "rtc_base/template_util.h"
#define NONAME
@@ -160,15 +159,12 @@
MethodFunctor(MethodT method, ObjectT* object, Args... args)
: method_(method), object_(object), args_(args...) {}
R operator()() const {
- return CallMethod(typename sequence_generator<sizeof...(Args)>::type());
+ return CallMethod(std::index_sequence_for<Args...>());
}
private:
- // Use sequence_generator (see template_util.h) to expand a MethodFunctor
- // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for
- // instance.
- template <int... S>
- R CallMethod(sequence<S...>) const {
+ template <size_t... S>
+ R CallMethod(std::index_sequence<S...>) const {
return (object_->*method_)(std::get<S>(args_)...);
}
@@ -185,15 +181,12 @@
Args... args)
: method_(method), object_(object.get()), args_(args...) {}
R operator()() const {
- return CallMethod(typename sequence_generator<sizeof...(Args)>::type());
+ return CallMethod(std::index_sequence_for<Args...>());
}
private:
- // Use sequence_generator (see template_util.h) to expand an
- // UnretainedMethodFunctor with 2 arguments to (std::get<0>(args_),
- // std::get<1>(args_)), for instance.
- template <int... S>
- R CallMethod(sequence<S...>) const {
+ template <size_t... S>
+ R CallMethod(std::index_sequence<S...>) const {
return (object_->*method_)(std::get<S>(args_)...);
}
@@ -208,15 +201,12 @@
Functor(const FunctorT& functor, Args... args)
: functor_(functor), args_(args...) {}
R operator()() const {
- return CallFunction(typename sequence_generator<sizeof...(Args)>::type());
+ return CallFunction(std::index_sequence_for<Args...>());
}
private:
- // Use sequence_generator (see template_util.h) to expand a Functor
- // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for
- // instance.
- template <int... S>
- R CallFunction(sequence<S...>) const {
+ template <size_t... S>
+ R CallFunction(std::index_sequence<S...>) const {
return functor_(std::get<S>(args_)...);
}
diff --git a/rtc_base/bind_unittest.cc b/rtc_base/bind_unittest.cc
index a97d2be..664cb54 100644
--- a/rtc_base/bind_unittest.cc
+++ b/rtc_base/bind_unittest.cc
@@ -97,13 +97,12 @@
// Try to catch any problem with scoped_refptr type deduction in rtc::Bind at
// compile time.
-#define EXPECT_IS_CAPTURED_AS_PTR(T) \
- static_assert(is_same<detail::PointerType<T>::type, T*>::value, \
- "PointerTyp" \
- "e")
-#define EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(T) \
- static_assert( \
- is_same<detail::PointerType<T>::type, scoped_refptr<T>>::value, \
+#define EXPECT_IS_CAPTURED_AS_PTR(T) \
+ static_assert(std::is_same<detail::PointerType<T>::type, T*>::value, \
+ "PointerType")
+#define EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(T) \
+ static_assert( \
+ std::is_same<detail::PointerType<T>::type, scoped_refptr<T>>::value, \
"PointerType")
EXPECT_IS_CAPTURED_AS_PTR(void);
diff --git a/rtc_base/template_util.h b/rtc_base/template_util.h
deleted file mode 100644
index 3c04a86..0000000
--- a/rtc_base/template_util.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-// Borrowed from Chromium's src/base/template_util.h.
-
-#ifndef RTC_BASE_TEMPLATE_UTIL_H_
-#define RTC_BASE_TEMPLATE_UTIL_H_
-
-#include <stddef.h> // For size_t.
-
-namespace rtc {
-
-// Template definitions from tr1.
-
-template <class T, T v>
-struct integral_constant {
- static const T value = v;
- typedef T value_type;
- typedef integral_constant<T, v> type;
-};
-
-template <class T, T v>
-const T integral_constant<T, v>::value;
-
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-
-template <class T>
-struct is_pointer : false_type {};
-template <class T>
-struct is_pointer<T*> : true_type {};
-
-template <class T, class U>
-struct is_same : public false_type {};
-template <class T>
-struct is_same<T, T> : true_type {};
-
-template <class>
-struct is_array : public false_type {};
-template <class T, size_t n>
-struct is_array<T[n]> : public true_type {};
-template <class T>
-struct is_array<T[]> : public true_type {};
-
-template <class T>
-struct is_non_const_reference : false_type {};
-template <class T>
-struct is_non_const_reference<T&> : true_type {};
-template <class T>
-struct is_non_const_reference<const T&> : false_type {};
-
-template <class T>
-struct is_void : false_type {};
-template <>
-struct is_void<void> : true_type {};
-
-// Helper useful for converting a tuple to variadic template function
-// arguments.
-//
-// sequence_generator<3>::type will be sequence<0, 1, 2>.
-template <int...>
-struct sequence {};
-template <int N, int... S>
-struct sequence_generator : sequence_generator<N - 1, N - 1, S...> {};
-template <int... S>
-struct sequence_generator<0, S...> {
- typedef sequence<S...> type;
-};
-
-namespace internal {
-
-// Types YesType and NoType are guaranteed such that sizeof(YesType) <
-// sizeof(NoType).
-typedef char YesType;
-
-struct NoType {
- YesType dummy[2];
-};
-
-// This class is an implementation detail for is_convertible, and you
-// don't need to know how it works to use is_convertible. For those
-// who care: we declare two different functions, one whose argument is
-// of type To and one with a variadic argument list. We give them
-// return types of different size, so we can use sizeof to trick the
-// compiler into telling us which function it would have chosen if we
-// had called it with an argument of type From. See Alexandrescu's
-// _Modern C++ Design_ for more details on this sort of trick.
-
-struct ConvertHelper {
- template <typename To>
- static YesType Test(To);
-
- template <typename To>
- static NoType Test(...);
-
- template <typename From>
- static From& Create();
-};
-
-// Used to determine if a type is a struct/union/class. Inspired by Boost's
-// is_class type_trait implementation.
-struct IsClassHelper {
- template <typename C>
- static YesType Test(void (C::*)(void));
-
- template <typename C>
- static NoType Test(...);
-};
-
-} // namespace internal
-
-// Inherits from true_type if From is convertible to To, false_type otherwise.
-//
-// Note that if the type is convertible, this will be a true_type REGARDLESS
-// of whether or not the conversion would emit a warning.
-template <typename From, typename To>
-struct is_convertible
- : integral_constant<bool,
- sizeof(internal::ConvertHelper::Test<To>(
- internal::ConvertHelper::Create<From>())) ==
- sizeof(internal::YesType)> {};
-
-template <typename T>
-struct is_class
- : integral_constant<bool,
- sizeof(internal::IsClassHelper::Test<T>(0)) ==
- sizeof(internal::YesType)> {};
-
-} // namespace rtc
-
-#endif // RTC_BASE_TEMPLATE_UTIL_H_