blob: 61afebac36bde7305630f998f76fbc02e3a87ba0 [file] [log] [blame]
Yingdi Yu0b60e7a2015-07-16 21:05:11 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Alexander Afanasyev0cf887d2017-03-26 16:58:59 -05003 * Copyright (c) 2013-2017 Regents of the University of California.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -07004 *
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
Junxiao Shi0b1b4672017-07-02 22:02:31 -070022#ifndef NDN_UTIL_CF_RELEASER_OSX_HPP
23#define NDN_UTIL_CF_RELEASER_OSX_HPP
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070024
Junxiao Shi0b1b4672017-07-02 22:02:31 -070025#include "../common.hpp"
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070026
Alexander Afanasyev0cf887d2017-03-26 16:58:59 -050027#ifndef NDN_CXX_HAVE_OSX_FRAMEWORKS
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070028#error "This file should not be included ..."
29#endif
30
31#include <CoreFoundation/CoreFoundation.h>
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070032
33namespace ndn {
Junxiao Shi0b1b4672017-07-02 22:02:31 -070034namespace util {
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070035
36/**
37 * @brief Helper class to wrap CoreFoundation object pointers
38 *
39 * The class is similar in spirit to shared_ptr, but uses CoreFoundation
40 * mechanisms to retain/release object.
41 *
42 * Original implementation by Christopher Hunt and it was borrowed from
43 * http://www.cocoabuilder.com/archive/cocoa/130776-auto-cfrelease-and.html
Junxiao Shi0b1b4672017-07-02 22:02:31 -070044 *
45 * @note The filename cf-releaser-osx.hpp is an intentional violation of code-style rule 2.1.
46 * Having '-osx' suffix is necessary to prevent installation on non-macOS platforms.
Yingdi Yu0b60e7a2015-07-16 21:05:11 -070047 */
48template<class T>
49class CFReleaser
50{
51public: // Construction/destruction
52 CFReleaser()
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
85 ~CFReleaser()
86 {
87 release();
88 }
89
90public: // 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 bool
104 operator==(const std::nullptr_t&)
105 {
106 return m_typeRef == nullptr;
107 }
108
109 bool
110 operator!=(const std::nullptr_t&)
111 {
112 return m_typeRef != nullptr;
113 }
114
Junxiao Shi0b1b4672017-07-02 22:02:31 -0700115public: // Miscellaneous
Yingdi Yu0b60e7a2015-07-16 21:05:11 -0700116 void
117 retain(const T& typeRef)
118 {
119 if (typeRef != nullptr) {
120 CFRetain(typeRef);
121 }
122 release();
123 m_typeRef = typeRef;
124 }
125
126 void
127 retain()
128 {
129 T typeRef = m_typeRef;
130 m_typeRef = nullptr;
131 retain(typeRef);
132 }
133
134 void
135 release()
136 {
137 if (m_typeRef != nullptr) {
138 CFRelease(m_typeRef);
139 m_typeRef = nullptr;
140 }
141 };
142
143private:
144 T m_typeRef;
145};
146
Junxiao Shi0b1b4672017-07-02 22:02:31 -0700147} // namespace util
Yingdi Yu0b60e7a2015-07-16 21:05:11 -0700148} // namespace ndn
149
Junxiao Shi0b1b4672017-07-02 22:02:31 -0700150#endif // NDN_UTIL_CF_RELEASER_OSX_HPP