blob: afa984fa11cd386e76b99cbabf57b0bec936290b [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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//----------------------------------------------------------------------
26template <class T>
27class CFReleaser
28{
29public:
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; }
75private:
76 element_type _ptr;
77};
78
79#endif // #ifdef __cplusplus
80#endif // #ifndef __CFUtils_h__
81