diff options
author | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-25 00:33:05 +0000 |
---|---|---|
committer | sergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-25 00:33:05 +0000 |
commit | 6e29d6f3d7f6fca666ec11626933de272dc299e8 (patch) | |
tree | 8136bd20c2691ed140933e4443cbf5f889b1ced3 /base | |
parent | 9180d8a66e4e848cf0c6c2ad554d8b72059378f3 (diff) | |
download | chromium_src-6e29d6f3d7f6fca666ec11626933de272dc299e8.zip chromium_src-6e29d6f3d7f6fca666ec11626933de272dc299e8.tar.gz chromium_src-6e29d6f3d7f6fca666ec11626933de272dc299e8.tar.bz2 |
Add scoped_ptr<>::PassAs<>().
The new PassAs<>() method can be used to explicitly upcast scoped_ptr instances.
Review URL: http://codereview.chromium.org/9283028
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@118958 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/base.gyp | 1 | ||||
-rw-r--r-- | base/memory/scoped_ptr.h | 21 | ||||
-rw-r--r-- | base/memory/scoped_ptr_unittest.cc | 21 | ||||
-rw-r--r-- | base/memory/scoped_ptr_unittest.nc | 24 |
4 files changed, 67 insertions, 0 deletions
diff --git a/base/base.gyp b/base/base.gyp index be533ad..d5f485a 100644 --- a/base/base.gyp +++ b/base/base.gyp @@ -176,6 +176,7 @@ 'memory/ref_counted_memory_unittest.cc', 'memory/ref_counted_unittest.cc', 'memory/scoped_ptr_unittest.cc', + 'memory/scoped_ptr_unittest.nc', 'memory/scoped_vector_unittest.cc', 'memory/singleton_unittest.cc', 'memory/weak_ptr_unittest.cc', diff --git a/base/memory/scoped_ptr.h b/base/memory/scoped_ptr.h index 7133a34..77a2039 100644 --- a/base/memory/scoped_ptr.h +++ b/base/memory/scoped_ptr.h @@ -67,6 +67,22 @@ // the Pass() function to signify a destructive transfer of state. CreateFoo() // is different though because we are constructing a temporary on the return // line and thus can avoid needing to call Pass(). +// +// Pass() properly handles upcast in assignment, i.e. you can assign +// scoped_ptr<Child> to scoped_ptr<Parent>: +// +// scoped_ptr<Foo> foo(new Foo()); +// scoped_ptr<FooParent> parent = foo.Pass(); +// +// PassAs<>() should be used to upcast return value in return statement: +// +// scoped_ptr<Foo> CreateFoo() { +// scoped_ptr<FooChild> result(new FooChild()); +// return result.PassAs<Foo>(); +// } +// +// Note that PassAs<>() is implemented only for scoped_ptr, but not for +// scoped_array. This is because casting array pointers may not be safe. #ifndef BASE_MEMORY_SCOPED_PTR_H_ #define BASE_MEMORY_SCOPED_PTR_H_ @@ -182,6 +198,11 @@ class scoped_ptr { return retVal; } + template <typename PassAsType> + scoped_ptr<PassAsType> PassAs() { + return scoped_ptr<PassAsType>(release()); + } + private: C* ptr_; diff --git a/base/memory/scoped_ptr_unittest.cc b/base/memory/scoped_ptr_unittest.cc index ea13533..63125db 100644 --- a/base/memory/scoped_ptr_unittest.cc +++ b/base/memory/scoped_ptr_unittest.cc @@ -45,6 +45,11 @@ scoped_ptr<ConDecLogger> TestReturnOfType(int* constructed) { return scoped_ptr<ConDecLogger>(new ConDecLogger(constructed)); } +scoped_ptr<ConDecLoggerParent> UpcastUsingPassAs( + scoped_ptr<ConDecLogger> object) { + return object.PassAs<ConDecLoggerParent>(); +} + } // namespace TEST(ScopedPtrTest, ScopedPtr) { @@ -333,4 +338,20 @@ TEST(ScopedPtrTest, ReturnTypeBehavior) { EXPECT_EQ(0, constructed); } +TEST(ScopedPtrTest, PassAs) { + int constructed = 0; + { + scoped_ptr<ConDecLogger> scoper(new ConDecLogger(&constructed)); + EXPECT_EQ(1, constructed); + EXPECT_TRUE(scoper.get()); + + scoped_ptr<ConDecLoggerParent> scoper_parent; + scoper_parent = UpcastUsingPassAs(scoper.Pass()); + EXPECT_EQ(1, constructed); + EXPECT_TRUE(scoper_parent.get()); + EXPECT_FALSE(scoper.get()); + } + EXPECT_EQ(0, constructed); +} + // TODO scoped_ptr_malloc diff --git a/base/memory/scoped_ptr_unittest.nc b/base/memory/scoped_ptr_unittest.nc new file mode 100644 index 0000000..841d03c --- /dev/null +++ b/base/memory/scoped_ptr_unittest.nc @@ -0,0 +1,24 @@ +// Copyright (c) 2012 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. + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" + +namespace { + +class Parent { +}; + +class Child : public Parent { +}; + +} // namespace + +#if defined(NCTEST_NO_PASSAS_DOWNCAST) // [r"invalid conversion from"] + +scoped_ptr<Child> DowncastUsingPassAs(scoped_ptr<Parent> object) { + return object.PassAs<Child>(); +} + +#endif |