Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(550)

Side by Side Diff: base/memory/scoped_ptr.h

Issue 663243003: Clean up final uses of scoped_ptr<T>::PassAs() and remove it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | base/memory/scoped_ptr_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Scopers help you manage ownership of a pointer, helping you easily manage a 5 // Scopers help you manage ownership of a pointer, helping you easily manage a
6 // pointer within a scope, and automatically destroying the pointer at the end 6 // pointer within a scope, and automatically destroying the pointer at the end
7 // of a scope. There are two main classes you will use, which correspond to the 7 // of a scope. There are two main classes you will use, which correspond to the
8 // operators new/delete and new[]/delete[]. 8 // operators new/delete and new[]/delete[].
9 // 9 //
10 // Example usage (scoped_ptr<T>): 10 // Example usage (scoped_ptr<T>):
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 // are not copyable; they only implement move semantics which require calling 66 // are not copyable; they only implement move semantics which require calling
67 // the Pass() function to signify a destructive transfer of state. CreateFoo() 67 // the Pass() function to signify a destructive transfer of state. CreateFoo()
68 // is different though because we are constructing a temporary on the return 68 // is different though because we are constructing a temporary on the return
69 // line and thus can avoid needing to call Pass(). 69 // line and thus can avoid needing to call Pass().
70 // 70 //
71 // Pass() properly handles upcast in initialization, i.e. you can use a 71 // Pass() properly handles upcast in initialization, i.e. you can use a
72 // scoped_ptr<Child> to initialize a scoped_ptr<Parent>: 72 // scoped_ptr<Child> to initialize a scoped_ptr<Parent>:
73 // 73 //
74 // scoped_ptr<Foo> foo(new Foo()); 74 // scoped_ptr<Foo> foo(new Foo());
75 // scoped_ptr<FooParent> parent(foo.Pass()); 75 // scoped_ptr<FooParent> parent(foo.Pass());
76 //
77 // PassAs<>() should be used to upcast return value in return statement:
78 //
79 // scoped_ptr<Foo> CreateFoo() {
80 // scoped_ptr<FooChild> result(new FooChild());
81 // return result.PassAs<Foo>();
82 // }
83 //
84 // Note that PassAs<>() is implemented only for scoped_ptr<T>, but not for
85 // scoped_ptr<T[]>. This is because casting array pointers may not be safe.
86 76
87 #ifndef BASE_MEMORY_SCOPED_PTR_H_ 77 #ifndef BASE_MEMORY_SCOPED_PTR_H_
88 #define BASE_MEMORY_SCOPED_PTR_H_ 78 #define BASE_MEMORY_SCOPED_PTR_H_
89 79
90 // This is an implementation designed to match the anticipated future TR2 80 // This is an implementation designed to match the anticipated future TR2
91 // implementation of the scoped_ptr class. 81 // implementation of the scoped_ptr class.
92 82
93 #include <assert.h> 83 #include <assert.h>
94 #include <stddef.h> 84 #include <stddef.h>
95 #include <stdlib.h> 85 #include <stdlib.h>
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 } 419 }
430 420
431 // Release a pointer. 421 // Release a pointer.
432 // The return value is the current pointer held by this object. If this object 422 // The return value is the current pointer held by this object. If this object
433 // holds a nullptr, the return value is nullptr. After this operation, this 423 // holds a nullptr, the return value is nullptr. After this operation, this
434 // object will hold a nullptr, and will not own the object any more. 424 // object will hold a nullptr, and will not own the object any more.
435 element_type* release() WARN_UNUSED_RESULT { 425 element_type* release() WARN_UNUSED_RESULT {
436 return impl_.release(); 426 return impl_.release();
437 } 427 }
438 428
439 // C++98 doesn't support functions templates with default parameters which
440 // makes it hard to write a PassAs() that understands converting the deleter
441 // while preserving simple calling semantics.
442 //
443 // Until there is a use case for PassAs() with custom deleters, just ignore
444 // the custom deleter.
445 template <typename PassAsType>
446 scoped_ptr<PassAsType> PassAs() {
447 return scoped_ptr<PassAsType>(Pass());
448 }
449
450 private: 429 private:
451 // Needed to reach into |impl_| in the constructor. 430 // Needed to reach into |impl_| in the constructor.
452 template <typename U, typename V> friend class scoped_ptr; 431 template <typename U, typename V> friend class scoped_ptr;
453 base::internal::scoped_ptr_impl<element_type, deleter_type> impl_; 432 base::internal::scoped_ptr_impl<element_type, deleter_type> impl_;
454 433
455 // Forbidden for API compatibility with std::unique_ptr. 434 // Forbidden for API compatibility with std::unique_ptr.
456 explicit scoped_ptr(int disallow_construction_from_null); 435 explicit scoped_ptr(int disallow_construction_from_null);
457 436
458 // Forbid comparison of scoped_ptr types. If U != T, it totally 437 // Forbid comparison of scoped_ptr types. If U != T, it totally
459 // doesn't make sense, and if U == T, it still doesn't make sense 438 // doesn't make sense, and if U == T, it still doesn't make sense
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 579
601 // A function to convert T* into scoped_ptr<T> 580 // A function to convert T* into scoped_ptr<T>
602 // Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation 581 // Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation
603 // for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg)) 582 // for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
604 template <typename T> 583 template <typename T>
605 scoped_ptr<T> make_scoped_ptr(T* ptr) { 584 scoped_ptr<T> make_scoped_ptr(T* ptr) {
606 return scoped_ptr<T>(ptr); 585 return scoped_ptr<T>(ptr);
607 } 586 }
608 587
609 #endif // BASE_MEMORY_SCOPED_PTR_H_ 588 #endif // BASE_MEMORY_SCOPED_PTR_H_
OLDNEW
« no previous file with comments | « no previous file | base/memory/scoped_ptr_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698