Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
Toggle main menu visibility
Loading...
Searching...
No Matches
shared_ptr.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2015 Roc Streaming authors
3
*
4
* This Source Code Form is subject to the terms of the Mozilla Public
5
* License, v. 2.0. If a copy of the MPL was not distributed with this
6
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
*/
8
9
//! @file roc_core/shared_ptr.h
10
//! @brief Shared ownership intrusive pointer.
11
12
#ifndef ROC_CORE_SHARED_PTR_H_
13
#define ROC_CORE_SHARED_PTR_H_
14
15
#include "
roc_core/ownership_policy.h
"
16
#include "
roc_core/panic.h
"
17
#include "
roc_core/stddefs.h
"
18
19
namespace
roc
{
20
namespace
core
{
21
22
//! Shared ownership intrusive pointer.
23
//!
24
//! @tparam T defines pointee type. It may be const.
25
//!
26
//! @tparam OwnershipPolicy defines ownwership policy. It provides methods to
27
//! increase and decrease the reference counter embedded into object.
28
//!
29
//! If RefCountedOwnership is used, T should inherit RefCounted. A template
30
//! parameter of RefCounted defines its (de)allocation policy.
31
template
<
class
T,
template
<
class
TT>
class
OwnershipPolicy =
RefCountedOwnership
>
32
class
SharedPtr
{
33
public
:
34
//! Create empty shared pointer.
35
//! @remarks
36
//! This overload is a bit faster than SharedPtr(NULL).
37
SharedPtr
()
38
: ptr_(NULL) {
39
}
40
41
//! Create shared pointer from raw pointer.
42
//! @remarks
43
//! This overload hits SharedPtr(NULL) and SharedPtr(T).
44
SharedPtr
(T* ptr)
45
: ptr_(ptr) {
46
acquire_();
47
}
48
49
//! Create shared pointer from shared pointer of the same type.
50
//! @remarks
51
//! This is a copy constructor.
52
SharedPtr
(
const
SharedPtr
& other)
53
: ptr_(other.ptr_) {
54
acquire_();
55
}
56
57
//! Create shared pointer from shared pointer of another type.
58
//! @remarks
59
//! - This overload hits SharedPtr(SharedPtr<ConvertibleToT>).
60
//! - This doesn't work as a copy constructor since it's template.
61
template
<
class
TT>
62
SharedPtr
(
const
SharedPtr<TT, OwnershipPolicy>
& other)
63
: ptr_(other.
get
()) {
64
acquire_();
65
}
66
67
//! Destroy shared pointer.
68
~SharedPtr
() {
69
release_();
70
}
71
72
//! Reset shared pointer and attach it to another object.
73
SharedPtr
&
operator=
(
const
SharedPtr
& other) {
74
reset
(other.ptr_);
75
return
*
this
;
76
}
77
78
//! Reset shared pointer and attach it to another object.
79
void
reset
(
const
SharedPtr
& other) {
80
reset
(other.ptr_);
81
}
82
83
//! Reset shared pointer and attach it to another object.
84
void
reset
(T* ptr = NULL) {
85
if
(ptr != ptr_) {
86
release_();
87
ptr_ = ptr;
88
acquire_();
89
}
90
}
91
92
//! Get underlying pointer.
93
T*
get
()
const
{
94
return
ptr_;
95
}
96
97
//! Get underlying pointer.
98
T*
operator->
()
const
{
99
if
(ptr_ == NULL) {
100
roc_panic
(
"shared ptr: attempt to dereference null pointer"
);
101
}
102
return
ptr_;
103
}
104
105
//! Get underlying reference.
106
T&
operator*
()
const
{
107
if
(ptr_ == NULL) {
108
roc_panic
(
"shared ptr: attempt to dereference null pointer"
);
109
}
110
return
*ptr_;
111
}
112
113
//! Convert to bool.
114
operator
const
struct
unspecified_bool *()
const
{
115
return
(
const
unspecified_bool*)ptr_;
116
}
117
118
private
:
119
void
acquire_() {
120
if
(ptr_ != NULL) {
121
OwnershipPolicy<T>::acquire(*ptr_);
122
}
123
}
124
125
void
release_() {
126
if
(ptr_ != NULL) {
127
OwnershipPolicy<T>::release(*ptr_);
128
}
129
}
130
131
T* ptr_;
132
};
133
134
//! Equality check.
135
template
<
class
T1,
class
T2>
136
inline
bool
operator==
(
const
SharedPtr<T1>
& a,
const
SharedPtr<T2>
& b) {
137
return
a.
get
() == b.
get
();
138
}
139
140
//! Equality check.
141
template
<
class
T1,
class
T2>
142
inline
bool
operator!=
(
const
SharedPtr<T1>
& a,
const
SharedPtr<T2>
& b) {
143
return
a.
get
() != b.
get
();
144
}
145
146
}
// namespace core
147
}
// namespace roc
148
149
#endif
// ROC_CORE_SHARED_PTR_H_
roc::core::SharedPtr
Shared ownership intrusive pointer.
Definition
shared_ptr.h:32
roc::core::SharedPtr::SharedPtr
SharedPtr(const SharedPtr< TT, OwnershipPolicy > &other)
Create shared pointer from shared pointer of another type.
Definition
shared_ptr.h:62
roc::core::SharedPtr::~SharedPtr
~SharedPtr()
Destroy shared pointer.
Definition
shared_ptr.h:68
roc::core::SharedPtr< Buffer >::get
Buffer * get() const
Definition
shared_ptr.h:93
roc::core::SharedPtr::SharedPtr
SharedPtr(const SharedPtr &other)
Create shared pointer from shared pointer of the same type.
Definition
shared_ptr.h:52
roc::core::SharedPtr::reset
void reset(T *ptr=NULL)
Reset shared pointer and attach it to another object.
Definition
shared_ptr.h:84
roc::core::SharedPtr::reset
void reset(const SharedPtr &other)
Reset shared pointer and attach it to another object.
Definition
shared_ptr.h:79
roc::core::SharedPtr::operator=
SharedPtr & operator=(const SharedPtr &other)
Reset shared pointer and attach it to another object.
Definition
shared_ptr.h:73
roc::core::SharedPtr::operator->
T * operator->() const
Get underlying pointer.
Definition
shared_ptr.h:98
roc::core::SharedPtr::SharedPtr
SharedPtr()
Create empty shared pointer.
Definition
shared_ptr.h:37
roc::core::SharedPtr::SharedPtr
SharedPtr(T *ptr)
Create shared pointer from raw pointer.
Definition
shared_ptr.h:44
roc::core::SharedPtr::operator*
T & operator*() const
Get underlying reference.
Definition
shared_ptr.h:106
roc::core
General-purpose building blocks and platform abstraction layer.
roc::core::operator!=
bool operator!=(const SharedPtr< T1 > &a, const SharedPtr< T2 > &b)
Equality check.
Definition
shared_ptr.h:142
roc::core::operator==
bool operator==(const SharedPtr< T1 > &a, const SharedPtr< T2 > &b)
Equality check.
Definition
shared_ptr.h:136
roc
Root namespace.
ownership_policy.h
Ownership policies.
panic.h
Panic.
roc_panic
#define roc_panic(...)
Print error message and terminate program gracefully.
Definition
panic.h:50
stddefs.h
Commonly used types and functions.
roc::core::RefCountedOwnership
Reference counted object ownership.
Definition
ownership_policy.h:21
roc_core
shared_ptr.h
Generated by
1.17.0