Index: base/scoped_ptr.h |
diff --git a/base/scoped_ptr.h b/base/scoped_ptr.h |
index c716e7722f336ae0a89df618903e4d0a950fe6ac..ce2743ed319e188c165468472811296d3c12928e 100644 |
--- a/base/scoped_ptr.h |
+++ b/base/scoped_ptr.h |
@@ -256,19 +256,25 @@ bool operator!=(C* p1, const scoped_array<C>& p2) { |
return p1 != p2.get(); |
} |
-// This class wraps the c library function free() in a class that can be |
-// passed as a template argument to scoped_ptr_malloc below. |
-class ScopedPtrMallocFree { |
- public: |
- inline void operator()(void* x) const { |
- free(x); |
- } |
-}; |
+// This template function will adapt any function that takes a void* and |
+// returns void for use with scoped_ptr_malloc below. |
+template<void (*FreeFn)(void*), class C> |
+void FreeFnAdapter(C* x) { |
+ FreeFn(x); |
+} |
+template<int (*FreeFn)(void*), class C> |
+void FreeFnAdapterIgnoreReturn(C* x) { |
+ FreeFn(x); |
+} |
+template<class C, int (*FreeFn)(C*)> |
+void FreeFnIgnoreReturn(C* x) { |
+ FreeFn(x); |
+} |
// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a |
-// second template argument, the functor used to free the object. |
+// second template argument, the function used to free the object. |
-template<class C, class FreeProc = ScopedPtrMallocFree> |
+template<class C, void (*FreeProc)(C*) = FreeFnAdapter<free> > |
class scoped_ptr_malloc { |
public: |
@@ -284,7 +290,7 @@ class scoped_ptr_malloc { |
// Destructor. If there is a C object, call the Free functor. |
~scoped_ptr_malloc() { |
- free_(ptr_); |
+ FreePointer(ptr_); |
} |
// Reset. Calls the Free functor on the current owned object, if any. |
@@ -292,7 +298,7 @@ class scoped_ptr_malloc { |
// this->reset(this->get()) works. |
void reset(C* p = NULL) { |
if (ptr_ != p) { |
- free_(ptr_); |
+ FreePointer(ptr_); |
ptr_ = p; |
} |
} |
@@ -346,35 +352,34 @@ class scoped_ptr_malloc { |
} |
private: |
+ void FreePointer(C* x) { |
+ if (x) |
+ FreeProc(x); |
+ } |
C* ptr_; |
// no reason to use these: each scoped_ptr_malloc should have its own object |
- template <class C2, class GP> |
+ template <class C2, void GP(C*)> |
bool operator==(scoped_ptr_malloc<C2, GP> const& p) const; |
- template <class C2, class GP> |
+ template <class C2, void GP(C*)> |
bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const; |
- static FreeProc const free_; |
- |
// Disallow evil constructors |
scoped_ptr_malloc(const scoped_ptr_malloc&); |
void operator=(const scoped_ptr_malloc&); |
}; |
-template<class C, class FP> |
-FP const scoped_ptr_malloc<C, FP>::free_ = FP(); |
- |
-template<class C, class FP> inline |
+template<class C, void FP(C*)> inline |
void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) { |
a.swap(b); |
} |
-template<class C, class FP> inline |
+template<class C, void FP(C*)> inline |
bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) { |
return p == b.get(); |
} |
-template<class C, class FP> inline |
+template<class C, void FP(C*)> inline |
bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) { |
return p != b.get(); |
} |