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-2017 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_UTIL_CF_RELEASER_OSX_HPP
23 #define NDN_UTIL_CF_RELEASER_OSX_HPP
24 
25 #include "../common.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 
33 namespace ndn {
34 namespace util {
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  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 
115 public: // Miscellaneous
116  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
128  {
129  T typeRef = m_typeRef;
130  m_typeRef = nullptr;
131  retain(typeRef);
132  }
133 
134  void
136  {
137  if (m_typeRef != nullptr) {
138  CFRelease(m_typeRef);
139  m_typeRef = nullptr;
140  }
141  }
142 
143 private:
144  T m_typeRef;
145 };
146 
147 } // namespace util
148 } // namespace ndn
149 
150 #endif // NDN_UTIL_CF_RELEASER_OSX_HPP
bool operator!=(const std::nullptr_t &)
Copyright (c) 2013-2017 Regents of the University of California.
Definition: common.hpp:66
CFReleaser(const T &typeRef)
CFReleaser & operator=(const T &typeRef)
Helper class to wrap CoreFoundation object pointers.
CFReleaser(const CFReleaser &inReleaser)
CFReleaser & operator=(const CFReleaser &inReleaser)
void retain(const T &typeRef)
bool operator==(const std::nullptr_t &)