diff options
author | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-23 15:15:29 +0000 |
---|---|---|
committer | mark@chromium.org <mark@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-23 15:15:29 +0000 |
commit | 199535dd2ca0210a5c69d35e43f0432d8638f407 (patch) | |
tree | 9da3d26446556b4493a366d6e4d440115a00ff15 /base/scoped_nsobject.h | |
parent | e28c2cf908cf2e232329ce9431b68a4b8e4287a6 (diff) | |
download | chromium_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.h | 75 |
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_ |