15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  Copyright (c) 2001, 2002 Peter Dimov
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  Permission to copy, use, modify, sell and distribute this software
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  is granted provided this copyright notice appears in all copies.
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  This software is provided "as is" without express or implied
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  warranty, and with no claim as to its suitability for any purpose.
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  scoped_ptr mimics a built-in pointer except that it guarantees deletion
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  of the object pointed to, either on destruction of the scoped_ptr or via
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  an explicit reset(). scoped_ptr is a simple solution for simple needs;
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  use shared_ptr or std::auto_ptr if your needs are more complex.
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  scoped_ptr_malloc added in by Google.  When one of
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  these goes out of scope, instead of doing a delete or delete[], it
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  calls free().  scoped_ptr_malloc<char> is likely to see much more
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  use than any other specializations.
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  release() added in by Google. Use this to conditionally
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  transfer ownership of a heap-allocated object to the caller, usually on
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  method success.
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_BASE_SCOPED_PTR_H__
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_BASE_SCOPED_PTR_H__
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <cstddef>             // for std::ptrdiff_t
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <stdlib.h>            // for free() decl
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h"  // for ASSERT
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef _WIN32
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace std { using ::ptrdiff_t; };
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // _WIN32
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base {
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate <typename T>
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass scoped_ptr {
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* ptr;
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_ptr(scoped_ptr const &);
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_ptr & operator=(scoped_ptr const &);
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T element_type;
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  explicit scoped_ptr(T* p = NULL): ptr(p) {}
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ~scoped_ptr() {
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    typedef char type_must_be_complete[sizeof(T)];
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete ptr;
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void reset(T* p = NULL) {
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    typedef char type_must_be_complete[sizeof(T)];
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr != p) {
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      T* obj = ptr;
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = p;
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // Delete last, in case obj destructor indirectly results in ~scoped_ptr
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      delete obj;
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T& operator*() const {
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(ptr != NULL);
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return *ptr;
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* operator->() const  {
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(ptr != NULL);
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr;
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* get() const  {
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr;
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void swap(scoped_ptr & b) {
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = b.ptr;
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    b.ptr = ptr;
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = tmp;
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* release() {
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = ptr;
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = NULL;
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return tmp;
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T** accept() {
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr) {
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      delete ptr;
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = NULL;
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return &ptr;
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T** use() {
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return &ptr;
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Allow scoped_ptr<T> to be used in boolean expressions, but not
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // implicitly convertible to a real bool (which is dangerous).
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Borrowed from chromium's scoped_ptr implementation.
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T* scoped_ptr::*Testable;
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  operator Testable() const { return ptr ? &scoped_ptr::ptr : NULL; }
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<typename T> inline
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  a.swap(b);
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  is guaranteed, either on destruction of the scoped_array or via an explicit
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//  reset(). Use shared_array or std::vector if your needs are more complex.
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<typename T>
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass scoped_array {
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* ptr;
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_array(scoped_array const &);
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_array & operator=(scoped_array const &);
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T element_type;
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  explicit scoped_array(T* p = NULL) : ptr(p) {}
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ~scoped_array() {
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    typedef char type_must_be_complete[sizeof(T)];
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    delete[] ptr;
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void reset(T* p = NULL) {
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    typedef char type_must_be_complete[sizeof(T)];
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr != p) {
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      T* arr = ptr;
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = p;
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      // Delete last, in case arr destructor indirectly results in ~scoped_array
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      delete [] arr;
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T& operator[](std::ptrdiff_t i) const {
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(ptr != NULL);
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(i >= 0);
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr[i];
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* get() const {
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr;
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void swap(scoped_array & b) {
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = b.ptr;
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    b.ptr = ptr;
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = tmp;
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* release() {
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = ptr;
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = NULL;
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return tmp;
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T** accept() {
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr) {
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      delete [] ptr;
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = NULL;
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return &ptr;
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Allow scoped_array<T> to be used in boolean expressions, but not
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // implicitly convertible to a real bool (which is dangerous).
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Borrowed from chromium's scoped_array implementation.
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T* scoped_array::*Testable;
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  operator Testable() const { return ptr ? &scoped_array::ptr : NULL; }
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<class T> inline
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid swap(scoped_array<T>& a, scoped_array<T>& b) {
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  a.swap(b);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// second template argument, the function used to free the object.
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<typename T, void (*FF)(T*) = free> class scoped_ptr_malloc {
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* ptr;
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_ptr_malloc(scoped_ptr_malloc const &);
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T element_type;
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ~scoped_ptr_malloc() {
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    FF(ptr);
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void reset(T* p = 0) {
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr != p) {
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      FF(ptr);
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = p;
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T& operator*() const {
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(ptr != 0);
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return *ptr;
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* operator->() const {
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ASSERT(ptr != 0);
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr;
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* get() const {
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return ptr;
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void swap(scoped_ptr_malloc & b) {
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = b.ptr;
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    b.ptr = ptr;
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = tmp;
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T* release() {
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    T* tmp = ptr;
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ptr = 0;
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return tmp;
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  T** accept() {
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    if (ptr) {
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      FF(ptr);
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      ptr = 0;
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return &ptr;
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Allow scoped_ptr_malloc<T> to be used in boolean expressions, but not
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // implicitly convertible to a real bool (which is dangerous).
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Borrowed from chromium's scoped_ptr_malloc implementation.
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  typedef T* scoped_ptr_malloc::*Testable;
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  operator Testable() const { return ptr ? &scoped_ptr_malloc::ptr : NULL; }
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgtemplate<typename T, void (*FF)(T*)> inline
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid swap(scoped_ptr_malloc<T,FF>& a, scoped_ptr_malloc<T,FF>& b) {
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  a.swap(b);
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // #ifndef TALK_BASE_SCOPED_PTR_H__
278