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

Side by Side Diff: base/scoped_ptr.h

Issue 3031001: str_ptr_malloc: The simple solution (Closed)
Patch Set: rebased Created 10 years, 4 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 | no next file » | 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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 coorespond 7 // end of a scope. There are two main classes you will use, which coorespond
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): 10 // Example usage (scoped_ptr):
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 277
278 // Constructor. Defaults to intializing with NULL. 278 // Constructor. Defaults to intializing with NULL.
279 // There is no way to create an uninitialized scoped_ptr. 279 // There is no way to create an uninitialized scoped_ptr.
280 // The input parameter must be allocated with an allocator that matches the 280 // The input parameter must be allocated with an allocator that matches the
281 // Free functor. For the default Free functor, this is malloc, calloc, or 281 // Free functor. For the default Free functor, this is malloc, calloc, or
282 // realloc. 282 // realloc.
283 explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {} 283 explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {}
284 284
285 // Destructor. If there is a C object, call the Free functor. 285 // Destructor. If there is a C object, call the Free functor.
286 ~scoped_ptr_malloc() { 286 ~scoped_ptr_malloc() {
287 free_(ptr_); 287 FreeProc()(ptr_);
288 } 288 }
289 289
290 // Reset. Calls the Free functor on the current owned object, if any. 290 // Reset. Calls the Free functor on the current owned object, if any.
291 // Then takes ownership of a new object, if given. 291 // Then takes ownership of a new object, if given.
292 // this->reset(this->get()) works. 292 // this->reset(this->get()) works.
293 void reset(C* p = NULL) { 293 void reset(C* p = NULL) {
294 if (ptr_ != p) { 294 if (ptr_ != p) {
295 free_(ptr_); 295 FreeProc()(ptr_);
296 ptr_ = p; 296 ptr_ = p;
297 } 297 }
298 } 298 }
299 299
300 // Get the current object. 300 // Get the current object.
301 // operator* and operator-> will cause an assert() failure if there is 301 // operator* and operator-> will cause an assert() failure if there is
302 // no current object. 302 // no current object.
303 C& operator*() const { 303 C& operator*() const {
304 assert(ptr_ != NULL); 304 assert(ptr_ != NULL);
305 return *ptr_; 305 return *ptr_;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 347
348 private: 348 private:
349 C* ptr_; 349 C* ptr_;
350 350
351 // no reason to use these: each scoped_ptr_malloc should have its own object 351 // no reason to use these: each scoped_ptr_malloc should have its own object
352 template <class C2, class GP> 352 template <class C2, class GP>
353 bool operator==(scoped_ptr_malloc<C2, GP> const& p) const; 353 bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
354 template <class C2, class GP> 354 template <class C2, class GP>
355 bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const; 355 bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
356 356
357 static FreeProc const free_;
358
359 // Disallow evil constructors 357 // Disallow evil constructors
360 scoped_ptr_malloc(const scoped_ptr_malloc&); 358 scoped_ptr_malloc(const scoped_ptr_malloc&);
361 void operator=(const scoped_ptr_malloc&); 359 void operator=(const scoped_ptr_malloc&);
362 }; 360 };
363 361
364 template<class C, class FP>
365 FP const scoped_ptr_malloc<C, FP>::free_ = FP();
366
367 template<class C, class FP> inline 362 template<class C, class FP> inline
368 void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) { 363 void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
369 a.swap(b); 364 a.swap(b);
370 } 365 }
371 366
372 template<class C, class FP> inline 367 template<class C, class FP> inline
373 bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) { 368 bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
374 return p == b.get(); 369 return p == b.get();
375 } 370 }
376 371
377 template<class C, class FP> inline 372 template<class C, class FP> inline
378 bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) { 373 bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
379 return p != b.get(); 374 return p != b.get();
380 } 375 }
381 376
382 #endif // BASE_SCOPED_PTR_H_ 377 #endif // BASE_SCOPED_PTR_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698