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