summaryrefslogtreecommitdiffstats
path: root/base/scoped_nsobject.h
diff options
context:
space:
mode:
authormark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-23 15:15:29 +0000
committermark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-23 15:15:29 +0000
commit199535dd2ca0210a5c69d35e43f0432d8638f407 (patch)
tree9da3d26446556b4493a366d6e4d440115a00ff15 /base/scoped_nsobject.h
parente28c2cf908cf2e232329ce9431b68a4b8e4287a6 (diff)
downloadchromium_src-199535dd2ca0210a5c69d35e43f0432d8638f407.zip
chromium_src-199535dd2ca0210a5c69d35e43f0432d8638f407.tar.gz
chromium_src-199535dd2ca0210a5c69d35e43f0432d8638f407.tar.bz2
Add scoped_nsobject to help handle ownership of NSObject subclass objects by
C++ code. Review URL: http://codereview.chromium.org/52014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12283 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/scoped_nsobject.h')
-rw-r--r--base/scoped_nsobject.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/base/scoped_nsobject.h b/base/scoped_nsobject.h
new file mode 100644
index 0000000..f5a24ef
--- /dev/null
+++ b/base/scoped_nsobject.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2009 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_SCOPED_NSOBJECT_H_
+#define BASE_SCOPED_NSOBJECT_H_
+
+#import <Foundation/Foundation.h>
+
+// scoped_nsobject<> is patterned after scoped_ptr<>, but maintains ownership
+// of an NSObject subclass object. Style deviations here are solely for
+// compatibility scoped_ptr<>'s interface, with which everyone is already
+// familiar.
+//
+// When scoped_nsobject<> takes ownership of an object (in the constructor or
+// in reset()), it takes over the caller's existing ownership claim. The
+// caller must own the object. scoped_nsobject<> does not call -retain.
+template<typename NST>
+class scoped_nsobject {
+ public:
+ typedef NST* element_type;
+
+ explicit scoped_nsobject(NST* object = nil)
+ : object_(object) {
+ }
+
+ ~scoped_nsobject() {
+ [object_ release];
+ }
+
+ void reset(NST* object = nil) {
+ if (object_ != object) {
+ [object_ release];
+ object_ = object;
+ }
+ }
+
+ bool operator==(NST* that) const {
+ return object_ == that;
+ }
+
+ bool operator!=(NST* that) const {
+ return object_ != that;
+ }
+
+ operator NST*() const {
+ return object_;
+ }
+
+ NST* get() const {
+ return object_;
+ }
+
+ void swap(scoped_nsobject& that) {
+ NST* temp = that.object_;
+ that.object_ = object_;
+ object_ = temp;
+ }
+
+ // scoped_nsobject<>::release() is like scoped_ptr<>::release. It is NOT
+ // a wrapper for [object_ release]. To force a scoped_nsobject<> object to
+ // call [object_ release], use scoped_nsobject<>::reset().
+ NST* release() {
+ NST* temp = object_;
+ object_ = nil;
+ return temp;
+ }
+
+ private:
+ NST* object_;
+
+ DISALLOW_COPY_AND_ASSIGN(scoped_nsobject);
+};
+
+#endif // BASE_SCOPED_NSOBJECT_H_