vrpn
07.35
Virtual Reality Peripheral Network
Toggle main menu visibility
Loading...
Searching...
No Matches
vrpn_OwningPtr.h
Go to the documentation of this file.
1
11
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
30
namespace
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
};
43
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
};
59
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
83
OwningPtr
()
84
: p_(NULL)
85
{
86
}
87
90
explicit
OwningPtr
(
pointer
p)
91
: p_(p)
92
{
93
}
94
96
~OwningPtr
() {
reset
(); }
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
{
126
VRPN_ASSERT_MSG
(
valid
(),
127
"attempt to use operator-> on a null pointer"
);
128
return
p_;
129
}
130
132
reference_type
operator*
()
const
133
{
134
VRPN_ASSERT_MSG
(
valid
(),
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
}
149
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
A unique-ownership smart pointer, with the ability to transfer ownership, but only explicitly (aka,...
Definition
vrpn_OwningPtr.h:74
vrpn::OwningPtr::get
pointer get() const
Gets pointer value.
Definition
vrpn_OwningPtr.h:121
vrpn::OwningPtr::operator->
pointer operator->() const
Smart pointer operator overload.
Definition
vrpn_OwningPtr.h:124
vrpn::OwningPtr::pointer
traits::OwningPtrPointerType< T >::type pointer
Definition
vrpn_OwningPtr.h:79
vrpn::OwningPtr::OwningPtr
OwningPtr()
Construct empty.
Definition
vrpn_OwningPtr.h:83
vrpn::OwningPtr< T, D >::unspecified_bool_type
pointer type::* unspecified_bool_type
Definition
vrpn_OwningPtr.h:144
vrpn::OwningPtr::operator!
bool operator!() const
Redundant way of checking pointer validity.
Definition
vrpn_OwningPtr.h:152
vrpn::OwningPtr::reset
void reset(pointer p=pointer())
Deletes the owned object, if any, and takes ownership of a new object, if one is passed.
Definition
vrpn_OwningPtr.h:100
vrpn::OwningPtr::deleter_type
D deleter_type
Definition
vrpn_OwningPtr.h:78
vrpn::OwningPtr::OwningPtr
OwningPtr(pointer p)
Construct with a raw pointer for a new object to take exclusive ownership of.
Definition
vrpn_OwningPtr.h:90
vrpn::OwningPtr::swap
void swap(type &other)
Swap pointers with another OwningPtr of the same type.
Definition
vrpn_OwningPtr.h:118
vrpn::OwningPtr::~OwningPtr
~OwningPtr()
Destructor: deletes owned object, if any.
Definition
vrpn_OwningPtr.h:96
vrpn::OwningPtr::type
OwningPtr< T, D > type
Definition
vrpn_OwningPtr.h:80
vrpn::OwningPtr::element_type
T element_type
Definition
vrpn_OwningPtr.h:76
vrpn::OwningPtr::reference_type
T & reference_type
Definition
vrpn_OwningPtr.h:77
vrpn::OwningPtr::operator*
reference_type operator*() const
Smart pointer operator.
Definition
vrpn_OwningPtr.h:132
vrpn::OwningPtr::valid
bool valid() const
Checks pointer validity.
Definition
vrpn_OwningPtr.h:140
vrpn::OwningPtr::release
pointer release()
Returns the held pointer without performing the delete action.
Definition
vrpn_OwningPtr.h:110
vrpn::traits
Definition
vrpn_OwningPtr.h:54
vrpn
Definition
vrpn_Assert.C:25
vrpn::get_pointer
traits::OwningPtrPointerType< T >::type get_pointer(OwningPtr< T, D > const &ptr)
Definition
vrpn_OwningPtr.h:175
vrpn::swap
void swap(OwningPtr< T, D > &lhs, OwningPtr< T, D > &rhs)
Definition
vrpn_OwningPtr.h:168
vrpn::operator==
bool operator==(OwningPtr< T, D1 > const &lhs, OwningPtr< T, D2 > const &rhs)
Definition
vrpn_OwningPtr.h:181
vrpn::operator!=
bool operator!=(OwningPtr< T, D1 > const &lhs, OwningPtr< T, D2 > const &rhs)
Definition
vrpn_OwningPtr.h:202
vrpn::DefaultDeleter< T[]>::operator()
void operator()(T *ptr) const
Definition
vrpn_OwningPtr.h:45
vrpn::DefaultDeleter
default deleter
Definition
vrpn_OwningPtr.h:33
vrpn::DefaultDeleter::operator()
void operator()(T *ptr) const
Definition
vrpn_OwningPtr.h:34
vrpn::traits::OwningPtrPointerType< T[]>::type
T * type
Definition
vrpn_OwningPtr.h:61
vrpn::traits::OwningPtrPointerType
Default trait.
Definition
vrpn_OwningPtr.h:56
vrpn::traits::OwningPtrPointerType::type
T * type
Definition
vrpn_OwningPtr.h:57
vrpn_Assert.h
Header for assert macros.
VRPN_ASSERT_MSG
#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...
Definition
vrpn_Assert.h:153
vrpn_OwningPtr.h
Generated by
1.17.0