summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 00:33:05 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-25 00:33:05 +0000
commit6e29d6f3d7f6fca666ec11626933de272dc299e8 (patch)
tree8136bd20c2691ed140933e4443cbf5f889b1ced3 /base
parent9180d8a66e4e848cf0c6c2ad554d8b72059378f3 (diff)
downloadchromium_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.gyp1
-rw-r--r--base/memory/scoped_ptr.h21
-rw-r--r--base/memory/scoped_ptr_unittest.cc21
-rw-r--r--base/memory/scoped_ptr_unittest.nc24
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