xref: /llvm-project/lldb/tools/debugserver/source/MacOSX/CFUtils.h (revision d21ec35dcf3c351395522807beac0f45b7bcf6b9)
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 LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_CFUTILS_H
14 #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_CFUTILS_H
15 
16 #include <CoreFoundation/CoreFoundation.h>
17 
18 // Templatized CF helper class that can own any CF pointer and will
19 // call CFRelease() on any valid pointer it owns unless that pointer is
20 // explicitly released using the release() member function.
21 template <class T> class CFReleaser {
22 public:
23   // Type names for the value
24   typedef T element_type;
25 
26   // Constructors and destructors
_ptr(ptr)27   CFReleaser(T ptr = NULL) : _ptr(ptr) {}
CFReleaser(const CFReleaser & copy)28   CFReleaser(const CFReleaser &copy) : _ptr(copy.get()) {
29     if (get())
30       ::CFRetain(get());
31   }
~CFReleaser()32   virtual ~CFReleaser() { reset(); }
33 
34   // Assignments
35   CFReleaser &operator=(const CFReleaser<T> &copy) {
36     if (copy != *this) {
37       // Replace our owned pointer with the new one
38       reset(copy.get());
39       // Retain the current pointer that we own
40       if (get())
41         ::CFRetain(get());
42     }
43   }
44   // Get the address of the contained type
ptr_address()45   T *ptr_address() { return &_ptr; }
46 
47   // Access the pointer itself
get()48   const T get() const { return _ptr; }
get()49   T get() { return _ptr; }
50 
51   // Set a new value for the pointer and CFRelease our old
52   // value if we had a valid one.
53   void reset(T ptr = NULL) {
54     if (ptr != _ptr) {
55       if (_ptr != NULL)
56         ::CFRelease(_ptr);
57       _ptr = ptr;
58     }
59   }
60 
61   // Release ownership without calling CFRelease
release()62   T release() {
63     T tmp = _ptr;
64     _ptr = NULL;
65     return tmp;
66   }
67 
68 private:
69   element_type _ptr;
70 };
71 
72 #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_CFUTILS_H
73