diff options
author | tsepez <tsepez@chromium.org> | 2016-10-03 15:24:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-10-03 15:24:27 -0700 |
commit | 36eb4bdcae719cf33c536ff72ac000482aed8382 (patch) | |
tree | b3c3467fa10eafc3863a619ef511d1bf20af6367 /third_party | |
parent | 76383db4906c9357292846ace77566b34eb47de9 (diff) | |
download | pdfium-36eb4bdcae719cf33c536ff72ac000482aed8382.tar.xz |
Add ptr_util.h from base until std::make_unique<> available
Review-Url: https://codereview.chromium.org/2386273004
Diffstat (limited to 'third_party')
-rw-r--r-- | third_party/BUILD.gn | 1 | ||||
-rw-r--r-- | third_party/base/ptr_util.h | 74 |
2 files changed, 75 insertions, 0 deletions
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn index 958b9cc85e..1fef9bb345 100644 --- a/third_party/BUILD.gn +++ b/third_party/BUILD.gn @@ -480,6 +480,7 @@ source_set("pdfium_base") { "base/numerics/safe_conversions_impl.h", "base/numerics/safe_math.h", "base/numerics/safe_math_impl.h", + "base/ptr_util.h", "base/stl_util.h", ] } diff --git a/third_party/base/ptr_util.h b/third_party/base/ptr_util.h new file mode 100644 index 0000000000..b64261f82d --- /dev/null +++ b/third_party/base/ptr_util.h @@ -0,0 +1,74 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PDFIUM_THIRD_PARTY_BASE_PTR_UTIL_H_ +#define PDFIUM_THIRD_PARTY_BASE_PTR_UTIL_H_ + +#include <memory> +#include <utility> + +namespace pdfium { + +// Helper to transfer ownership of a raw pointer to a std::unique_ptr<T>. +// Note that std::unique_ptr<T> has very different semantics from +// std::unique_ptr<T[]>: do not use this helper for array allocations. +template <typename T> +std::unique_ptr<T> WrapUnique(T* ptr) { + return std::unique_ptr<T>(ptr); +} + +namespace internal { + +template <typename T> +struct MakeUniqueResult { + using Scalar = std::unique_ptr<T>; +}; + +template <typename T> +struct MakeUniqueResult<T[]> { + using Array = std::unique_ptr<T[]>; +}; + +template <typename T, size_t N> +struct MakeUniqueResult<T[N]> { + 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::MakeUnique that can be used in Chrome. +// +// MakeUnique<T>(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<std::string> +// auto ptr = MakeUnique<std::string>("hello world!"); +// +// // arr is a std::unique_ptr<int[]> +// auto arr = MakeUnique<int[]>(5); + +// Overload for non-array types. Arguments are forwarded to T's constructor. +template <typename T, typename... Args> +typename internal::MakeUniqueResult<T>::Scalar MakeUnique(Args&&... args) { + return std::unique_ptr<T>(new T(std::forward<Args>(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 T> +typename internal::MakeUniqueResult<T>::Array MakeUnique(size_t size) { + return std::unique_ptr<T>(new typename std::remove_extent<T>::type[size]()); +} + +// Overload to reject array types of known bound, e.g. T[n]. +template <typename T, typename... Args> +typename internal::MakeUniqueResult<T>::Invalid MakeUnique(Args&&... args) = + delete; + +} // namespace pdfium + +#endif // PDFIUM_THIRD_PARTY_BASE_PTR_UTIL_H_ |