sead
Loading...
Searching...
No Matches
seadSafeString.h
Go to the documentation of this file.
1#ifndef SEAD_SAFE_STRING_H_
2#define SEAD_SAFE_STRING_H_
3
4#include <stdarg.h>
5
6#include <basis/seadAssert.h>
7#include <basis/seadTypes.h>
8
9namespace sead {
10
11template <typename CharType>
13
14template <typename CharType>
16{
17public:
18 static const CharType cNullChar;
19 static const CharType cLineBreakChar;
20 static const SafeStringBase<CharType> cEmptyString;
21 static const s32 cMaximumLength = 256*1024;
22
23public:
28
29 SafeStringBase(const CharType* str)
30 : mStringTop(str)
31 {
32 SEAD_ASSERT_MSG(mStringTop, "str must not be nullptr.");
33 }
34
35 SafeStringBase(const SafeStringBase& other) = default;
36 SafeStringBase& operator=(const SafeStringBase& other) = default;
37
38 virtual ~SafeStringBase()
39 {
40 }
41
42public:
44 {
45 public:
46 explicit iterator(const SafeStringBase<CharType>* str)
47 : mString(str)
48 , mIndex(0)
49 {
50 }
51
52 iterator(const SafeStringBase<CharType>* str, s32 idx)
53 : mString(str)
54 , mIndex(idx)
55 {
56 }
57
58 virtual ~iterator()
59 {
60 }
61
62 public:
63 inline iterator& operator++()
64 {
65 ++mIndex;
66 return *this;
67 }
68
69 inline iterator& operator--()
70 {
71 --mIndex;
72 return *this;
73 }
74
75 friend bool operator==(const iterator& a, const iterator& b)
76 {
77 return a.mString == b.mString && a.mIndex == b.mIndex;
78 }
79
80 friend bool operator!=(const iterator& a_, const iterator& b_)
81 {
82 return !(a_ == b_);
83 }
84
85 const CharType& operator*() const
86 {
87 return mString->at(mIndex);
88 }
89
90 s32 getIndex() const
91 {
92 return mIndex;
93 }
94
95 protected:
98 };
99
101 {
102 public:
103 token_iterator(const SafeStringBase* str, const SafeStringBase& delimiter)
104 : iterator(str)
105 , mDelimiter(delimiter)
106 {
107 }
108
109 token_iterator(const SafeStringBase* str, s32 idx, const SafeStringBase& delimiter)
110 : iterator(str, idx)
111 , mDelimiter(delimiter)
112 {
113 }
114
115 virtual ~token_iterator()
116 {
117 }
118
119 public:
120 inline token_iterator& operator++();
122
123 inline s32 get(BufferedSafeStringBase<CharType>* out) const;
124 inline s32 getAndForward(BufferedSafeStringBase<CharType>* out);
125
126 private:
128 };
129
130public:
132 {
133 return iterator(this, 0);
134 }
135
136 iterator end() const
137 {
138 return iterator(this, calcLength() + 1);
139 }
140
141public:
142 token_iterator tokenBegin(const SafeStringBase<CharType>& delimiter) const
143 {
144 return token_iterator(this, 0, delimiter);
145 }
146
147 token_iterator tokenEnd(const SafeStringBase<CharType>& delimiter = SafeStringBase<CharType>()) const
148 {
149 return token_iterator(this, calcLength() + 1, delimiter);
150 }
151
152public:
153 const CharType* cstr() const
154 {
156 return mStringTop;
157 }
158
159 inline const CharType& at(s32 idx) const;
160
161 inline const CharType& operator[](s32 idx) const
162 {
163 return at(idx);
164 }
165
166 inline s32 calcLength() const;
167
168 inline const SafeStringBase<CharType> getPart(s32 at) const;
169
170 const SafeStringBase<CharType> getPart(const iterator& it) const
171 {
172 return getPart(it.getIndex());
173 }
174
175 inline bool include(const CharType& c) const;
176
177 inline bool include(const SafeStringBase<CharType>& str) const
178 {
179 return findIndex(str) != -1;
180 }
181
182 inline bool isEqual(const SafeStringBase<CharType>& rhs) const;
183
184 friend bool operator==(const SafeStringBase<CharType>& lhs, const SafeStringBase<CharType>& rhs)
185 {
186 return lhs.isEqual(rhs);
187 }
188
189 friend bool operator!=(const SafeStringBase<CharType>& lhs, const SafeStringBase<CharType>& rhs)
190 {
191 return !lhs.isEqual(rhs);
192 }
193
194 inline s32 comparen(const SafeStringBase<CharType>& rhs, s32 n) const;
195
196 inline s32 compare(const SafeStringBase<CharType>& rhs) const
197 {
198 return comparen(rhs, cMaximumLength);
199 }
200
201 friend bool operator>(const SafeStringBase<CharType>& lhs, const SafeStringBase<CharType>& rhs)
202 {
203 return lhs.compare(rhs) > 0;
204 }
205
206 friend bool operator<(const SafeStringBase<CharType>& lhs, const SafeStringBase<CharType>& rhs)
207 {
208 return lhs.compare(rhs) < 0;
209 }
210
211 inline iterator findIterator(const SafeStringBase<CharType>& token) const;
212 s32 findIndex(const SafeStringBase<CharType>& token) const;
213 inline iterator rfindIterator(const SafeStringBase<CharType>& token) const;
214 s32 rfindIndex(const SafeStringBase<CharType>& token) const;
215
216 bool isEmpty() const
217 {
218 return unsafeAt_(0) == 0;
219 }
220
221private:
222 const CharType& unsafeAt_(s32 idx) const
223 {
224 return mStringTop[idx];
225 }
226
227protected:
228 virtual void assureTerminationImpl_() const
229 {
230 }
231
232protected:
233 const CharType* mStringTop;
234};
235
236template <>
237const char SafeStringBase<char>::cNullChar;
238
239template <>
241
242template <>
244
245template <>
247
248template <>
250
251template <>
253
254template <typename CharType>
256{
257public:
258 BufferedSafeStringBase(CharType* buffer, s32 size)
259 : SafeStringBase<CharType>(buffer)
261 {
262 if (size <= 0)
263 {
264 SEAD_ASSERT_MSG(false, "Invalied buffer size(%d).\n", size);
265 this->mStringTop = nullptr;
266 mBufferSize = 0;
267 return;
268 }
269
271 }
272
273 BufferedSafeStringBase(BufferedSafeStringBase<CharType>* original, s32 pos)
274 : SafeStringBase<CharType>(original->cstr())
275 , mBufferSize(0)
276 {
277 SEAD_ASSERT_MSG(original, "original string must not be nullptr.");
278
279 if (pos >= original->getBufferSize() || pos < 0)
280 {
281 SEAD_ASSERT_MSG(false, "pos(%d) out of bounds[0,%d)", pos, original->getBufferSize());
282 this->mStringTop = nullptr;
283 mBufferSize = 0;
284 return;
285 }
286
287 this->mStringTop = original->mStringTop + pos;
288 mBufferSize = original->getBufferSize() - pos;
290 }
291
292private:
295
296public:
298 {
299 }
300
301 inline const CharType& operator[](s32 idx) const;
302
304 {
305 return mBufferSize;
306 }
307
308 inline s32 copy(const SafeStringBase<CharType>& rhs, s32 size = -1);
309 inline s32 copyAt(s32 at, const SafeStringBase<CharType>& src, s32 cpy_length = -1);
310
311 s32 format(const CharType* format_string, ...);
312 s32 formatV(const CharType* format_string, va_list varg);
313 s32 appendWithFormat(const CharType* format_string, ...);
314 s32 appendWithFormatV(const CharType* format_string, va_list varg);
315
316 inline s32 append(const SafeStringBase<CharType>& src, s32 append_length = -1);
317 inline s32 append(CharType src_chr);
318 inline s32 chop(s32 chop_num = 1);
319 inline s32 chopMatchedChar(CharType chop_char);
320 inline s32 chopMatchedChar(const SafeStringBase<CharType>& chop_char_list);
321
322 inline s32 chomp()
323 {
324 return chopMatchedChar(SafeStringBase<CharType>::cLineBreakChar);
325 }
326
328 inline s32 rstrip(const SafeStringBase<CharType>& strip_char_list);
330 inline s32 trim(s32 trim_length);
331 inline s32 trimMatchedString(const SafeStringBase<CharType>& trim_string);
332
333 inline void clear()
334 {
336 }
337
338 s32 convertFromMultiByteString(const SafeStringBase<CharType>& src, s32 src_size = -1)
339 {
340 return convertFromOtherType_(src, src_size);
341 }
342
343 s32 convertFromWideCharString(const SafeStringBase<char16>& src, s32 src_size = -1)
344 {
345 return convertFromOtherType_(src, src_size);
346 }
347
348 CharType* getBuffer()
349 {
352 }
353
354private:
356 {
357 return const_cast<CharType*>(this->mStringTop);
358 }
359
360 template <typename Other>
361 inline s32 convertFromOtherType_(const SafeStringBase<Other>& src, s32 src_size);
362
363 inline bool isUnprintableChar_(CharType c) const;
364
365 static s32 formatImpl_(CharType* dst, s32 dst_size, const CharType* format_string, va_list varg);
366
367protected:
368 void assureTerminationImpl_() const override
369 {
370 BufferedSafeStringBase<CharType>* mutable_ptr = const_cast<BufferedSafeStringBase<CharType>*>(this);
371 mutable_ptr->getMutableStringTop_()[getBufferSize() - 1] = 0;
372 }
373
374private:
376};
377
378template <typename CharType, s32 N>
380{
381public:
383 : BufferedSafeStringBase<CharType>(mBuffer, N)
384 {
385 this->clear();
386 }
387
388 explicit FixedSafeStringBase(const SafeStringBase<CharType>& rhs)
389 : BufferedSafeStringBase<CharType>(mBuffer, N)
390 {
391 this->copy(rhs);
392 }
393
395 : BufferedSafeStringBase<CharType>(mBuffer, N)
396 {
397 this->copy(rhs);
398 }
399
401 {
402 }
403
404 FixedSafeStringBase<CharType, N>& operator=(const FixedSafeStringBase<CharType, N>& rhs)
405 {
406 this->copy(rhs);
407 return *this;
408 }
409
410 FixedSafeStringBase<CharType, N>& operator=(const SafeStringBase<CharType>& rhs)
411 {
412 this->copy(rhs);
413 return *this;
414 }
415
416private:
417 CharType mBuffer[N];
418};
419
424
425#ifdef cafe
426static_assert(sizeof(SafeString) == 8, "sead::SafeStringBase<T> size mismatch");
427static_assert(sizeof(BufferedSafeString) == 0xC, "sead::BufferedSafeStringBase<T> size mismatch");
428#endif // cafe
429
430template <s32 N>
432{
433public:
435 : FixedSafeStringBase<char, N>()
436 {
437 }
438
439 explicit FixedSafeString(const SafeString& rhs)
440 : FixedSafeStringBase<char, N>()
441 {
442 this->copy(rhs);
443 }
444
445 // Nintendo did not implement this
446 //
447 //FixedSafeString(const FixedSafeString<N>& rhs)
448 // : FixedSafeStringBase<char, N>()
449 //{
450 // this->copy(rhs);
451 //}
452
454 {
455 this->copy(rhs);
456 return *this;
457 }
458
460 {
461 this->copy(rhs);
462 return *this;
463 }
464};
465
466template <s32 N>
468{
469public:
474
475 explicit WFixedSafeString(const WSafeString& rhs)
477 {
478 this->copy(rhs);
479 }
480
481 // Nintendo did not implement this
482 //
483 //WFixedSafeString(const WFixedSafeString<N>& rhs)
484 // : FixedSafeStringBase<char16, N>()
485 //{
486 // copy(rhs);
487 //}
488
490 {
491 copy(rhs);
492 return *this;
493 }
494
496 {
497 this->copy(rhs);
498 return *this;
499 }
500};
501
502template <s32 N>
504{
505public:
506 FormatFixedSafeString(const char* format_string, ...);
507
508private:
511};
512
513template <s32 N>
515{
516public:
517 WFormatFixedSafeString(const char16* format_string, ...);
518
519private:
522};
523
524class Heap;
525
526template <typename T>
528{
529public:
530 HeapSafeStringBase(Heap* heap, const SafeStringBase<T>& string, s32 size)
531 : BufferedSafeStringBase<T>(new (heap, 4) T[size](),
532 size)
533 {
534 copy(string);
535 }
536
537 HeapSafeStringBase(Heap* heap, const SafeStringBase<T>& string)
538 : BufferedSafeStringBase<T>(new (heap, 4) T[string.calcLength() + 1](),
539 string.calcLength() + 1)
540 {
541 copy(string);
542 }
543
545 {
546 if (this->mStringTop)
547 delete[] this->mStringTop;
548 }
549
550private:
553};
554
557
558template <>
560template <>
562template <>
564template <>
566template <>
568template <>
570template <>
572template <>
574template <>
576template <>
578
579} // namespace sead
580
581#ifdef __cplusplus
582
583#include <prim/seadSafeString.hpp>
584
585#endif // __cplusplus
586
587#endif // SEAD_SAFE_STRING_H_
Definition seadSafeString.h:256
CharType * getMutableStringTop_()
Definition seadSafeString.h:355
CharType * getBuffer()
Definition seadSafeString.h:348
s32 append(const SafeStringBase< CharType > &src, s32 append_length=-1)
Definition seadSafeString.hpp:289
BufferedSafeStringBase(CharType *buffer, s32 size)
Definition seadSafeString.h:258
s32 append(CharType src_chr)
Definition seadSafeString.hpp:296
s32 rstrip(const SafeStringBase< CharType > &strip_char_list)
s32 mBufferSize
Definition seadSafeString.h:375
static s32 formatImpl_(CharType *dst, s32 dst_size, const CharType *format_string, va_list varg)
s32 appendWithFormat(const CharType *format_string,...)
~BufferedSafeStringBase() override
Definition seadSafeString.h:297
BufferedSafeStringBase(BufferedSafeStringBase< CharType > *original, s32 pos)
Definition seadSafeString.h:273
s32 convertFromOtherType_(const SafeStringBase< Other > &src, s32 src_size)
void assureTerminationImpl_() const override
Definition seadSafeString.h:368
s32 chopMatchedChar(CharType chop_char)
s32 appendWithFormatV(const CharType *format_string, va_list varg)
void clear()
Definition seadSafeString.h:333
s32 trim(s32 trim_length)
Definition seadSafeString.hpp:314
s32 chomp()
Definition seadSafeString.h:322
s32 getBufferSize() const
Definition seadSafeString.h:303
s32 copyAt(s32 at, const SafeStringBase< CharType > &src, s32 cpy_length=-1)
Definition seadSafeString.hpp:253
s32 formatV(const CharType *format_string, va_list varg)
s32 chopMatchedChar(const SafeStringBase< CharType > &chop_char_list)
s32 format(const CharType *format_string,...)
s32 convertFromMultiByteString(const SafeStringBase< CharType > &src, s32 src_size=-1)
Definition seadSafeString.h:338
s32 copy(const SafeStringBase< CharType > &rhs, s32 size=-1)
Definition seadSafeString.hpp:233
s32 chop(s32 chop_num=1)
const CharType & operator[](s32 idx) const
bool isUnprintableChar_(CharType c) const
s32 trimMatchedString(const SafeStringBase< CharType > &trim_string)
BufferedSafeStringBase< CharType > & operator=(const BufferedSafeStringBase< CharType > &)
BufferedSafeStringBase(const BufferedSafeStringBase< CharType > &)
s32 convertFromWideCharString(const SafeStringBase< char16 > &src, s32 src_size=-1)
Definition seadSafeString.h:343
Definition seadSafeString.h:380
FixedSafeStringBase()
Definition seadSafeString.h:382
FixedSafeStringBase< CharType, N > & operator=(const FixedSafeStringBase< CharType, N > &rhs)
Definition seadSafeString.h:404
FixedSafeStringBase< CharType, N > & operator=(const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:410
FixedSafeStringBase(const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:388
CharType mBuffer[N]
Definition seadSafeString.h:417
FixedSafeStringBase(const FixedSafeStringBase< CharType, N > &rhs)
Definition seadSafeString.h:394
~FixedSafeStringBase() override
Definition seadSafeString.h:400
Definition seadSafeString.h:432
FixedSafeString()
Definition seadSafeString.h:434
FixedSafeString(const SafeString &rhs)
Definition seadSafeString.h:439
FixedSafeString< N > & operator=(const FixedSafeString< N > &rhs)
Definition seadSafeString.h:453
FixedSafeString< N > & operator=(const SafeString &rhs)
Definition seadSafeString.h:459
Definition seadSafeString.h:504
FormatFixedSafeString(const char *format_string,...)
Definition seadSafeString.hpp:335
FormatFixedSafeString< N > & operator=(const FormatFixedSafeString< N > &)
FormatFixedSafeString(const FormatFixedSafeString< N > &)
Definition seadSafeString.h:528
HeapSafeStringBase< T > & operator=(const HeapSafeStringBase< T > &)
virtual ~HeapSafeStringBase()
Definition seadSafeString.h:544
HeapSafeStringBase(const HeapSafeStringBase< T > &)
HeapSafeStringBase(Heap *heap, const SafeStringBase< T > &string, s32 size)
Definition seadSafeString.h:530
HeapSafeStringBase(Heap *heap, const SafeStringBase< T > &string)
Definition seadSafeString.h:537
Definition seadHeap.h:23
Definition seadSafeString.h:44
const SafeStringBase * mString
Definition seadSafeString.h:96
iterator(const SafeStringBase< CharType > *str)
Definition seadSafeString.h:46
iterator & operator++()
Definition seadSafeString.h:63
s32 mIndex
Definition seadSafeString.h:97
s32 getIndex() const
Definition seadSafeString.h:90
virtual ~iterator()
Definition seadSafeString.h:58
friend bool operator==(const iterator &a, const iterator &b)
Definition seadSafeString.h:75
iterator & operator--()
Definition seadSafeString.h:69
iterator(const SafeStringBase< CharType > *str, s32 idx)
Definition seadSafeString.h:52
friend bool operator!=(const iterator &a_, const iterator &b_)
Definition seadSafeString.h:80
const CharType & operator*() const
Definition seadSafeString.h:85
Definition seadSafeString.h:101
token_iterator(const SafeStringBase *str, s32 idx, const SafeStringBase &delimiter)
Definition seadSafeString.h:109
s32 get(BufferedSafeStringBase< CharType > *out) const
Definition seadSafeString.hpp:193
s32 getAndForward(BufferedSafeStringBase< CharType > *out)
Definition seadSafeString.hpp:203
token_iterator & operator++()
Definition seadSafeString.hpp:169
virtual ~token_iterator()
Definition seadSafeString.h:115
SafeStringBase mDelimiter
Definition seadSafeString.h:127
token_iterator(const SafeStringBase *str, const SafeStringBase &delimiter)
Definition seadSafeString.h:103
Definition seadSafeString.h:16
friend bool operator>(const SafeStringBase< CharType > &lhs, const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:201
static const CharType cLineBreakChar
Definition seadSafeString.h:19
virtual ~SafeStringBase()
Definition seadSafeString.h:38
token_iterator tokenBegin(const SafeStringBase< CharType > &delimiter) const
Definition seadSafeString.h:142
SafeStringBase()
Definition seadSafeString.h:24
iterator findIterator(const SafeStringBase< CharType > &token) const
iterator end() const
Definition seadSafeString.h:136
static const SafeStringBase< CharType > cEmptyString
Definition seadSafeString.h:20
iterator rfindIterator(const SafeStringBase< CharType > &token) const
SafeStringBase(const SafeStringBase &other)=default
const CharType * mStringTop
Definition seadSafeString.h:233
s32 rfindIndex(const SafeStringBase< CharType > &token) const
Definition seadSafeString.hpp:152
bool include(const SafeStringBase< CharType > &str) const
Definition seadSafeString.h:177
bool isEqual(const SafeStringBase< CharType > &rhs) const
Definition seadSafeString.hpp:82
const SafeStringBase< CharType > getPart(s32 at) const
Definition seadSafeString.hpp:50
bool isEmpty() const
Definition seadSafeString.h:216
const CharType & at(s32 idx) const
Definition seadSafeString.hpp:10
friend bool operator<(const SafeStringBase< CharType > &lhs, const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:206
token_iterator tokenEnd(const SafeStringBase< CharType > &delimiter=SafeStringBase< CharType >()) const
Definition seadSafeString.h:147
SafeStringBase & operator=(const SafeStringBase &other)=default
s32 comparen(const SafeStringBase< CharType > &rhs, s32 n) const
Definition seadSafeString.hpp:103
const CharType & unsafeAt_(s32 idx) const
Definition seadSafeString.h:222
friend bool operator!=(const SafeStringBase< CharType > &lhs, const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:189
friend bool operator==(const SafeStringBase< CharType > &lhs, const SafeStringBase< CharType > &rhs)
Definition seadSafeString.h:184
virtual void assureTerminationImpl_() const
Definition seadSafeString.h:228
const CharType & operator[](s32 idx) const
Definition seadSafeString.h:161
SafeStringBase(const CharType *str)
Definition seadSafeString.h:29
iterator begin() const
Definition seadSafeString.h:131
const SafeStringBase< CharType > getPart(const iterator &it) const
Definition seadSafeString.h:170
s32 findIndex(const SafeStringBase< CharType > &token) const
Definition seadSafeString.hpp:138
const CharType * cstr() const
Definition seadSafeString.h:153
static const s32 cMaximumLength
Definition seadSafeString.h:21
bool include(const CharType &c) const
Definition seadSafeString.hpp:64
s32 calcLength() const
Definition seadSafeString.hpp:24
static const CharType cNullChar
Definition seadSafeString.h:18
s32 compare(const SafeStringBase< CharType > &rhs) const
Definition seadSafeString.h:196
Definition seadSafeString.h:468
WFixedSafeString(const WSafeString &rhs)
Definition seadSafeString.h:475
WFixedSafeString()
Definition seadSafeString.h:470
WFixedSafeString< N > & operator=(const WSafeString &rhs)
Definition seadSafeString.h:495
WFixedSafeString< N > & operator=(const WFixedSafeString< N > &rhs)
Definition seadSafeString.h:489
Definition seadSafeString.h:515
WFormatFixedSafeString< N > & operator=(const WFormatFixedSafeString< N > &)
WFormatFixedSafeString(const WFormatFixedSafeString< N > &)
WFormatFixedSafeString(const char16 *format_string,...)
Definition seadSafeString.hpp:345
Definition seadAssert.h:44
SafeStringBase< char16 > WSafeString
Definition seadSafeString.h:421
HeapSafeStringBase< char > HeapSafeString
Definition seadSafeString.h:555
HeapSafeStringBase< char16 > WHeapSafeString
Definition seadSafeString.h:556
SafeStringBase< char > SafeString
Definition seadSafeString.h:420
BufferedSafeStringBase< char > BufferedSafeString
Definition seadSafeString.h:422
BufferedSafeStringBase< char16 > WBufferedSafeString
Definition seadSafeString.h:423
#define SEAD_ASSERT_MSG(condition, format,...)
Definition seadAssert.h:33