Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
pointer.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "irrlichttypes.h"
8#include "util/basic_macros.h"
9#include <cassert>
10#include <cstring>
11#include <string_view>
12
13template <typename T>
14class Buffer
15{
16public:
18 {
19 m_size = 0;
20 data = nullptr;
21 }
22 Buffer(size_t size)
23 {
24 m_size = size;
25 if (size != 0) {
26 data = new T[size];
27 } else {
28 data = nullptr;
29 }
30 }
31
32 // Disable class copy
33 Buffer(const Buffer &) = delete;
34 Buffer &operator=(const Buffer &) = delete;
35
36 Buffer(Buffer &&buffer)
37 {
38 m_size = buffer.m_size;
39 if (m_size != 0) {
40 data = buffer.data;
41 buffer.data = nullptr;
42 buffer.m_size = 0;
43 } else {
44 data = nullptr;
45 }
46 }
47 // Copies whole buffer
48 Buffer(const T *t, size_t size)
49 {
50 m_size = size;
51 if (size != 0) {
52 data = new T[size];
53 memcpy(data, t, sizeof(T) * size);
54 } else {
55 data = nullptr;
56 }
57 }
58
60 {
61 drop();
62 }
63
65 {
66 if (this == &buffer)
67 return *this;
68 drop();
69 m_size = buffer.m_size;
70 if (m_size != 0) {
71 data = buffer.data;
72 buffer.data = nullptr;
73 buffer.m_size = 0;
74 } else {
75 data = nullptr;
76 }
77 return *this;
78 }
79
80 void copyTo(Buffer &buffer) const
81 {
82 buffer.drop();
83 buffer.m_size = m_size;
84 if (m_size != 0) {
85 buffer.data = new T[m_size];
86 memcpy(buffer.data, data, sizeof(T) * m_size);
87 } else {
88 buffer.data = nullptr;
89 }
90 }
91
92 T & operator[](size_t i) const
93 {
94 return data[i];
95 }
96 T * operator*() const
97 {
98 return data;
99 }
100
101 size_t getSize() const
102 {
103 return m_size;
104 }
105
106 operator std::string_view() const
107 {
108 if (!data) {
109 return std::string_view();
110 }
111 return std::string_view(reinterpret_cast<char*>(data), m_size);
112 }
113
114private:
115 void drop()
116 {
117 delete[] data;
118 }
120 size_t m_size;
121};
122
123/************************************************
124 * !!! W A R N I N G !!! *
125 * *
126 * This smart pointer class is NOT thread safe. *
127 * ONLY use in a single-threaded context! *
128 * *
129 ************************************************/
130template <typename T>
132{
133public:
135 {
136 m_size = 0;
137 data = nullptr;
138 refcount = new u32;
139 (*refcount) = 1;
140 }
141
142 SharedBuffer(size_t size)
143 {
144 m_size = size;
145 if (m_size != 0) {
146 data = new T[m_size];
147 } else {
148 data = nullptr;
149 }
150
151 refcount = new u32;
152 memset(data, 0, sizeof(T) * m_size);
153 (*refcount) = 1;
154 }
155
157 {
158 m_size = buffer.m_size;
159 data = buffer.data;
160 refcount = buffer.refcount;
161 (*refcount)++;
162 }
163
165 {
166 if (this == &buffer)
167 return *this;
168 drop();
169 m_size = buffer.m_size;
170 data = buffer.data;
171 refcount = buffer.refcount;
172 (*refcount)++;
173 return *this;
174 }
175
177 SharedBuffer(const T *t, size_t size)
178 {
179 m_size = size;
180 if (m_size != 0) {
181 data = new T[m_size];
182 memcpy(data, t, sizeof(T) * m_size);
183 } else {
184 data = nullptr;
185 }
186 refcount = new u32;
187 (*refcount) = 1;
188 }
189
191 SharedBuffer(const Buffer<T> &buffer) : SharedBuffer(*buffer, buffer.getSize())
192 {
193 }
194
196 {
197 drop();
198 }
199
200 T & operator[](size_t i) const
201 {
202 assert(i < m_size);
203 return data[i];
204 }
205
206 T * operator*() const
207 {
208 return data;
209 }
210
211 size_t getSize() const
212 {
213 return m_size;
214 }
215
216 operator Buffer<T>() const
217 {
218 return Buffer<T>(data, m_size);
219 }
220
221private:
222 void drop()
223 {
224 assert((*refcount) > 0);
225 (*refcount)--;
226 if (*refcount == 0) {
227 delete[] data;
228 delete refcount;
229 }
230 }
231
233 size_t m_size;
235};
236
237// This class is not thread-safe!
239public:
241 virtual ~IntrusiveReferenceCounted() = default;
242 void grab() noexcept { ++m_refcount; }
243 void drop() noexcept { if (--m_refcount == 0) delete this; }
244
246private:
247 u32 m_refcount = 1;
248};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition pointer.h:15
Buffer(const T *t, size_t size)
Definition pointer.h:48
T * data
Definition pointer.h:119
size_t m_size
Definition pointer.h:120
Buffer(size_t size)
Definition pointer.h:22
Buffer & operator=(Buffer &&buffer)
Definition pointer.h:64
T & operator[](size_t i) const
Definition pointer.h:92
void copyTo(Buffer &buffer) const
Definition pointer.h:80
~Buffer()
Definition pointer.h:59
Buffer()
Definition pointer.h:17
T * operator*() const
Definition pointer.h:96
Buffer(const Buffer &)=delete
Buffer(Buffer &&buffer)
Definition pointer.h:36
size_t getSize() const
Definition pointer.h:101
Buffer & operator=(const Buffer &)=delete
void drop()
Definition pointer.h:115
Definition pointer.h:238
virtual ~IntrusiveReferenceCounted()=default
void grab() noexcept
Definition pointer.h:242
u32 m_refcount
Definition pointer.h:247
void drop() noexcept
Definition pointer.h:243
IntrusiveReferenceCounted()=default
Definition pointer.h:132
T * operator*() const
Definition pointer.h:206
u32 * refcount
Definition pointer.h:234
SharedBuffer(const Buffer< T > &buffer)
Copies whole buffer.
Definition pointer.h:191
size_t m_size
Definition pointer.h:233
SharedBuffer(const SharedBuffer &buffer)
Definition pointer.h:156
SharedBuffer & operator=(const SharedBuffer &buffer)
Definition pointer.h:164
T & operator[](size_t i) const
Definition pointer.h:200
T * data
Definition pointer.h:232
size_t getSize() const
Definition pointer.h:211
~SharedBuffer()
Definition pointer.h:195
SharedBuffer()
Definition pointer.h:134
SharedBuffer(const T *t, size_t size)
Copies whole buffer.
Definition pointer.h:177
SharedBuffer(size_t size)
Definition pointer.h:142
void drop()
Definition pointer.h:222