Minetest 5.9.0-dev
 
Loading...
Searching...
No Matches
irr_ptr.h
Go to the documentation of this file.
1/*
2Minetest
3Copyright (C) 2018 numzero, Lobachevskiy Vitaliy <numzer0@yandex.ru>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation; either version 2.1 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU Lesser General Public License for more details.
14
15You should have received a copy of the GNU Lesser General Public License along
16with this program; if not, write to the Free Software Foundation, Inc.,
1751 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19
20#pragma once
21#include <type_traits>
22#include <utility>
23#include "irrlichttypes.h"
24#include "IReferenceCounted.h"
25
40template <class ReferenceCounted,
41 class = typename std::enable_if<std::is_base_of<IReferenceCounted,
42 ReferenceCounted>::value>::type>
44{
45 ReferenceCounted *value = nullptr;
46
47public:
49
50 irr_ptr(std::nullptr_t) noexcept {}
51
52 irr_ptr(const irr_ptr &b) noexcept { grab(b.get()); }
53
54 irr_ptr(irr_ptr &&b) noexcept { reset(b.release()); }
55
56 template <typename B, class = typename std::enable_if<std::is_convertible<B *,
57 ReferenceCounted *>::value>::type>
58 irr_ptr(const irr_ptr<B> &b) noexcept
59 {
60 grab(b.get());
61 }
62
63 template <typename B, class = typename std::enable_if<std::is_convertible<B *,
64 ReferenceCounted *>::value>::type>
65 irr_ptr(irr_ptr<B> &&b) noexcept
66 {
67 reset(b.release());
68 }
69
75 explicit irr_ptr(ReferenceCounted *object) noexcept { reset(object); }
76
77 ~irr_ptr() { reset(); }
78
79 irr_ptr &operator=(const irr_ptr &b) noexcept
80 {
81 grab(b.get());
82 return *this;
83 }
84
85 irr_ptr &operator=(irr_ptr &&b) noexcept
86 {
87 reset(b.release());
88 return *this;
89 }
90
91 template <typename B, class = typename std::enable_if<std::is_convertible<B *,
92 ReferenceCounted *>::value>::type>
93 irr_ptr &operator=(const irr_ptr<B> &b) noexcept
94 {
95 grab(b.get());
96 return *this;
97 }
98
99 template <typename B, class = typename std::enable_if<std::is_convertible<B *,
100 ReferenceCounted *>::value>::type>
102 {
103 reset(b.release());
104 return *this;
105 }
106
107 ReferenceCounted &operator*() const noexcept { return *value; }
108 ReferenceCounted *operator->() const noexcept { return value; }
109 explicit operator ReferenceCounted *() const noexcept { return value; }
110 explicit operator bool() const noexcept { return !!value; }
111
114 ReferenceCounted *get() const noexcept { return value; }
115
119 ReferenceCounted *release() noexcept
120 {
121 ReferenceCounted *object = value;
122 value = nullptr;
123 return object;
124 }
125
129 void reset(ReferenceCounted *object = nullptr) noexcept
130 {
131 if (value)
132 value->drop();
133 value = object;
134 }
135
139 void grab(ReferenceCounted *object) noexcept
140 {
141 if (object)
142 object->grab();
143 reset(object);
144 }
145};
146
154template <class ReferenceCounted>
155irr_ptr<ReferenceCounted> grab(ReferenceCounted *object) noexcept
156{
158 ptr.grab(object);
159 return ptr;
160}
161
162template <typename ReferenceCounted>
164{
165 return a.get() == b.get();
166}
167
168template <typename ReferenceCounted>
169bool operator==(const irr_ptr<ReferenceCounted> &a, const ReferenceCounted *b) noexcept
170{
171 return a.get() == b;
172}
173
174template <typename ReferenceCounted>
175bool operator==(const ReferenceCounted *a, const irr_ptr<ReferenceCounted> &b) noexcept
176{
177 return a == b.get();
178}
179
180template <typename ReferenceCounted>
182{
183 return a.get() != b.get();
184}
185
186template <typename ReferenceCounted>
187bool operator!=(const irr_ptr<ReferenceCounted> &a, const ReferenceCounted *b) noexcept
188{
189 return a.get() != b;
190}
191
192template <typename ReferenceCounted>
193bool operator!=(const ReferenceCounted *a, const irr_ptr<ReferenceCounted> &b) noexcept
194{
195 return a != b.get();
196}
197
200template <class T, class... Args>
201irr_ptr<T> make_irr(Args&&... args)
202{
203 return irr_ptr<T>(new T(std::forward<Args>(args)...));
204}
Shared pointer for IrrLicht objects.
Definition: irr_ptr.h:44
void grab(ReferenceCounted *object) noexcept
Drops stored pointer replacing it with the given one.
Definition: irr_ptr.h:139
irr_ptr(ReferenceCounted *object) noexcept
Constructs a shared pointer out of a plain one to control object lifetime.
Definition: irr_ptr.h:75
irr_ptr & operator=(const irr_ptr &b) noexcept
Definition: irr_ptr.h:79
irr_ptr(const irr_ptr< B > &b) noexcept
Definition: irr_ptr.h:58
irr_ptr(irr_ptr &&b) noexcept
Definition: irr_ptr.h:54
void reset(ReferenceCounted *object=nullptr) noexcept
Drops stored pointer replacing it with the given one.
Definition: irr_ptr.h:129
irr_ptr & operator=(irr_ptr< B > &&b) noexcept
Definition: irr_ptr.h:101
ReferenceCounted & operator*() const noexcept
Definition: irr_ptr.h:107
irr_ptr()
Definition: irr_ptr.h:48
ReferenceCounted * get() const noexcept
Returns the stored pointer.
Definition: irr_ptr.h:114
irr_ptr & operator=(irr_ptr &&b) noexcept
Definition: irr_ptr.h:85
irr_ptr & operator=(const irr_ptr< B > &b) noexcept
Definition: irr_ptr.h:93
ReferenceCounted * operator->() const noexcept
Definition: irr_ptr.h:108
irr_ptr(const irr_ptr &b) noexcept
Definition: irr_ptr.h:52
irr_ptr(irr_ptr< B > &&b) noexcept
Definition: irr_ptr.h:65
~irr_ptr()
Definition: irr_ptr.h:77
ReferenceCounted * value
Definition: irr_ptr.h:45
ReferenceCounted * release() noexcept
Returns the stored pointer, erasing it from this class.
Definition: irr_ptr.h:119
irr_ptr(std::nullptr_t) noexcept
Definition: irr_ptr.h:50
irr_ptr< T > make_irr(Args &&... args)
Same as std::make_unique<T>, but for irr_ptr.
Definition: irr_ptr.h:201
bool operator!=(const irr_ptr< ReferenceCounted > &a, const irr_ptr< ReferenceCounted > &b) noexcept
Definition: irr_ptr.h:181
bool operator==(const irr_ptr< ReferenceCounted > &a, const irr_ptr< ReferenceCounted > &b) noexcept
Definition: irr_ptr.h:163
irr_ptr< ReferenceCounted > grab(ReferenceCounted *object) noexcept
Constructs a shared pointer as a secondary reference to an object.
Definition: irr_ptr.h:155