OLD | NEW |
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 the | 5 // Scopers help you manage ownership of a pointer, helping you easily manage the |
6 // a pointer within a scope, and automatically destroying the pointer at the | 6 // a pointer within a scope, and automatically destroying the pointer at the |
7 // end of a scope. There are two main classes you will use, which correspond | 7 // end of a scope. There are two main classes you will use, which correspond |
8 // to the operators new/delete and new[]/delete[]. | 8 // to the operators new/delete and new[]/delete[]. |
9 // | 9 // |
10 // Example usage (scoped_ptr<T>): | 10 // Example usage (scoped_ptr<T>): |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 return impl_.get(); | 377 return impl_.get(); |
378 } | 378 } |
379 element_type* get() const { return impl_.get(); } | 379 element_type* get() const { return impl_.get(); } |
380 | 380 |
381 // Access to the deleter. | 381 // Access to the deleter. |
382 deleter_type& get_deleter() { return impl_.get_deleter(); } | 382 deleter_type& get_deleter() { return impl_.get_deleter(); } |
383 const deleter_type& get_deleter() const { return impl_.get_deleter(); } | 383 const deleter_type& get_deleter() const { return impl_.get_deleter(); } |
384 | 384 |
385 // Allow scoped_ptr<element_type> to be used in boolean expressions, but not | 385 // Allow scoped_ptr<element_type> to be used in boolean expressions, but not |
386 // implicitly convertible to a real bool (which is dangerous). | 386 // implicitly convertible to a real bool (which is dangerous). |
| 387 // |
| 388 // Note that this trick is only safe when the == and != operators |
| 389 // are declared explicitly, as otherwise "scoped_ptr1 == |
| 390 // scoped_ptr2" will compile but do the wrong thing (i.e., convert |
| 391 // to Testable and then do the comparison). |
387 private: | 392 private: |
388 typedef base::internal::scoped_ptr_impl<element_type, deleter_type> | 393 typedef base::internal::scoped_ptr_impl<element_type, deleter_type> |
389 scoped_ptr::*Testable; | 394 scoped_ptr::*Testable; |
390 | 395 |
391 public: | 396 public: |
392 operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; } | 397 operator Testable() const { return impl_.get() ? &scoped_ptr::impl_ : NULL; } |
393 | 398 |
394 // Comparison operators. | 399 // Comparison operators. |
395 // These return whether two scoped_ptr refer to the same object, not just to | 400 // These return whether two scoped_ptr refer to the same object, not just to |
396 // two different but equal objects. | 401 // two different but equal objects. |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 | 697 |
693 // A function to convert T* into scoped_ptr<T> | 698 // A function to convert T* into scoped_ptr<T> |
694 // Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation | 699 // Doing e.g. make_scoped_ptr(new FooBarBaz<type>(arg)) is a shorter notation |
695 // for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg)) | 700 // for scoped_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg)) |
696 template <typename T> | 701 template <typename T> |
697 scoped_ptr<T> make_scoped_ptr(T* ptr) { | 702 scoped_ptr<T> make_scoped_ptr(T* ptr) { |
698 return scoped_ptr<T>(ptr); | 703 return scoped_ptr<T>(ptr); |
699 } | 704 } |
700 | 705 |
701 #endif // BASE_MEMORY_SCOPED_PTR_H_ | 706 #endif // BASE_MEMORY_SCOPED_PTR_H_ |
OLD | NEW |