xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/MacOSX/CFUtils.h (revision 1a8dbaac879b9f3335ad7fb25429ce63ac1d6bac)
1 //===-- CFUtils.h -----------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  Created by Greg Clayton on 3/5/07.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef __CFUtils_h__
14 #define __CFUtils_h__
15 
16 #include <CoreFoundation/CoreFoundation.h>
17 
18 #ifdef __cplusplus
19 
20 // Templatized CF helper class that can own any CF pointer and will
21 // call CFRelease() on any valid pointer it owns unless that pointer is
22 // explicitly released using the release() member function.
23 template <class T> class CFReleaser {
24 public:
25   // Type names for the avlue
26   typedef T element_type;
27 
28   // Constructors and destructors
29   CFReleaser(T ptr = NULL) : _ptr(ptr) {}
30   CFReleaser(const CFReleaser &copy) : _ptr(copy.get()) {
31     if (get())
32       ::CFRetain(get());
33   }
34   virtual ~CFReleaser() { reset(); }
35 
36   // Assignments
37   CFReleaser &operator=(const CFReleaser<T> &copy) {
38     if (copy != *this) {
39       // Replace our owned pointer with the new one
40       reset(copy.get());
41       // Retain the current pointer that we own
42       if (get())
43         ::CFRetain(get());
44     }
45   }
46   // Get the address of the contained type
47   T *ptr_address() { return &_ptr; }
48 
49   // Access the pointer itself
50   const T get() const { return _ptr; }
51   T get() { return _ptr; }
52 
53   // Set a new value for the pointer and CFRelease our old
54   // value if we had a valid one.
55   void reset(T ptr = NULL) {
56     if (ptr != _ptr) {
57       if (_ptr != NULL)
58         ::CFRelease(_ptr);
59       _ptr = ptr;
60     }
61   }
62 
63   // Release ownership without calling CFRelease
64   T release() {
65     T tmp = _ptr;
66     _ptr = NULL;
67     return tmp;
68   }
69 
70 private:
71   element_type _ptr;
72 };
73 
74 #endif // #ifdef __cplusplus
75 #endif // #ifndef __CFUtils_h__
76