diff --git a/DEPS b/DEPS index d621b35250..c7c01e73dd 100644 --- a/DEPS +++ b/DEPS @@ -734,6 +734,7 @@ include_rules = [ "+rtc_tools", # Abseil whitelist. + "+absl/memory/memory.h", "+absl/types/optional.h", "+absl/types/variant.h", ] diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 28ff3c8184..716d0b2eb5 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -123,6 +123,9 @@ rtc_source_set("ptr_util") { "ptr_util.h", "scoped_ref_ptr.h", ] + deps = [ + "//third_party/abseil-cpp/absl/memory", + ] } rtc_source_set("refcount") { diff --git a/rtc_base/ptr_util.h b/rtc_base/ptr_util.h index 156df841b5..56d8da341d 100644 --- a/rtc_base/ptr_util.h +++ b/rtc_base/ptr_util.h @@ -8,74 +8,30 @@ * be found in the AUTHORS file in the root of the source tree. */ -// This implementation is borrowed from chromium. +// This file contains rtc::MakeUnique and rtc::WrapUnique, which are backwards +// compatibility aliases for absl::make_unique and absl::WrapUnique, +// respectively. This file will go away soon; use the Abseil types directly in +// new code. #ifndef RTC_BASE_PTR_UTIL_H_ #define RTC_BASE_PTR_UTIL_H_ -#include -#include +#include "absl/memory/memory.h" namespace rtc { -// Helper to transfer ownership of a raw pointer to a std::unique_ptr. -// Note that std::unique_ptr has very different semantics from -// std::unique_ptr: do not use this helper for array allocations. -template -std::unique_ptr WrapUnique(T* ptr) { - return std::unique_ptr(ptr); -} - -namespace internal { - -template -struct MakeUniqueResult { - using Scalar = std::unique_ptr; -}; - -template -struct MakeUniqueResult { - using Array = std::unique_ptr; -}; - -template -struct MakeUniqueResult { - using Invalid = void; -}; - -} // namespace internal - -// Helper to construct an object wrapped in a std::unique_ptr. This is an -// implementation of C++14's std::make_unique that can be used in Chrome. -// -// MakeUnique(args) should be preferred over WrapUnique(new T(args)): bare -// calls to `new` should be treated with scrutiny. -// -// Usage: -// // ptr is a std::unique_ptr -// auto ptr = MakeUnique("hello world!"); -// -// // arr is a std::unique_ptr -// auto arr = MakeUnique(5); - -// Overload for non-array types. Arguments are forwarded to T's constructor. template -typename internal::MakeUniqueResult::Scalar MakeUnique(Args&&... args) { - return std::unique_ptr(new T(std::forward(args)...)); +auto MakeUnique(Args&&... args) + -> decltype(absl::make_unique(std::forward(args)...)) { + return absl::make_unique(std::forward(args)...); } -// Overload for array types of unknown bound, e.g. T[]. The array is allocated -// with `new T[n]()` and value-initialized: note that this is distinct from -// `new T[n]`, which default-initializes. template -typename internal::MakeUniqueResult::Array MakeUnique(size_t size) { - return std::unique_ptr(new typename std::remove_extent::type[size]()); +auto MakeUnique(size_t n) -> decltype(absl::make_unique(n)) { + return absl::make_unique(n); } -// Overload to reject array types of known bound, e.g. T[n]. -template -typename internal::MakeUniqueResult::Invalid MakeUnique(Args&&... args) = - delete; +using absl::WrapUnique; } // namespace rtc