Home | History | Annotate | Download | only in mac
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_MAC_SCOPED_CFTYPEREF_H_
      6 #define BASE_MAC_SCOPED_CFTYPEREF_H_
      7 #pragma once
      8 
      9 #include <CoreFoundation/CoreFoundation.h>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 
     14 namespace base {
     15 namespace mac {
     16 
     17 // ScopedCFTypeRef<> is patterned after scoped_ptr<>, but maintains ownership
     18 // of a CoreFoundation object: any object that can be represented as a
     19 // CFTypeRef.  Style deviations here are solely for compatibility with
     20 // scoped_ptr<>'s interface, with which everyone is already familiar.
     21 //
     22 // When ScopedCFTypeRef<> takes ownership of an object (in the constructor or
     23 // in reset()), it takes over the caller's existing ownership claim.  The
     24 // caller must own the object it gives to ScopedCFTypeRef<>, and relinquishes
     25 // an ownership claim to that object.  ScopedCFTypeRef<> does not call
     26 // CFRetain().
     27 template<typename CFT>
     28 class ScopedCFTypeRef {
     29  public:
     30   typedef CFT element_type;
     31 
     32   explicit ScopedCFTypeRef(CFT object = NULL)
     33       : object_(object) {
     34   }
     35 
     36   ~ScopedCFTypeRef() {
     37     if (object_)
     38       CFRelease(object_);
     39   }
     40 
     41   void reset(CFT object = NULL) {
     42     if (object_)
     43       CFRelease(object_);
     44     object_ = object;
     45   }
     46 
     47   bool operator==(CFT that) const {
     48     return object_ == that;
     49   }
     50 
     51   bool operator!=(CFT that) const {
     52     return object_ != that;
     53   }
     54 
     55   operator CFT() const {
     56     return object_;
     57   }
     58 
     59   CFT get() const {
     60     return object_;
     61   }
     62 
     63   void swap(ScopedCFTypeRef& that) {
     64     CFT temp = that.object_;
     65     that.object_ = object_;
     66     object_ = temp;
     67   }
     68 
     69   // ScopedCFTypeRef<>::release() is like scoped_ptr<>::release.  It is NOT
     70   // a wrapper for CFRelease().  To force a ScopedCFTypeRef<> object to call
     71   // CFRelease(), use ScopedCFTypeRef<>::reset().
     72   CFT release() WARN_UNUSED_RESULT {
     73     CFT temp = object_;
     74     object_ = NULL;
     75     return temp;
     76   }
     77 
     78  private:
     79   CFT object_;
     80 
     81   DISALLOW_COPY_AND_ASSIGN(ScopedCFTypeRef);
     82 };
     83 
     84 }  // namespace mac
     85 }  // namespace base
     86 
     87 #endif  // BASE_MAC_SCOPED_CFTYPEREF_H_
     88