Index: base/mac/scoped_typeref.h |
diff --git a/base/mac/scoped_typeref.h b/base/mac/scoped_typeref.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..21100d8ead122024bc7f3a626f0f1058cabc3435 |
--- /dev/null |
+++ b/base/mac/scoped_typeref.h |
@@ -0,0 +1,124 @@ |
+// Copyright 2014 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_MAC_SCOPED_TYPEREF_H_ |
+#define BASE_MAC_SCOPED_TYPEREF_H_ |
+ |
+#include "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_policy.h" |
+ |
+namespace base { |
+ |
+// ScopedTypeRef<> is patterend after scoped_ptr<>, but maintains a ownership |
+// of a reference to any type that is maintained by Retain and Release methods. |
+// |
+// For initialization with an existing object, the caller must specify whether |
+// the ScopedTypeRef<> being initialized is assuming the caller's existing |
+// ownership of the object (and should not call Retain in initialization) or if |
+// it should not assume this ownership and must create its own (by calling |
+// Retain in initialization). This behavior is based on the |policy| parameter, |
+// with |ASSUME| for the former and |RETAIN| for the latter. |
+// |
+// For the many types that have pass-by-pointer create functions, the function |
+// ptr_for_init() is provided to allow direct initialization and assumption of |
+// ownership of the object, e.g: |
+// |
+// base::ScopedTypeRef< |
+// CGLContextObj, CGLContextObj, CGLRetainContext, CGLReleaseContext> |
+// context; |
+// CGLCreateContext(pixel_format, share_group, context.ptr_for_init()); |
+// |
+// Note that the type taken by the Retain and Release methods, |R|, may be a |
+// subtype of the type being owned, |T|, and therefore needs to be |
+// parameterized separately. |
+ |
+template<typename T, typename R, R Retain(R), void Release(R)> |
+class ScopedTypeRef { |
+ public: |
+ typedef T element_type; |
+ |
+ ScopedTypeRef() : object_(NULL) {} |
+ |
+ ScopedTypeRef( |
+ T object, |
+ base::scoped_policy::OwnershipPolicy policy) |
Mark Mentovai
2014/02/07 17:22:08
Having a default policy here is kind of nice.
ccameron
2014/02/07 19:23:57
I've added this back ... but I didn't like the def
|
+ : object_(object) { |
+ if (object_ && policy == base::scoped_policy::RETAIN) |
+ Retain(object_); |
+ } |
+ |
+ ScopedTypeRef(const ScopedTypeRef<T, R, Retain, Release>& that) |
+ : object_(that.object_) { |
+ if (object_) |
+ Retain(object_); |
+ } |
+ |
+ virtual ~ScopedTypeRef() { |
+ if (object_) |
+ Release(object_); |
+ } |
+ |
+ ScopedTypeRef& operator=(const ScopedTypeRef<T, R, Retain, Release>& that) { |
+ reset(that.get(), base::scoped_policy::RETAIN); |
+ return *this; |
+ } |
+ |
+ // This is to be used only to take ownership of objects that are created |
+ // by pass-by-pointer create functions. To enforce this, require that the |
+ // object be reset to NULL before this may be used. |
+ T* ptr_for_init() WARN_UNUSED_RESULT { |
+ DCHECK(!object_); |
+ return &object_; |
+ } |
+ |
+ void reset(T object = NULL, |
+ base::scoped_policy::OwnershipPolicy policy = |
+ base::scoped_policy::ASSUME) { |
+ if (object && policy == base::scoped_policy::RETAIN) |
+ Retain(object); |
+ if (object_) |
+ Release(object_); |
+ object_ = object; |
+ } |
+ |
+ bool operator==(T that) const { |
+ return object_ == that; |
+ } |
+ |
+ bool operator!=(T that) const { |
+ return object_ != that; |
+ } |
+ |
+ operator T() const { |
+ return object_; |
+ } |
+ |
+ T get() const { |
+ return object_; |
+ } |
+ |
+ void swap(ScopedTypeRef& that) { |
+ T temp = that.object_; |
+ that.object_ = object_; |
+ object_ = temp; |
+ } |
+ |
+ // ScopedTypeRef<>::release() is like scoped_ptr<>::release. It is NOT |
+ // a wrapper for Release(). To force a ScopedTypeRef<> object to call |
+ // Release(), use ScopedTypeRef<>::reset(). |
+ T release() WARN_UNUSED_RESULT { |
+ T temp = object_; |
+ object_ = NULL; |
+ return temp; |
+ } |
+ |
+ private: |
+ T object_; |
+}; |
+ |
+} // namespace base |
+ |
+#endif // BASE_MAC_SCOPED_TYPEREF_H_ |