RflySimSDK v3.05
RflySimSDK说明文档
载入中...
搜索中...
未找到
vrpn_OwningPtr.h
浏览该文件的文档.
1
12// Copyright Sensics 2016.
13// Distributed under the Boost Software License, Version 1.0.
14// (See accompanying file LICENSE_1_0.txt or copy at
15// http://www.boost.org/LICENSE_1_0.txt)
16
17#ifndef INCLUDED_vrpn_OwningPtr_h_GUID_A2A96325_1863_458B_A567_6FD968CB1321
18#define INCLUDED_vrpn_OwningPtr_h_GUID_A2A96325_1863_458B_A567_6FD968CB1321
19
20// Internal Includes
21#include "vrpn_Assert.h"
22
23// Library/third-party includes
24// - none
25
26// Standard includes
27#include <utility>
28#include <iostream>
29
30namespace vrpn {
31
33 template <typename T> struct DefaultDeleter {
34 void operator()(T* ptr) const {
35 try {
36 delete ptr;
37 } catch (...) {
38 std::cerr << "DefaultDeleter: delete failed" << std::endl;;
39 return;
40 }
41 }
42 };
44 template <typename T> struct DefaultDeleter<T[]> {
45 void operator()(T* ptr) const {
46 try {
47 delete[] ptr;
48 } catch (...) {
49 std::cerr << "DefaultDeleter: delete failed" << std::endl;;
50 return;
51 }
52 }
53 };
54 namespace traits {
56 template <typename T> struct OwningPtrPointerType {
57 typedef T* type;
58 };
60 template <typename T> struct OwningPtrPointerType<T[]> {
61 typedef T* type;
62 };
63 } // namespace traits
64
74 template <typename T, typename D = DefaultDeleter<T> > class OwningPtr {
75 public:
76 typedef T element_type;
77 typedef T& reference_type;
78 typedef D deleter_type;
79 typedef typename traits::OwningPtrPointerType<T>::type pointer;
80 typedef OwningPtr<T, D> type;
81
84 : p_(NULL)
85 {
86 }
87
90 explicit OwningPtr(pointer p)
91 : p_(p)
92 {
93 }
94
97
100 void reset(pointer p = pointer())
101 {
102 pointer oldPtr(p_);
103 p_ = p;
104 if (oldPtr) {
105 invokeDeleter(oldPtr);
106 }
107 }
108
110 pointer release()
111 {
112 pointer ret(p_);
113 p_ = NULL;
114 return ret;
115 }
116
118 void swap(type& other) { std::swap(p_, other.p_); }
119
121 pointer get() const { return p_; }
122
124 pointer operator->() const
125 {
127 "attempt to use operator-> on a null pointer");
128 return p_;
129 }
130
132 reference_type operator*() const
133 {
135 "attempt to use operator* on a null pointer");
136 return *p_;
137 }
138
140 bool valid() const { return p_ != NULL; }
141
144 typedef pointer type::*unspecified_bool_type;
145 operator unspecified_bool_type() const
146 {
147 return valid() ? &type::p_ : NULL;
148 }
150
152 bool operator!() const { return !valid(); }
153
154 private:
157 void invokeDeleter(pointer p) { deleter_type()(p); }
158 // non-copyable
159 OwningPtr(OwningPtr const&);
160 // Non-assignable
161 OwningPtr& operator=(OwningPtr const&);
162
164 pointer p_;
165 };
166
167 template <typename T, typename D>
168 inline void swap(OwningPtr<T, D>& lhs, OwningPtr<T, D>& rhs)
169 {
170 lhs.swap(rhs);
171 }
172
173 template <typename T, typename D>
174 inline typename traits::OwningPtrPointerType<T>::type
175 get_pointer(OwningPtr<T, D> const& ptr)
176 {
177 return ptr.get();
178 }
179
180 template <typename T, typename D1, typename D2>
181 inline bool operator==(OwningPtr<T, D1> const& lhs,
182 OwningPtr<T, D2> const& rhs)
183 {
184 return lhs.get() == rhs.get();
185 }
186
187 template <typename T, typename D>
188 inline bool operator==(OwningPtr<T, D> const& lhs,
189 typename traits::OwningPtrPointerType<T>::type rhs)
190 {
191 return lhs.get() == rhs;
192 }
193
194 template <typename T, typename D>
195 inline bool operator==(typename traits::OwningPtrPointerType<T>::type lhs,
196 OwningPtr<T, D> const& rhs)
197 {
198 return lhs == rhs.get();
199 }
200
201 template <typename T, typename D1, typename D2>
202 inline bool operator!=(OwningPtr<T, D1> const& lhs,
203 OwningPtr<T, D2> const& rhs)
204 {
205 return lhs.get() != rhs.get();
206 }
207 template <typename T, typename D>
208 inline bool operator!=(OwningPtr<T, D> const& lhs,
209 typename traits::OwningPtrPointerType<T>::type rhs)
210 {
211 return lhs.get() != rhs;
212 }
213
214 template <typename T, typename D>
215 inline bool operator!=(typename traits::OwningPtrPointerType<T>::type lhs,
216 OwningPtr<T, D> const& rhs)
217 {
218 return lhs != rhs.get();
219 }
220} // namespace vrpn
221
222#endif // INCLUDED_vrpn_OwningPtr_h_GUID_A2A96325_1863_458B_A567_6FD968CB1321
定义 vrpn_OwningPtr.h:74
~OwningPtr()
Destructor: deletes owned object, if any.
定义 vrpn_OwningPtr.h:96
pointer release()
Returns the held pointer without performing the delete action.
定义 vrpn_OwningPtr.h:110
bool valid() const
Checks pointer validity
定义 vrpn_OwningPtr.h:140
OwningPtr(pointer p)
定义 vrpn_OwningPtr.h:90
bool operator!() const
Redundant way of checking pointer validity
定义 vrpn_OwningPtr.h:152
reference_type operator*() const
Smart pointer operator
定义 vrpn_OwningPtr.h:132
OwningPtr()
Construct empty.
定义 vrpn_OwningPtr.h:83
void reset(pointer p=pointer())
定义 vrpn_OwningPtr.h:100
void swap(type &other)
Swap pointers with another OwningPtr of the same type.
定义 vrpn_OwningPtr.h:118
pointer get() const
Gets pointer value
定义 vrpn_OwningPtr.h:121
pointer operator->() const
Smart pointer operator overload
定义 vrpn_OwningPtr.h:124
default deleter
定义 vrpn_OwningPtr.h:33
Default trait.
定义 vrpn_OwningPtr.h:56
Header for assert macros.
#define VRPN_ASSERT_MSG(expr, msg)
Like VRPN_ASSERT(expr) but allows specification of a message to be included in the case of a failed a...
定义 vrpn_Assert.h:153