sead
Loading...
Searching...
No Matches
seadSafeArray.h
Go to the documentation of this file.
1#ifndef SEAD_SAFE_ARRAY_H_
2#define SEAD_SAFE_ARRAY_H_
3
4#include <basis/seadAssert.h>
5#include <basis/seadTypes.h>
6
7namespace sead {
8
9template <typename T, s32 N>
10class SafeArray;
11
12template <typename T>
13class SafeArray<T, 0>
14{
15};
16
17template <typename T, s32 N>
19{
20public:
21 // constexpr SafeArray()
22 // {
23 // }
24
25 constexpr T& operator[](s32 x)
26 {
27 if (static_cast<u32>(x) < static_cast<u32>(N))
28 {
29 return mBuffer[x];
30 }
31 else
32 {
33 SEAD_ASSERT_MSG(false, "range over [0, %d) : %d", N, x);
34 return mBuffer[0];
35 }
36 }
37
38 constexpr T& operator[](u32 x)
39 {
40 if (x < static_cast<u32>(N))
41 {
42 return mBuffer[x];
43 }
44 else
45 {
46 SEAD_ASSERT_MSG(false, "range over [0, %d) : %u", N, x);
47 return mBuffer[0];
48 }
49 }
50
51 constexpr const T& operator[](s32 x) const
52 {
53 if (static_cast<u32>(x) < static_cast<u32>(N))
54 {
55 return mBuffer[x];
56 }
57 else
58 {
59 SEAD_ASSERT_MSG(false, "range over [0, %d) : %d", N, x);
60 return mBuffer[0];
61 }
62 }
63
64 constexpr const T& operator[](u32 x) const
65 {
66 if (x < static_cast<u32>(N))
67 {
68 return mBuffer[x];
69 }
70 else
71 {
72 SEAD_ASSERT_MSG(false, "range over [0, %d) : %u", N, x);
73 return mBuffer[0];
74 }
75 }
76
78 const T& operator()(s32) const;
79
80 T& front() { return mBuffer[0]; }
81 const T& front() const { return mBuffer[0]; }
82
83 T& back() { return mBuffer[N - 1]; }
84 const T& back() const { return mBuffer[N - 1]; }
85
86 constexpr s32 size() const { return N; }
87 constexpr u32 getByteSize() const { return N * sizeof(T); }
88 T* getBufferPtr() { return mBuffer; }
89 const T* getBufferPtr() const { return mBuffer; }
90
91 void fill(const T& value)
92 {
93 for (s32 i = 0; i < N; i++)
94 mBuffer[i] = value;
95 }
96
97public:
99 {
100 public:
101 explicit iterator(T* buffer, s32 index = 0)
102 : mPtr(buffer + index)
103 , mStart(buffer)
104 {
105 }
106
107 bool operator==(const iterator& rhs) const
108 {
109 return mPtr == rhs.mPtr;
110 }
111
112 bool operator!=(const iterator& rhs) const
113 {
114 return mPtr != rhs.mPtr;
115 }
116
118 {
119 mPtr++;
120 return *this;
121 }
122
124 {
125 mPtr--;
126 return *this;
127 }
128
129 T& operator*() const { return *mPtr; }
130 T* operator->() const { return mPtr; }
131
132 s32 getIndex() const { return ((uintptr_t)mPtr - (uintptr_t)mStart) / sizeof(T); }
133
134 private:
137 };
138
140 {
141 public:
142 explicit constIterator(const T* buffer, s32 index = 0)
143 : mPtr(buffer + index)
144 , mStart(buffer)
145 {
146 }
147
148 bool operator==(const constIterator& rhs) const
149 {
150 return mPtr == rhs.mPtr;
151 }
152
153 bool operator!=(const constIterator& rhs) const
154 {
155 return mPtr != rhs.mPtr;
156 }
157
159 {
160 mPtr++;
161 return *this;
162 }
163
165 {
166 mPtr--;
167 return *this;
168 }
169
170 const T& operator*() const { return *mPtr; }
171 const T* operator->() const { return mPtr; }
172
173 s32 getIndex() const { return ((uintptr_t)mPtr - (uintptr_t)mStart) / sizeof(T); }
174
175 private:
176 const T* mStart;
177 const T* mPtr;
178 };
179
180 // TODO
182
183 // TODO
185
186public:
189
190 iterator end() { return iterator(mBuffer, N); }
191 constIterator end() const { return constIterator(mBuffer, N); }
192
194 {
195 if (static_cast<u32>(x) <= static_cast<u32>(N))
196 {
197 return iterator(mBuffer, x);
198 }
199 else
200 {
201 SEAD_ASSERT_MSG(false, "range over [0,%d] : %d", N, x);
202 return end();
203 }
204 }
205
207 {
208 if (static_cast<u32>(x) <= static_cast<u32>(N))
209 {
210 return constIterator(mBuffer, x);
211 }
212 else
213 {
214 SEAD_ASSERT_MSG(false, "range over [0,%d] : %d", N, x);
215 return end();
216 }
217 }
218
219
221
223
225 {
226 if (static_cast<u32>(x) <= static_cast<u32>(N))
227 {
228 return constIterator(mBuffer, x);
229 }
230 else
231 {
232 SEAD_ASSERT_MSG(false, "range over [0,%d] : %d", N, x);
233 return constEnd();
234 }
235 }
236
239
242
245
248
250
251//private:
253};
254
255template <typename T, s32 N>
257{
258public:
260 {
261 }
262
263 T& operator[](s32 x) { return mBuffer[x]; }
264 const T& operator[](s32 x) const { return mBuffer[x]; }
265
267 const T& operator()(s32) const;
268
269 T& front() { return mBuffer[0]; }
270 const T& front() const { return mBuffer[0]; }
271
272 T& back() { return mBuffer[N - 1]; }
273 const T& back() const { return mBuffer[N - 1]; }
274
275 s32 size() const { return N; }
276 u32 getByteSize() const { return N * sizeof(T); }
277 T* getBufferPtr() { return mBuffer; }
278 const T* getBufferPtr() const { return mBuffer; }
279
280 void fill(const T& value)
281 {
282 for (s32 i = 0; i < N; i++)
283 mBuffer[i] = value;
284 }
285
286public:
287 typedef typename SafeArray<T, N>::iterator iterator;
288 typedef typename SafeArray<T, N>::constIterator constIterator;
291
292public:
295
296 iterator end() { return iterator(mBuffer, N); }
297 constIterator end() const { return constIterator(mBuffer, N); }
298
299 iterator toIterator(s32 x) { return iterator(mBuffer, x); }
300 constIterator toIterator(s32 x) const { return constIterator(mBuffer, x); }
301
303
305
307
310
313
316
319
321
322private:
324};
325
326} // namespace sead
327
328#endif // SEAD_SAFE_ARRAY_H_
Definition seadSafeArray.h:140
bool operator!=(const constIterator &rhs) const
Definition seadSafeArray.h:153
const T * mPtr
Definition seadSafeArray.h:177
constIterator(const T *buffer, s32 index=0)
Definition seadSafeArray.h:142
bool operator==(const constIterator &rhs) const
Definition seadSafeArray.h:148
const T & operator*() const
Definition seadSafeArray.h:170
const T * operator->() const
Definition seadSafeArray.h:171
const T * mStart
Definition seadSafeArray.h:176
s32 getIndex() const
Definition seadSafeArray.h:173
constIterator & operator++()
Definition seadSafeArray.h:158
constIterator & operator--()
Definition seadSafeArray.h:164
Definition seadSafeArray.h:99
s32 getIndex() const
Definition seadSafeArray.h:132
bool operator!=(const iterator &rhs) const
Definition seadSafeArray.h:112
iterator & operator++()
Definition seadSafeArray.h:117
T * operator->() const
Definition seadSafeArray.h:130
iterator & operator--()
Definition seadSafeArray.h:123
T & operator*() const
Definition seadSafeArray.h:129
iterator(T *buffer, s32 index=0)
Definition seadSafeArray.h:101
T * mStart
Definition seadSafeArray.h:135
T * mPtr
Definition seadSafeArray.h:136
bool operator==(const iterator &rhs) const
Definition seadSafeArray.h:107
Definition seadSafeArray.h:184
Definition seadSafeArray.h:181
Definition seadSafeArray.h:14
Definition seadSafeArray.h:19
T & back()
Definition seadSafeArray.h:83
reverseConstIterator reverseConstBegin() const
constIterator constEnd() const
Definition seadSafeArray.h:222
constIterator begin() const
Definition seadSafeArray.h:188
reverseConstIterator toReverseConstIterator(s32) const
reverseConstIterator reverseEnd() const
reverseConstIterator reverseBegin() const
const T & operator()(s32) const
T * getBufferPtr()
Definition seadSafeArray.h:88
reverseIterator reverseBegin()
void fill(const T &value)
Definition seadSafeArray.h:91
reverseIterator toReverseIterator(s32)
iterator toIterator(s32 x)
Definition seadSafeArray.h:193
iterator end()
Definition seadSafeArray.h:190
constIterator toIterator(s32 x) const
Definition seadSafeArray.h:206
constexpr u32 getByteSize() const
Definition seadSafeArray.h:87
const T & front() const
Definition seadSafeArray.h:81
constIterator constBegin() const
Definition seadSafeArray.h:220
constIterator toConstIterator(s32 x) const
Definition seadSafeArray.h:224
reverseConstIterator toReverseIterator(s32) const
reverseIterator reverseEnd()
reverseConstIterator reverseConstEnd() const
T mBuffer[N]
Definition seadSafeArray.h:252
T & front()
Definition seadSafeArray.h:80
constexpr T & operator[](s32 x)
Definition seadSafeArray.h:25
const T & back() const
Definition seadSafeArray.h:84
constexpr const T & operator[](s32 x) const
Definition seadSafeArray.h:51
constIterator end() const
Definition seadSafeArray.h:191
iterator begin()
Definition seadSafeArray.h:187
constexpr s32 size() const
Definition seadSafeArray.h:86
const T * getBufferPtr() const
Definition seadSafeArray.h:89
T & operator()(s32)
Definition seadSafeArray.h:257
const T & front() const
Definition seadSafeArray.h:270
T & front()
Definition seadSafeArray.h:269
reverseConstIterator reverseConstBegin() const
void fill(const T &value)
Definition seadSafeArray.h:280
iterator toIterator(s32 x)
Definition seadSafeArray.h:299
reverseIterator reverseEnd()
reverseConstIterator reverseBegin() const
reverseIterator toReverseIterator(s32)
constIterator toIterator(s32 x) const
Definition seadSafeArray.h:300
u32 getByteSize() const
Definition seadSafeArray.h:276
const T & operator()(s32) const
T * getBufferPtr()
Definition seadSafeArray.h:277
constIterator constEnd() const
Definition seadSafeArray.h:304
reverseConstIterator toReverseConstIterator(s32) const
T mBuffer[N]
Definition seadSafeArray.h:323
reverseConstIterator toReverseIterator(s32) const
UnsafeArray()
Definition seadSafeArray.h:259
SafeArray< T, N >::reverseConstIterator reverseConstIterator
Definition seadSafeArray.h:290
reverseIterator reverseBegin()
constIterator toConstIterator(s32 x) const
Definition seadSafeArray.h:306
SafeArray< T, N >::iterator iterator
Definition seadSafeArray.h:287
s32 size() const
Definition seadSafeArray.h:275
constIterator end() const
Definition seadSafeArray.h:297
reverseConstIterator reverseEnd() const
iterator end()
Definition seadSafeArray.h:296
const T & back() const
Definition seadSafeArray.h:273
constIterator constBegin() const
Definition seadSafeArray.h:302
const T & operator[](s32 x) const
Definition seadSafeArray.h:264
T & operator[](s32 x)
Definition seadSafeArray.h:263
SafeArray< T, N >::constIterator constIterator
Definition seadSafeArray.h:288
T & back()
Definition seadSafeArray.h:272
iterator begin()
Definition seadSafeArray.h:293
constIterator begin() const
Definition seadSafeArray.h:294
const T * getBufferPtr() const
Definition seadSafeArray.h:278
reverseConstIterator reverseConstEnd() const
SafeArray< T, N >::reverseIterator reverseIterator
Definition seadSafeArray.h:289
Definition seadAssert.h:44
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33