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