cf-releaser-osx.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2024 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
22 #ifndef NDN_CXX_DETAIL_CF_RELEASER_OSX_HPP
23 #define NDN_CXX_DETAIL_CF_RELEASER_OSX_HPP
24 
25 #include "ndn-cxx/detail/config.hpp"
26 
27 #ifndef NDN_CXX_HAVE_OSX_FRAMEWORKS
28 #error "This file should not be included ..."
29 #endif
30 
31 #include <CoreFoundation/CoreFoundation.h>
32 #include <cstddef>
33 
34 namespace ndn::detail {
35 
48 template<class T>
50 {
51 public: // Construction/destruction
53  : m_typeRef(nullptr)
54  {
55  }
56 
57  CFReleaser(const T& typeRef)
58  : m_typeRef(typeRef)
59  {
60  }
61 
62  CFReleaser(const CFReleaser& inReleaser)
63  : m_typeRef(nullptr)
64  {
65  retain(inReleaser.m_typeRef);
66  }
67 
68  CFReleaser&
69  operator=(const T& typeRef)
70  {
71  if (typeRef != m_typeRef) {
72  release();
73  m_typeRef = typeRef;
74  }
75  return *this;
76  }
77 
78  CFReleaser&
79  operator=(const CFReleaser& inReleaser)
80  {
81  retain(inReleaser.m_typeRef);
82  return *this;
83  }
84 
86  {
87  release();
88  }
89 
90 public: // Access
91  const T&
92  get() const
93  {
94  return m_typeRef;
95  }
96 
97  T&
98  get()
99  {
100  return m_typeRef;
101  }
102 
103 public: // Miscellaneous
104  void
105  retain(const T& typeRef)
106  {
107  if (typeRef != nullptr) {
108  CFRetain(typeRef);
109  }
110  release();
111  m_typeRef = typeRef;
112  }
113 
114  void
116  {
117  T typeRef = m_typeRef;
118  m_typeRef = nullptr;
119  retain(typeRef);
120  }
121 
122  void
124  {
125  if (m_typeRef != nullptr) {
126  CFRelease(m_typeRef);
127  m_typeRef = nullptr;
128  }
129  }
130 
131 private: // Comparison with nullptr
132  friend bool
133  operator==(const CFReleaser& lhs, std::nullptr_t)
134  {
135  return lhs.m_typeRef == nullptr;
136  }
137 
138  friend bool
139  operator!=(const CFReleaser& lhs, std::nullptr_t)
140  {
141  return lhs.m_typeRef != nullptr;
142  }
143 
144 private:
145  T m_typeRef;
146 };
147 
148 } // namespace ndn::detail
149 
150 #endif // NDN_CXX_DETAIL_CF_RELEASER_OSX_HPP
Helper class to wrap CoreFoundation object pointers.
CFReleaser & operator=(const T &typeRef)
friend bool operator==(const CFReleaser &lhs, std::nullptr_t)
CFReleaser & operator=(const CFReleaser &inReleaser)
CFReleaser(const T &typeRef)
CFReleaser(const CFReleaser &inReleaser)
void retain(const T &typeRef)
friend bool operator!=(const CFReleaser &lhs, std::nullptr_t)
Contains implementation details that are not part of the ndn-cxx public API.