Index: base/memory/scoped_generic_obj.h |
=================================================================== |
--- base/memory/scoped_generic_obj.h (revision 0) |
+++ base/memory/scoped_generic_obj.h (revision 0) |
@@ -0,0 +1,130 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef BASE_MEMORY_SCOPED_GENERIC_OBJ_H_ |
+#define BASE_MEMORY_SCOPED_GENERIC_OBJ_H_ |
+#pragma once |
+ |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+ |
+// ScopedGenericObj<> is patterned after scoped_ptr_malloc<>, except |
+// that it assumes the template argument is typedef'ed to a pointer |
+// type. It does not support retain/release semantics. It takes as its |
+// second template argument a functor which frees the object. |
+// |
+// Example (Mac-specific): |
+// |
+// class ScopedDestroyRendererInfo { |
+// public: |
+// void operator()(CGLRendererInfoObj x) const { |
+// CGLDestroyRendererInfo(x); |
+// } |
+// }; |
+// |
+// ... |
+// |
+// CGLRendererInfoObj renderer_info = NULL; |
+// ... |
+// ScopedGenericObj<CGLRendererInfoObj, ScopedDestroyRendererInfo> |
+// scoper(renderer_info); |
+ |
+template<class C, class FreeProc> |
+class ScopedGenericObj { |
+ public: |
+ |
+ // The element type |
+ typedef C element_type; |
+ |
+ // Constructor. Defaults to initializing with NULL. |
+ // There is no way to create an uninitialized ScopedGenericObj. |
+ // The input parameter must be allocated with an allocator that matches the |
+ // Free functor. |
+ explicit ScopedGenericObj(C p = NULL): obj_(p) {} |
+ |
+ // Destructor. If there is a C object, call the Free functor. |
+ ~ScopedGenericObj() { |
+ reset(); |
+ } |
+ |
+ // Reset. Calls the Free functor on the current owned object, if any. |
+ // Then takes ownership of a new object, if given. |
+ // this->reset(this->get()) works. |
+ void reset(C p = NULL) { |
+ if (obj_ != p) { |
+ FreeProc free_proc; |
+ free_proc(obj_); |
+ obj_ = p; |
+ } |
+ } |
+ |
+ operator C() const { |
+ return obj_; |
+ } |
+ |
+ C get() const { |
+ return obj_; |
+ } |
+ |
+ // Comparison operators. |
+ // These return whether a ScopedGenericObj and a plain pointer refer |
+ // to the same object, not just to two different but equal objects. |
+ // For compatibility with the boost-derived implementation, these |
+ // take non-const arguments. |
+ bool operator==(C p) const { |
+ return obj_ == p; |
+ } |
+ |
+ bool operator!=(C p) const { |
+ return obj_ != p; |
+ } |
+ |
+ // Swap two ScopedGenericObjs. |
+ void swap(ScopedGenericObj& b) { |
+ C tmp = b.obj_; |
+ b.obj_ = obj_; |
+ obj_ = tmp; |
+ } |
+ |
+ // Release a pointer. |
+ // The return value is the current pointer held by this object. |
+ // If this object holds a NULL pointer, the return value is NULL. |
+ // After this operation, this object will hold a NULL pointer, |
+ // and will not own the object any more. |
+ C release() WARN_UNUSED_RESULT { |
+ C tmp = obj_; |
+ obj_ = NULL; |
+ return tmp; |
+ } |
+ |
+ private: |
+ C obj_; |
+ |
+ // no reason to use these: each ScopedGenericObj should have its own object. |
+ template <class C2, class GP> |
+ bool operator==(ScopedGenericObj<C2, GP> const& p) const; |
+ template <class C2, class GP> |
+ bool operator!=(ScopedGenericObj<C2, GP> const& p) const; |
+ |
+ // Disallow evil constructors. |
+ ScopedGenericObj(const ScopedGenericObj&); |
+ void operator=(const ScopedGenericObj&); |
+}; |
+ |
+template<class C, class FP> inline |
+void swap(ScopedGenericObj<C, FP>& a, ScopedGenericObj<C, FP>& b) { |
+ a.swap(b); |
+} |
+ |
+template<class C, class FP> inline |
+bool operator==(C* p, const ScopedGenericObj<C, FP>& b) { |
+ return p == b.get(); |
+} |
+ |
+template<class C, class FP> inline |
+bool operator!=(C* p, const ScopedGenericObj<C, FP>& b) { |
+ return p != b.get(); |
+} |
+ |
+#endif // BASE_MEMORY_SCOPED_GENERIC_OBJ_H_ |
Property changes on: base/memory/scoped_generic_obj.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |