ndn-cxx: NDN C++ Library 0.9.0-33-g832ea91d
Loading...
Searching...
No Matches
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
34namespace ndn::detail {
35
48template<class T>
50{
51public: // 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
69 operator=(const T& typeRef)
70 {
71 if (typeRef != m_typeRef) {
72 release();
73 m_typeRef = typeRef;
74 }
75 return *this;
76 }
77
79 operator=(const CFReleaser& inReleaser)
80 {
81 retain(inReleaser.m_typeRef);
82 return *this;
83 }
84
86 {
87 release();
88 }
89
90public: // Access
91 const T&
92 get() const
93 {
94 return m_typeRef;
95 }
96
97 T&
99 {
100 return m_typeRef;
101 }
102
103public: // 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
131private: // 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
144private:
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(const T &typeRef)
CFReleaser & operator=(const CFReleaser &inReleaser)
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.