Chromium Code Reviews| Index: mojo/public/cpp/bindings/struct_ptr.h |
| diff --git a/mojo/public/cpp/bindings/struct_ptr.h b/mojo/public/cpp/bindings/struct_ptr.h |
| index dbc3256ea782eed9d1950fee35552c77ceb347d4..238cacf9bd0338c72f967b14343c8b48cb089fd1 100644 |
| --- a/mojo/public/cpp/bindings/struct_ptr.h |
| +++ b/mojo/public/cpp/bindings/struct_ptr.h |
| @@ -21,9 +21,9 @@ constexpr size_t kHashSeed = 31; |
| template <typename Struct> |
| class StructHelper { |
| public: |
| - template <typename Ptr> |
| - static void Initialize(Ptr* ptr) { |
| - ptr->Initialize(); |
| + template <typename Ptr, typename... Args> |
| + static void Initialize(Ptr* ptr, Args&&... args) { |
| + ptr->Initialize(std::forward<Args>(args)...); |
| } |
| }; |
| @@ -109,9 +109,10 @@ class StructPtr { |
| friend class internal::StructHelper<Struct>; |
| friend class internal::StructPtrWTFHelper<Struct>; |
| - void Initialize() { |
| + template <typename... Args> |
| + void Initialize(Args&&... args) { |
| DCHECK(!ptr_); |
| - ptr_ = new Struct(); |
| + ptr_ = new Struct(std::forward<Args>(args)...); |
| } |
| void Take(StructPtr* other) { |
| @@ -207,7 +208,12 @@ class InlinedStructPtr { |
| friend class internal::StructHelper<Struct>; |
| friend class internal::InlinedStructPtrWTFHelper<Struct>; |
| - void Initialize() { state_ = VALID; } |
| + template <typename... Args> |
| + void Initialize(Args&&... args) { |
| + state_ = VALID; |
| + value_.~Struct(); |
|
yzshen1
2017/02/13 17:45:53
It seems we always default construct value_, destr
Sam McNally
2017/02/14 02:32:24
Done.
|
| + new (&value_) Struct(std::forward<Args>(args)...); |
| + } |
| void Take(InlinedStructPtr* other) { |
| reset(); |