Embedded Template Library 1.0
Loading...
Searching...
No Matches
u8string.h
Go to the documentation of this file.
1
2
3/******************************************************************************
4The MIT License(MIT)
5
6Embedded Template Library.
7https://github.com/ETLCPP/etl
8https://www.etlcpp.com
9
10Copyright(c) 2023 John Wellbelove
11
12Permission is hereby granted, free of charge, to any person obtaining a copy
13of this software and associated documentation files(the "Software"), to deal
14in the Software without restriction, including without limitation the rights
15to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
16copies of the Software, and to permit persons to whom the Software is
17furnished to do so, subject to the following conditions :
18
19The above copyright notice and this permission notice shall be included in all
20copies or substantial portions of the Software.
21
22THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
25AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28SOFTWARE.
29******************************************************************************/
30
31#ifndef ETL_U8STRING_INCLUDED
32#define ETL_U8STRING_INCLUDED
33
34#include "platform.h"
35#include "basic_string.h"
36#include "string_view.h"
37#include "hash.h"
38#include "initializer_list.h"
39
40#include <ctype.h>
41
42#include "private/minmax_push.h"
43
44#if ETL_HAS_CHAR8_T
45namespace etl
46{
47#if ETL_USING_CPP11 && ETL_HAS_NATIVE_CHAR8_T
48 inline namespace literals
49 {
50 inline namespace string_literals
51 {
52 inline constexpr etl::u8string_view operator ""_sv(const char8_t* str, size_t length) noexcept
53 {
54 return etl::u8string_view{ str, length };
55 }
56 }
57 }
58#endif
59
60 typedef etl::ibasic_string<char8_t> iu8string;
61
62 //***************************************************************************
66 //***************************************************************************
67 template <size_t MAX_SIZE_>
68 class u8string : public iu8string
69 {
70 public:
71
72 typedef iu8string base_type;
74
75 typedef iu8string::value_type value_type;
76
77 static ETL_CONSTANT size_t MAX_SIZE = MAX_SIZE_;
78
79 //*************************************************************************
81 //*************************************************************************
83 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
84 {
85 this->initialise();
86 }
87
88 //*************************************************************************
91 //*************************************************************************
93 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
94 {
95 this->initialise();
96 this->assign(other);
97 }
98
99 //*************************************************************************
102 //*************************************************************************
104 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
105 {
106 this->initialise();
107 this->assign(other);
108 }
109
110 //*************************************************************************
115 //*************************************************************************
116 u8string(const etl::iu8string& other, size_t position, size_t length = npos)
117 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
118 {
119 ETL_ASSERT(position < other.size(), ETL_ERROR(string_out_of_bounds));
120
121 this->initialise();
122 this->assign(other, position, length);
123 }
124
125 //*************************************************************************
128 //*************************************************************************
129 ETL_EXPLICIT_STRING_FROM_CHAR u8string(const value_type* text)
130 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
131 {
132 this->initialise();
133 this->assign(text);
134 }
135
136 //*************************************************************************
140 //*************************************************************************
141 u8string(const value_type* text, size_t count)
142 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
143 {
144 this->initialise();
145 this->assign(text, text + count);
146 }
147
148 //*************************************************************************
152 //*************************************************************************
153 u8string(size_type count, value_type c)
154 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
155 {
156 this->initialise();
157 this->resize(count, c);
158 }
159
160 //*************************************************************************
165 //*************************************************************************
166 template <typename TIterator>
168 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
169 {
170 this->initialise();
171 this->assign(first, last);
172 }
173
174#if ETL_HAS_INITIALIZER_LIST
175 //*************************************************************************
177 //*************************************************************************
178 u8string(std::initializer_list<value_type> init)
179 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
180 {
181 this->initialise();
182 this->assign(init.begin(), init.end());
183 }
184#endif
185
186 //*************************************************************************
189 //*************************************************************************
191 : iu8string(reinterpret_cast<value_type*>(&buffer), MAX_SIZE)
192 {
193 this->initialise();
194 this->assign(view.begin(), view.end());
195 }
196
197 //*************************************************************************
201 //*************************************************************************
202 etl::u8string<MAX_SIZE_> substr(size_type position = 0, size_type length_ = npos) const
203 {
205
206 if (position != this->size())
207 {
209
210 length_ = etl::min(length_, this->size() - position);
211
212 new_string.assign(buffer + position, buffer + position + length_);
213 }
214
215 return new_string;
216 }
217
218 //*************************************************************************
220 //*************************************************************************
222 {
223 if (&rhs != this)
224 {
225 this->assign(rhs);
226 }
227
228 return *this;
229 }
230
231
232 //*************************************************************************
234 //*************************************************************************
236 {
237 if (&rhs != this)
238 {
239 this->assign(rhs);
240 }
241
242 return *this;
243 }
244
245 //*************************************************************************
247 //*************************************************************************
248 u8string& operator = (const value_type* text)
249 {
250 this->assign(text);
251
252 return *this;
253 }
254
255 //*************************************************************************
257 //*************************************************************************
259 {
260 this->assign(view);
261
262 return *this;
263 }
264
265 //*************************************************************************
267 //*************************************************************************
268#if ETL_HAS_ISTRING_REPAIR
269 virtual void repair() ETL_OVERRIDE
270#else
271 void repair()
272#endif
273 {
275 }
276
277 private:
278
279 value_type buffer[MAX_SIZE + 1];
280 };
281
282 template <size_t MAX_SIZE_>
283 ETL_CONSTANT size_t u8string<MAX_SIZE_>::MAX_SIZE;
284
285 //***************************************************************************
288 //***************************************************************************
289 class u8string_ext : public iu8string
290 {
291 public:
292
293 typedef iu8string base_type;
295
296 typedef iu8string::value_type value_type;
297 typedef iu8string::size_type size_type;
298
299 //*************************************************************************
301 //*************************************************************************
302 u8string_ext(value_type* buffer, size_type buffer_size)
303 : iu8string(buffer, buffer_size - 1U)
304 {
305 this->initialise();
306 }
307
308 //*************************************************************************
311 //*************************************************************************
312 u8string_ext(const etl::u8string_ext& other, value_type* buffer, size_type buffer_size)
313 : iu8string(buffer, buffer_size - 1U)
314 {
315 this->initialise();
316 this->assign(other);
317 }
318
319 //*************************************************************************
322 //*************************************************************************
323 u8string_ext(const etl::iu8string& other, value_type* buffer, size_type buffer_size)
324 : iu8string(buffer, buffer_size - 1U)
325 {
326 this->initialise();
327 this->assign(other);
328 }
329
330 //*************************************************************************
335 //*************************************************************************
336 u8string_ext(const etl::iu8string& other, value_type* buffer, size_type buffer_size, size_type position, size_type length = npos)
337 : iu8string(buffer, buffer_size - 1U)
338 {
339 ETL_ASSERT(position < other.size(), ETL_ERROR(string_out_of_bounds));
340
341 this->initialise();
342 this->assign(other, position, length);
343 }
344
345 //*************************************************************************
348 //*************************************************************************
349 u8string_ext(const char8_t* text, char8_t* buffer, size_type buffer_size)
350 : iu8string(buffer, buffer_size - 1U)
351 {
352 // Is the initial text at the same address as the buffer?
353 if (text == buffer)
354 {
355 this->current_size = etl::strlen(buffer);
356 }
357 else
358 {
359 this->initialise();
360 this->assign(text, text + etl::strlen(text));
361 }
362 }
363
364 //*************************************************************************
368 //*************************************************************************
369 u8string_ext(const value_type* text, size_type count, value_type* buffer, size_type buffer_size)
370 : iu8string(buffer, buffer_size - 1U)
371 {
372 this->initialise();
373 this->assign(text, text + count);
374 }
375
376 //*************************************************************************
380 //*************************************************************************
381 u8string_ext(size_type count, value_type c, value_type* buffer, size_type buffer_size)
382 : iu8string(buffer, buffer_size - 1U)
383 {
384 this->initialise();
385 this->resize(count, c);
386 }
387
388 //*************************************************************************
393 //*************************************************************************
394 template <typename TIterator>
395 u8string_ext(TIterator first, TIterator last, value_type* buffer, size_type buffer_size, typename etl::enable_if<!etl::is_integral<TIterator>::value, int>::type = 0)
396 : iu8string(buffer, buffer_size - 1U)
397 {
398 this->initialise();
399 this->assign(first, last);
400 }
401
402#if ETL_HAS_INITIALIZER_LIST
403 //*************************************************************************
405 //*************************************************************************
406 u8string_ext(std::initializer_list<value_type> init, value_type* buffer, size_type buffer_size)
407 : iu8string(buffer, buffer_size - 1U)
408 {
409 this->initialise();
410 this->assign(init.begin(), init.end());
411 }
412#endif
413
414 //*************************************************************************
417 //*************************************************************************
418 explicit u8string_ext(const etl::u8string_view& view, value_type* buffer, size_type buffer_size)
419 : iu8string(buffer, buffer_size - 1U)
420 {
421 this->initialise();
422 this->assign(view.begin(), view.end());
423 }
424
425 //*************************************************************************
427 //*************************************************************************
429 {
430 if (&rhs != this)
431 {
432 this->assign(rhs);
433 }
434
435 return *this;
436 }
437
438 //*************************************************************************
440 //*************************************************************************
442 {
443 if (&rhs != this)
444 {
445 this->assign(rhs);
446 }
447
448 return *this;
449 }
450
451 //*************************************************************************
453 //*************************************************************************
454 u8string_ext& operator = (const value_type* text)
455 {
456 this->assign(text);
457
458 return *this;
459 }
460
461 //*************************************************************************
463 //*************************************************************************
465 {
466 this->assign(view);
467
468 return *this;
469 }
470
471 //*************************************************************************
473 //*************************************************************************
474#if ETL_HAS_ISTRING_REPAIR
475 virtual void repair() ETL_OVERRIDE
476#else
477 void repair()
478#endif
479 {
480 }
481
482 private:
483
484 //*************************************************************************
486 //*************************************************************************
487 u8string_ext(const u8string_ext& other) ETL_DELETE;
488 };
489
490 //*************************************************************************
492 //*************************************************************************
493#if ETL_USING_8BIT_TYPES
495 template <>
496 struct hash<etl::iu8string>
497 {
498 size_t operator()(const etl::iu8string& text) const
499 {
500 return etl::private_hash::generic_hash<size_t>(reinterpret_cast<const uint8_t*>(text.data()),
501 reinterpret_cast<const uint8_t*>(text.data() + text.size()));
502 }
503 };
504
505 template <size_t SIZE>
506 struct hash<etl::u8string<SIZE> >
507 {
508 size_t operator()(const etl::u8string<SIZE>& text) const
509 {
510 return etl::private_hash::generic_hash<size_t>(reinterpret_cast<const uint8_t*>(text.data()),
511 reinterpret_cast<const uint8_t*>(text.data() + text.size()));
512 }
513 };
514
515 template <>
516 struct hash<etl::u8string_ext>
517 {
518 size_t operator()(const etl::u8string_ext& text) const
519 {
520 return etl::private_hash::generic_hash<size_t>(reinterpret_cast<const uint8_t*>(text.data()),
521 reinterpret_cast<const uint8_t*>(text.data() + text.size()));
522 }
523 };
525#endif
526
527 //***************************************************************************
529 //***************************************************************************
530 template<size_t Array_Size>
531 etl::u8string<Array_Size - 1U> make_string(const char(&text)[Array_Size])
532 {
533 return etl::u8string<Array_Size - 1U>(text, etl::strlen(text, Array_Size - 1));
534 }
535
536 //***************************************************************************
538 //***************************************************************************
539 template<size_t MAX_SIZE, size_t SIZE>
541 {
542 return etl::u8string<MAX_SIZE>(text, etl::strlen(text, SIZE));
543 }
544}
545#endif
546
547#include "private/minmax_pop.h"
548
549#endif
String view.
Definition string_view.h:104
ETL_CONSTEXPR const_iterator begin() const
Returns a const iterator to the beginning of the array.
Definition string_view.h:204
Definition basic_string.h:351
void resize(size_type new_size)
Definition basic_string.h:481
void assign(const etl::ibasic_string< T > &other)
Definition basic_string.h:677
pointer data()
Definition basic_string.h:640
void initialise()
Initialise the string.
Definition basic_string.h:2548
void repair_buffer(T *p_buffer_)
Fix the internal pointers after a low level memory copy.
Definition basic_string.h:2560
size_type length() const
Definition basic_string.h:202
size_type current_size
The current number of elements in the string.
Definition basic_string.h:336
size_type size() const
Definition basic_string.h:193
Definition basic_string.h:115
Definition u8string.h:290
u8string_ext(TIterator first, TIterator last, value_type *buffer, size_type buffer_size, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition u8string.h:395
u8string_ext(const char8_t *text, char8_t *buffer, size_type buffer_size)
Definition u8string.h:349
u8string_ext & operator=(const u8string_ext &rhs)
Assignment operator.
Definition u8string.h:428
u8string_ext(const etl::u8string_ext &other, value_type *buffer, size_type buffer_size)
Definition u8string.h:312
u8string_ext(const etl::iu8string &other, value_type *buffer, size_type buffer_size, size_type position, size_type length=npos)
Definition u8string.h:336
void repair()
Fix the internal pointers after a low level memory copy.
Definition u8string.h:477
u8string_ext(value_type *buffer, size_type buffer_size)
Constructor.
Definition u8string.h:302
u8string_ext(const value_type *text, size_type count, value_type *buffer, size_type buffer_size)
Definition u8string.h:369
u8string_ext(const etl::iu8string &other, value_type *buffer, size_type buffer_size)
Definition u8string.h:323
u8string_ext(size_type count, value_type c, value_type *buffer, size_type buffer_size)
Definition u8string.h:381
u8string_ext(const etl::u8string_view &view, value_type *buffer, size_type buffer_size)
Definition u8string.h:418
Definition u8string.h:69
u8string & operator=(const u8string &rhs)
Assignment operator.
Definition u8string.h:221
u8string(const value_type *text, size_t count)
Definition u8string.h:141
u8string(size_type count, value_type c)
Definition u8string.h:153
void repair()
Fix the internal pointers after a low level memory copy.
Definition u8string.h:271
etl::u8string< MAX_SIZE_ > substr(size_type position=0, size_type length_=npos) const
Definition u8string.h:202
u8string(const etl::u8string_view &view)
Definition u8string.h:190
u8string(const etl::iu8string &other, size_t position, size_t length=npos)
Definition u8string.h:116
u8string(const etl::u8string< MAX_SIZE_ > &other)
Definition u8string.h:92
ETL_EXPLICIT_STRING_FROM_CHAR u8string(const value_type *text)
Definition u8string.h:129
u8string()
Constructor.
Definition u8string.h:82
u8string(TIterator first, TIterator last, typename etl::enable_if<!etl::is_integral< TIterator >::value, int >::type=0)
Definition u8string.h:167
u8string(const etl::iu8string &other)
Definition u8string.h:103
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
enable_if
Definition type_traits_generator.h:1230
is_integral
Definition type_traits_generator.h:1040
bitset_ext
Definition absolute.h:38
etl::string< Array_Size - 1U > make_string(const char(&text)[Array_Size])
Hash function.
Definition string.h:526
etl::string< MAX_SIZE > make_string_with_capacity(const char(&text)[SIZE])
Make string with max capacity from string literal or array.
Definition string.h:535
ETL_CONSTEXPR14 size_t strlen(const T *t)
Alternative strlen for all character types.
Definition char_traits.h:287
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314