1731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef BASE_MAC_SCOPED_CFTYPEREF_H_ 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define BASE_MAC_SCOPED_CFTYPEREF_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <CoreFoundation/CoreFoundation.h> 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base { 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace mac { 16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// ScopedCFTypeRef<> is patterned after scoped_ptr<>, but maintains ownership 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// of a CoreFoundation object: any object that can be represented as a 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CFTypeRef. Style deviations here are solely for compatibility with 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// scoped_ptr<>'s interface, with which everyone is already familiar. 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// When ScopedCFTypeRef<> takes ownership of an object (in the constructor or 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in reset()), it takes over the caller's existing ownership claim. The 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// caller must own the object it gives to ScopedCFTypeRef<>, and relinquishes 25731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// an ownership claim to that object. ScopedCFTypeRef<> does not call 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CFRetain(). 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate<typename CFT> 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ScopedCFTypeRef { 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef CFT element_type; 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit ScopedCFTypeRef(CFT object = NULL) 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : object_(object) { 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~ScopedCFTypeRef() { 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (object_) 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFRelease(object_); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void reset(CFT object = NULL) { 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (object_) 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFRelease(object_); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott object_ = object; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool operator==(CFT that) const { 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return object_ == that; 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool operator!=(CFT that) const { 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return object_ != that; 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott operator CFT() const { 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return object_; 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFT get() const { 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return object_; 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void swap(ScopedCFTypeRef& that) { 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFT temp = that.object_; 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott that.object_ = object_; 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott object_ = temp; 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // ScopedCFTypeRef<>::release() is like scoped_ptr<>::release. It is NOT 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // a wrapper for CFRelease(). To force a ScopedCFTypeRef<> object to call 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // CFRelease(), use ScopedCFTypeRef<>::reset(). 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CFT release() WARN_UNUSED_RESULT { 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFT temp = object_; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott object_ = NULL; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return temp; 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CFT object_; 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DISALLOW_COPY_AND_ASSIGN(ScopedCFTypeRef); 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace mac 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace base 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif // BASE_MAC_SCOPED_CFTYPEREF_H_ 88