Home | History | Annotate | Download | only in MacOSX
      1 //===-- CFUtils.h -----------------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  Created by Greg Clayton on 3/5/07.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef __CFUtils_h__
     15 #define __CFUtils_h__
     16 
     17 #include <CoreFoundation/CoreFoundation.h>
     18 
     19 #ifdef __cplusplus
     20 
     21 //----------------------------------------------------------------------
     22 // Templatized CF helper class that can own any CF pointer and will
     23 // call CFRelease() on any valid pointer it owns unless that pointer is
     24 // explicitly released using the release() member function.
     25 //----------------------------------------------------------------------
     26 template <class T>
     27 class CFReleaser
     28 {
     29 public:
     30             // Type names for the avlue
     31             typedef T element_type;
     32 
     33             // Constructors and destructors
     34             CFReleaser(T ptr = NULL) : _ptr(ptr) { }
     35             CFReleaser(const CFReleaser& copy) : _ptr(copy.get())
     36             {
     37                 if (get())
     38                     ::CFRetain(get());
     39             }
     40             virtual ~CFReleaser() { reset(); }
     41 
     42             // Assignments
     43             CFReleaser& operator= (const CFReleaser<T>& copy)
     44             {
     45                 if (copy != *this)
     46                 {
     47                     // Replace our owned pointer with the new one
     48                     reset(copy.get());
     49                     // Retain the current pointer that we own
     50                     if (get())
     51                         ::CFRetain(get());
     52                 }
     53             }
     54             // Get the address of the contained type
     55             T *     ptr_address()   { return &_ptr; }
     56 
     57             // Access the pointer itself
     58     const   T       get() const     { return _ptr;  }
     59             T       get()           { return _ptr;  }
     60 
     61             // Set a new value for the pointer and CFRelease our old
     62             // value if we had a valid one.
     63             void    reset(T ptr = NULL)
     64                     {
     65                         if (ptr != _ptr)
     66                         {
     67                             if (_ptr != NULL)
     68                                 ::CFRelease(_ptr);
     69                             _ptr = ptr;
     70                         }
     71                     }
     72 
     73             // Release ownership without calling CFRelease
     74             T    release() { T tmp = _ptr; _ptr = NULL; return tmp; }
     75 private:
     76     element_type _ptr;
     77 };
     78 
     79 #endif    // #ifdef __cplusplus
     80 #endif    // #ifndef __CFUtils_h__
     81 
     82