xtd - Reference Guide  0.1.2
Modern c++17/20 framework to create console, GUI and unit test applications on Windows, macOS, Linux, iOS and android.
Loading...
Searching...
No Matches
ustring.h
Go to the documentation of this file.
1
3#pragma once
4
6#define __XTD_CORE_INTERNAL__
7#include "internal/__generic_stream_output.h"
8#include "internal/__format_information.h"
9#include "internal/__format_stringer.h"
10#include "internal/__sprintf.h"
11#undef __XTD_CORE_INTERNAL__
13
14#include <string>
15#include "string_comparison.h"
17#include "types.h"
18#include "object.h"
19#include "parse.h"
20#include "to_string.h"
21
22#if !defined(_WIN32)
23#include <cxxabi.h>
24#endif
25
27namespace xtd {
28 class ustring;
29}
30template<typename ...args_t>
31void __ustring_extract_format_arg(xtd::ustring& fmt, std::vector<__format_information<char>>& format, args_t&&... args);
32void __throw_ustring_format_exception();
33void __throw_ustring_format_exception_close_bracket();
34void __throw_ustring_format_exception_open_bracket();
35void __throw_ustring_format_exception_start_colon();
37
38namespace xtd {
48 class ustring : public object, public std::basic_string<char> {
49 public:
51 ustring() noexcept;
54 explicit ustring(const allocator_type& allocator) noexcept;
55
60 ustring(size_t count, value_type character);
66 ustring(size_t count, value_type character, const allocator_type& allocator);
71 ustring(size_t count, char8_t character);
77 ustring(size_t count, char8_t character, const allocator_type& allocator);
82 ustring(size_t count, char16_t character);
88 ustring(size_t count, char16_t character, const allocator_type& allocator);
93 ustring(size_t count, char32_t character);
99 ustring(size_t count, char32_t character, const allocator_type& allocator);
104 ustring(size_t count, wchar_t character);
110 ustring(size_t count, wchar_t character, const allocator_type& allocator);
111
116 ustring(const ustring& str, size_t index, size_t count);
122 ustring(const ustring& str, size_t index, size_t count, const allocator_type& allocator);
126 ustring(const ustring& str, size_t index);
131 ustring(const ustring& str, size_t index, const allocator_type& allocator);
132
135 ustring(const value_type* str, size_t count);
140 ustring(const value_type* str, size_t count, const allocator_type& allocator);
141
143 ustring(const value_type* str);
147 ustring(const value_type* str, const allocator_type& allocator);
148
150 ustring(value_type* str);
154 ustring(value_type* str, const allocator_type& allocator);
155
158 ustring(const ustring& str) noexcept;
162 ustring(const ustring& str, const allocator_type& allocator) noexcept;
163
166 ustring(const std::string& str) noexcept;
170 ustring(const std::string& str, const allocator_type& allocator) noexcept;
171
174 ustring(const std::u8string& str) noexcept;
178 ustring(const std::u8string& str, const allocator_type& allocator) noexcept;
179
181 ustring(const char8_t* str);
185 ustring(const char8_t* str, const allocator_type& allocator);
186
188 ustring(char8_t* str);
192 ustring(char8_t* str, const allocator_type& allocator);
193
196 ustring(const std::u16string& str) noexcept;
200 ustring(const std::u16string& str, const allocator_type& allocator) noexcept;
201
203 ustring(const char16_t* str);
207 ustring(const char16_t* str, const allocator_type& allocator);
208
210 ustring(char16_t* str);
214 ustring(char16_t* str, const allocator_type& allocator);
215
218 ustring(const std::u32string& str) noexcept;
222 ustring(const std::u32string& str, const allocator_type& allocator) noexcept;
223
225 ustring(const char32_t* str);
229 ustring(const char32_t* str, const allocator_type& allocator);
230
232 ustring(char32_t* str);
236 ustring(char32_t* str, const allocator_type& allocator);
237
240 ustring(const std::wstring& str) noexcept;
244 ustring(const std::wstring& str, const allocator_type& allocator) noexcept;
245
247 ustring(const wchar_t* str);
251 ustring(const wchar_t* str, const allocator_type& allocator);
252
254 ustring(wchar_t* str);
258 ustring(wchar_t* str, const allocator_type& allocator);
259
262 ustring(ustring&& str) noexcept;
266 ustring(ustring&& str, const allocator_type& allocator) noexcept;
267
271 template<typename input_iterator_t>
272 ustring(input_iterator_t first, input_iterator_t last) : std::basic_string<value_type>(first, last) {}
277 template<typename input_iterator_t>
278 ustring(input_iterator_t first, input_iterator_t last, const allocator_type& allocator) : std::basic_string<value_type>(first, last, allocator) {}
279
282 ustring(std::initializer_list<value_type> il);
286 ustring(std::initializer_list<value_type> il, const allocator_type& allocator);
287
290 ustring(std::initializer_list<char8_t> il);
294 ustring(std::initializer_list<char8_t> il, const allocator_type& allocator);
295
298 ustring(std::initializer_list<char16_t> il);
302 ustring(std::initializer_list<char16_t> il, const allocator_type& allocator);
303
306 ustring(std::initializer_list<char32_t> il);
310 ustring(std::initializer_list<char32_t> il, const allocator_type& allocator);
311
314 ustring(std::initializer_list<wchar_t> il);
318 ustring(std::initializer_list<wchar_t> il, const allocator_type& allocator);
319
321 /*
322 template<typename type_t>
323 ustring(const type_t& object) : std::basic_string<value_type>(object) {}
324 template<typename type_t>
325 ustring(const type_t& object, const allocator_type& allocator) : std::basic_string<value_type>(object, allocator) {}
326 template<typename type_t>
327 ustring(const type_t& object, size_t index, size_t count) : std::basic_string<value_type>(object, index, count) {}
328 template<typename type_t>
329 ustring(const type_t& object, size_t index, size_t count, const allocator_type& allocator) : std::basic_string<value_type>(object, index, count, allocator) {}
330 template<typename type_t>
331 ustring(const type_t& object, size_t count) : std::basic_string<value_type>(object, 0, count) {}
332 template<typename type_t>
333 ustring(const type_t& object, size_t count, const allocator_type& allocator) : std::basic_string<value_type>(object, 0, count, allocator) {}
334 */
335
336 ustring& operator=(const ustring& str);
337 ustring& operator=(const std::string& str);
338 ustring& operator=(const value_type* str);
339 ustring& operator=(const std::u8string& str);
340 ustring& operator=(const char8_t* str);
341 ustring& operator=(const std::u16string& str);
342 ustring& operator=(const char16_t* str);
343 ustring& operator=(const std::u32string& str);
344 ustring& operator=(const char32_t* str);
345 ustring& operator=(const std::wstring& str);
346 ustring& operator=(const wchar_t* str);
347 ustring& operator=(ustring&& str) noexcept;
348
349 ustring& operator=(value_type character);
350 ustring& operator=(char8_t character);
351 ustring& operator=(char16_t character);
352 ustring& operator=(char32_t character);
353 ustring& operator=(wchar_t character);
354 ustring& operator=(const std::initializer_list<value_type>& il);
355 ustring& operator=(const std::initializer_list<char8_t>& il);
356 ustring& operator=(const std::initializer_list<char16_t>& il);
357 ustring& operator=(const std::initializer_list<char32_t>& il);
358 ustring& operator=(const std::initializer_list<wchar_t>& il);
359 //template<typename type_t>
360 //ustring& operator=(const type_t& object) {return std::basic_string<value_type>::assign(object);}
361
362 template<typename type_t>
363 ustring operator+(const type_t& object) const {
364 ustring result(*this);
365 result.append(object);
366 return result;
367 }
368
369 ustring& operator+=(const ustring& str);
370 ustring& operator+=(const std::string& str);
371 ustring& operator+=(const value_type* str);
372 ustring& operator+=(const std::u8string& str);
373 ustring& operator+=(const char8_t* str);
374 ustring& operator+=(const std::u16string& str);
375 ustring& operator+=(const char16_t* str);
376 ustring& operator+=(const std::u32string& str);
377 ustring& operator+=(const char32_t* str);
378 ustring& operator+=(const std::wstring& str);
379 ustring& operator+=(const wchar_t* str);
380 ustring& operator+=(value_type character);
381 ustring& operator+=(char8_t character);
382 ustring& operator+=(char16_t character);
383 ustring& operator+=(char32_t character);
384 ustring& operator+=(wchar_t character);
385 ustring& operator+=(const std::initializer_list<value_type>& il);
386 ustring& operator+=(const std::initializer_list<char8_t>& il);
387 ustring& operator+=(const std::initializer_list<char16_t>& il);
388 ustring& operator+=(const std::initializer_list<char32_t>& il);
389 ustring& operator+=(const std::initializer_list<wchar_t>& il);
390 template<typename type_t>
391 ustring& operator+=(const type_t& object) {
392 *this = *this + ustring(object);
393 return *this;
394 }
395
396 bool operator==(const ustring& other) const;
397 bool operator!=(const ustring& other) const;
398 bool operator==(const std::string other) const;
399 bool operator!=(const std::string other) const;
400 bool operator==(const value_type* other) const;
401 bool operator!=(const value_type* other) const;
402 bool operator==(const std::u8string other) const;
403 bool operator!=(const std::u8string other) const;
404 bool operator==(const char8_t* other) const;
405 bool operator!=(const char8_t* other) const;
406 bool operator==(const std::u16string other) const;
407 bool operator!=(const std::u16string other) const;
408 bool operator==(const char16_t* other) const;
409 bool operator!=(const char16_t* other) const;
410 bool operator==(const std::u32string other) const;
411 bool operator!=(const std::u32string other) const;
412 bool operator==(const char32_t* other) const;
413 bool operator!=(const char32_t* other) const;
414 bool operator==(const std::wstring other) const;
415 bool operator!=(const std::wstring other) const;
416 bool operator==(const wchar_t* other) const;
417 bool operator!=(const wchar_t* other) const;
418 const value_type& operator[](size_t index);
419 const value_type& operator[](size_t index) const;
420 ustring substr(size_type index = 0, size_type count = npos) const;
422
426 template<typename object_t>
427 static ustring full_class_name() {return demangle(typeid(object_t).name());}
428
432 template<typename object_t>
433 static ustring full_class_name(const object_t& object) {return demangle(typeid(object).name());}
434
438 static ustring full_class_name(const std::type_info& info) {return demangle(info.name());}
439
443 template<typename object_t>
444 static ustring class_name() {return get_class_name(full_class_name<object_t>());}
445
449 template<typename object_t>
450 static ustring class_name(const object_t& object) {return get_class_name(full_class_name(object));}
451
455 static ustring class_name(const std::type_info& info) {return get_class_name(full_class_name(info));}
456
457 using std::basic_string<value_type>::compare;
467 static int compare(const ustring& str_a, const ustring& str_b) noexcept;
478 static int compare(const ustring& str_a, const ustring& str_b, bool ignore_case) noexcept;
479
490 static int compare(const ustring& str_a, const ustring& str_b, xtd::string_comparison comparison_type) noexcept;
503 static int compare(const ustring& str_a, size_t index_a, const ustring& str_b, size_t index_b, size_t length) noexcept;
517 static int compare(const ustring& str_a, size_t index_a, const ustring& str_b, size_t index_b, size_t length, bool ignore_case) noexcept;
531 static int compare(const ustring& str_a, size_t index_a, const ustring& str_b, size_t index_b, size_t length, xtd::string_comparison comparison_type) noexcept;
532
539 static ustring concat(const ustring& str_a, const ustring& str_b, const ustring& str_c, const ustring& str_d) noexcept;
540
547 template<typename object_a_t, typename object_b_t, typename object_c_t, typename object_d_t>
548 static ustring concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c, object_d_t obj_d) noexcept {
549 return format("{}{}{}{}", obj_a, obj_b, obj_c, obj_d);
550 }
551
557 static ustring concat(const ustring& str_a, const ustring& str_b, const ustring& str_c) noexcept;
558
564 template<typename object_a_t, typename object_b_t, typename object_c_t>
565 static ustring concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c) noexcept {
566 return format("{}{}{}", obj_a, obj_b, obj_c);
567 }
568
573 static ustring concat(const ustring& str_a, const ustring& str_b) noexcept;
574
579 template<typename object_a_t, typename object_b_t>
580 static ustring concat(object_a_t obj_a, object_b_t obj_b) noexcept {
581 return format("{}{}", obj_a, obj_b);
582 }
583
587 static ustring concat(const std::vector<ustring>& values) noexcept;
588
590 static ustring concat(const std::vector<const value_type*>& values) noexcept;
591 static ustring concat(const std::vector<const char8_t*>& values) noexcept;
592 static ustring concat(const std::initializer_list<ustring>& values) noexcept;
593 static ustring concat(const std::initializer_list<const value_type*>& values) noexcept;
594 static ustring concat(const std::initializer_list<const char8_t*>& values) noexcept;
596
600 template<typename object_t>
601 static ustring concat(const std::vector<object_t>& args) noexcept {
602 ustring result;
603 for (const auto& arg : args)
604 result += format("{}", arg);
605 return result;
606 }
607
609 template<typename object_t>
610 static ustring concat(const std::initializer_list<object_t>& args) noexcept {
611 ustring result;
612 for (const auto& arg : args)
613 result += format("{}", arg);
614 return result;
615 }
617
621 template<typename value_t>
622 static ustring concat(value_t value) noexcept {
623 return format("{}", value);
624 }
625
628 static ustring demangle(const ustring& name) {
629#if defined(_WIN32)
630 ustring result = name;
631 for (auto& item : {"enum ", "class ", "union ", "struct "})
632 result = result.replace(item, "");
633 return result;
634#else
635 class auto_delete_char_pointer {
636 public:
637 auto_delete_char_pointer(char* value) : value_(value) {}
638 ~auto_delete_char_pointer() {free(value_);}
639 char* operator()() const {return value_;}
640 private:
641 char* value_;
642 };
643 int32_t status = 0;
644 return auto_delete_char_pointer(abi::__cxa_demangle(name.c_str(), 0, 0, &status))();
645#endif
646 }
647
651 bool contains(const ustring& value) const noexcept;
652
655 static ustring empty_string() noexcept;
656
660 bool ends_with(value_type value) const noexcept;
661
665 bool ends_with(char8_t value) const noexcept;
666
670 bool ends_with(const ustring& value) const noexcept;
671
675 bool ends_with(const ustring& value, bool ignore_case) const noexcept;
676
680 bool ends_with(const ustring& value, xtd::string_comparison comparison_type) const noexcept;
681
688 template<typename ...args_t>
689 static ustring format(const ustring& fmt, args_t&&... args) {
690 ustring result;
691 size_t index = 0;
692 std::vector<__format_information<char>> formats;
693 typename ustring::const_iterator begin_format_iterator = fmt.cend();
694 typename ustring::const_iterator end_format_iterator = fmt.cend();
695 for (typename ustring::const_iterator iterator = fmt.cbegin(); iterator != fmt.cend(); ++iterator) {
696 if (*iterator == '{') {
697 ++iterator;
698 if (*iterator == '{')
699 result += *iterator;
700 else {
701 begin_format_iterator = iterator;
702 while (*iterator != '}' && iterator != fmt.end()) ++iterator;
703 if (iterator == fmt.end())
704 __throw_ustring_format_exception_open_bracket();
705 end_format_iterator = iterator;
706 __format_information<char> fi;
707 fi.location = result.size();
708 std::string format {begin_format_iterator, end_format_iterator};
709 if (format.size() == 0)
710 fi.index = index++;
711 else {
712 size_t index_alignment_separator = ustring(format).index_of(',');
713 size_t index_format_separator = ustring(format).index_of(u8':');
714
715 if (index_alignment_separator != std::string::npos && index_format_separator != std::string::npos && index_alignment_separator > index_format_separator)
716 index_alignment_separator = std::string::npos;
717
718 if (index_alignment_separator != std::string::npos)
719 fi.alignment = format.substr(index_alignment_separator + 1, index_format_separator != std::string::npos ? index_format_separator - index_alignment_separator - 1 : std::string::npos);
720
721 if (index_format_separator != std::string::npos)
722 fi.format = format.substr(index_format_separator + 1);
723
724 if (index_alignment_separator == 0 || index_format_separator == 0)
725 fi.index = index++;
726 else {
727 std::string index_str;
728 if (index_alignment_separator != std::string::npos)
729 index_str = format.substr(0, index_alignment_separator);
730 else if (index_format_separator != std::string::npos)
731 index_str = format.substr(0, index_format_separator);
732 else
733 index_str = format;
734 try {
735 for (auto c : index_str)
736 if (!std::isdigit(c)) __throw_ustring_format_exception_start_colon();
737 fi.index = std::stoi(index_str);
738 } catch(...) {
739 __throw_ustring_format_exception_start_colon();
740 }
741 }
742 }
743 formats.push_back(fi);
744 }
745 } else if (*iterator == '}') {
746 if (++iterator == fmt.cend())
747 __throw_ustring_format_exception_close_bracket();
748 if (*iterator != '}')
749 __throw_ustring_format_exception_close_bracket();
750 result += *iterator;
751 } else
752 result += *iterator;
753 }
754
755 __ustring_extract_format_arg(result, formats, std::forward<args_t>(args)...);
756 return result.c_str();
757 }
758
761 size_t get_hash_code() const noexcept override;
762
766 size_t index_of(value_type value) const noexcept;
767
771 size_t index_of(const ustring& value) const noexcept;
772
777 size_t index_of(value_type value, size_t start_index) const noexcept;
778
783 size_t index_of(const ustring& value, size_t start_index) const noexcept;
784
790 size_t index_of(value_type value, size_t start_index, size_t count) const noexcept;
791
797 size_t index_of(const ustring& value, size_t start_index, size_t count) const noexcept;
798
802 size_t index_of_any(const std::vector<value_type>& values) const noexcept;
803
808 size_t index_of_any(const std::vector<value_type>& values, size_t start_index) const noexcept;
809
815 size_t index_of_any(const std::vector<value_type>& values, size_t start_index, size_t count) const noexcept;
816
818 size_t index_of_any(const std::initializer_list<value_type>& values) const noexcept;
819 size_t index_of_any(const std::initializer_list<value_type>& values, size_t start_index) const noexcept;
820 size_t index_of_any(const std::initializer_list<value_type>& values, size_t start_index, size_t count) const noexcept;
822
829 ustring insert(size_t start_index, const ustring& value) const noexcept;
830
833 bool is_empty() const noexcept;
834
841 template<typename collection_t>
842 static ustring join(const ustring separator, const collection_t& values) noexcept {return join(separator, values, 0, values.size());}
843
851 template<typename collection_t>
852 static ustring join(const ustring& separator, const collection_t& values, size_t index) noexcept {return join(separator, values, index, values.size()-index);}
853
862 template<typename collection_t>
863 static ustring join(const ustring& separator, const collection_t& values, size_t index, size_t count) noexcept {
864 size_t i = 0;
865 ustring result;
866 for (const auto& item : values) {
867 if (i >= index) {
868 if (i != index) result += separator;
869 result += format("{}", item);
870 }
871 if (++i >= index + count) break;
872 }
873 return result;
874 }
875
877 template<typename value_t>
878 static ustring join(const ustring& separator, const std::initializer_list<value_t>& values) noexcept {return join(separator, std::vector<value_t>(values));}
879 template<typename value_t>
880 static ustring join(const ustring& separator, const std::initializer_list<value_t>& values, size_t index) noexcept {return join(separator, std::vector<value_t>(values), index);}
881 template<typename value_t>
882 static ustring join(const ustring& separator, const std::initializer_list<value_t>& values, size_t index, size_t count) noexcept {return join(separator, std::vector<value_t>(values), index, count);}
884
888 size_t last_index_of(value_type value) const noexcept;
889
893 size_t last_index_of(const ustring& value) const noexcept;
894
899 size_t last_index_of(value_type value, size_t start_index) const noexcept;
900
905 size_t last_index_of(const ustring& value, size_t start_index) const noexcept;
906
913 size_t last_index_of(value_type value, size_t start_index, size_t count) const noexcept;
914
920 size_t last_index_of(const ustring& value, size_t start_index, size_t count) const noexcept;
921
925 size_t last_index_of_any(const std::vector<value_type>& values) const noexcept;
926
931 size_t last_index_of_any(const std::vector<value_type>& values, size_t start_index) const noexcept;
932
938 size_t last_index_of_any(const std::vector<value_type>& values, size_t start_index, size_t count) const noexcept;
939
941 size_t last_index_of_any(const std::initializer_list<value_type>& values) const noexcept;
942 size_t last_index_of_any(const std::initializer_list<value_type>& values, size_t start_index) const noexcept;
943 size_t last_index_of_any(const std::initializer_list<value_type>& values, size_t start_index, size_t count) const noexcept;
945
951 ustring pad_left(size_t total_width) const noexcept;
952
959 ustring pad_left(size_t total_width, value_type padding_char) const noexcept;
960
966 ustring pad_right(size_t total_width) const noexcept;
967
974 ustring pad_right(size_t total_width, value_type padding_char) const noexcept;
975
979 ustring remove(size_t start_index) const noexcept;
980
985 ustring remove(size_t start_index, size_t count) const noexcept;
986
991 ustring replace(value_type old_char, value_type new_char) const noexcept;
992
998 ustring replace(const ustring& old_string, const ustring& new_string) const noexcept;
999
1011 std::vector<ustring> split(const std::vector<value_type>& separators, size_t count, string_split_options options) const noexcept;
1012
1017 std::vector<ustring> split() const noexcept;
1018
1024 std::vector<ustring> split(const std::vector<value_type>& separators) const noexcept;
1025
1042 std::vector<ustring> split(const std::vector<value_type>& separators, string_split_options options) const noexcept;
1043
1052 std::vector<ustring> split(const std::vector<value_type>& separators, size_t count) const noexcept;
1053
1113 template<typename ... args_t>
1114 static ustring sprintf(const ustring& fmt, args_t&& ... args) noexcept {return __sprintf(fmt.c_str(), convert_param(std::forward<args_t>(args)) ...);}
1115
1120 bool starts_with(value_type value) const noexcept;
1121
1127 bool starts_with(value_type value, bool ignore_case) const noexcept;
1128
1133 bool starts_with(const ustring& value) const noexcept;
1134
1140 bool starts_with(const ustring& value, bool ignore_case) const noexcept;
1141
1146 ustring substring(size_t start_index) const noexcept;
1147
1152 ustring substring(size_t start_index, size_t length) const noexcept;
1153
1156 std::vector<value_type> to_array() const noexcept;
1157
1161 std::vector<value_type> to_array(size_t start_index) const noexcept;
1162
1167 std::vector<value_type> to_array(size_t start_index, size_t length) const noexcept;
1168
1171 ustring to_lower() const noexcept;
1172
1173 //ustring to_string() const noexcept override;
1174 ustring to_string() const noexcept override;
1175
1178 ustring to_upper() const noexcept;
1179
1184 ustring trim() const noexcept;
1185
1190 ustring trim(value_type trim_char) const noexcept;
1191
1196 ustring trim(const std::vector<value_type>& trim_chars) const noexcept;
1197
1202 ustring trim_end() const noexcept;
1203
1208 ustring trim_end(value_type trim_char) const noexcept;
1209
1214 ustring trim_end(const std::vector<value_type>& trim_chars) const noexcept;
1215
1220 ustring trim_start() const noexcept;
1221
1226 ustring trim_start(value_type trim_char) const noexcept;
1227
1232 ustring trim_start(const std::vector<value_type>& trim_chars) const noexcept;
1233
1234 template<typename value_t>
1235 static value_t parse(const ustring& str) {
1236 return xtd::parse<value_t>(str);
1237 }
1238
1239 template<typename value_t>
1240 static bool try_parse(const ustring& str, value_t& value) {
1241 try {
1242 value = parse<value_t>(str);
1243 return true;
1244 } catch(...) {
1245 return false;
1246 }
1247 }
1248
1250 friend std::ostream& operator<<(std::ostream& stream, const ustring& str) {return stream << str.c_str();}
1251 friend std::istream& operator>>(std::istream& stream, ustring& str) {
1252 std::string s;
1253 stream >> s;
1254 str = s;
1255 return stream;
1256 }
1257
1258 friend ustring operator+(const ustring& str_a, const ustring& str_b) {
1259 ustring result = str_a;
1260 result.append(str_b);
1261 return result;
1262 }
1263
1264 friend ustring operator+(const ustring& str_a, const std::string& str_b) {
1265 ustring result = str_a;
1266 result.append(ustring(str_b));
1267 return result;
1268 }
1269
1270 friend ustring operator+(const ustring& str_a, const value_type* str_b) {
1271 ustring result = str_a;
1272 result.append(ustring(str_b));
1273 return result;
1274 }
1275
1276 friend ustring operator+(const ustring& str_a, const std::u8string& str_b) {
1277 ustring result = str_a;
1278 result.append(ustring(str_b));
1279 return result;
1280 }
1281
1282 friend ustring operator+(const ustring& str_a, const char8_t* str_b) {
1283 ustring result = str_a;
1284 result.append(ustring(str_b));
1285 return result;
1286 }
1287
1288 friend ustring operator+(const ustring& str_a, const std::u16string& str_b) {
1289 ustring result = str_a;
1290 result.append(ustring(str_b));
1291 return result;
1292 }
1293
1294 friend ustring operator+(const ustring& str_a, const char16_t* str_b) {
1295 ustring result = str_a;
1296 result.append(ustring(str_b));
1297 return result;
1298 }
1299
1300 friend ustring operator+(const ustring& str_a, const std::u32string& str_b) {
1301 ustring result = str_a;
1302 result.append(ustring(str_b));
1303 return result;
1304 }
1305
1306 friend ustring operator+(const ustring& str_a, const char32_t* str_b) {
1307 ustring result = str_a;
1308 result.append(ustring(str_b));
1309 return result;
1310 }
1311
1312 friend ustring operator+(const ustring& str_a, const std::wstring& str_b) {
1313 ustring result = str_a;
1314 result.append(ustring(str_b));
1315 return result;
1316 }
1317
1318 friend ustring operator+(const ustring& str_a, const wchar_t* str_b) {
1319 ustring result = str_a;
1320 result.append(ustring(str_b));
1321 return result;
1322 }
1323
1324 friend ustring operator+(const ustring& str_a, value_type character) {
1325 ustring result = str_a;
1326 result.append(ustring(1, character));
1327 return result;
1328 }
1329
1330 friend ustring operator+(const ustring& str_a, char8_t character) {
1331 ustring result = str_a;
1332 result.append(ustring(1, character));
1333 return result;
1334 }
1335
1336 friend ustring operator+(const ustring& str_a, char16_t character) {
1337 ustring result = str_a;
1338 result.append(ustring(1, character));
1339 return result;
1340 }
1341
1342 friend ustring operator+(const ustring& str_a, char32_t character) {
1343 ustring result = str_a;
1344 result.append(ustring(1, character));
1345 return result;
1346 }
1347
1348 friend ustring operator+(const ustring& str_a, wchar_t character) {
1349 ustring result = str_a;
1350 result.append(ustring(1, character));
1351 return result;
1352 }
1353
1354 friend ustring operator+(const ustring& str_a, const std::initializer_list<value_type>& il) {
1355 ustring result = str_a;
1356 result.append(ustring(il));
1357 return result;
1358 }
1359
1360 friend ustring operator+(const ustring& str_a, const std::initializer_list<char8_t>& il) {
1361 ustring result = str_a;
1362 result.append(ustring(il));
1363 return result;
1364 }
1365
1366 friend ustring operator+(const ustring& str_a, const std::initializer_list<char16_t>& il) {
1367 ustring result = str_a;
1368 result.append(ustring(il));
1369 return result;
1370 }
1371
1372 friend ustring operator+(const ustring& str_a, const std::initializer_list<char32_t>& il) {
1373 ustring result = str_a;
1374 result.append(ustring(il));
1375 return result;
1376 }
1377
1378 friend ustring operator+(const ustring& str_a, const std::initializer_list<wchar_t>& il) {
1379 ustring result = str_a;
1380 result.append(ustring(il));
1381 return result;
1382 }
1383
1384 friend ustring operator+(const std::string& str_a, const ustring& str_b) {
1385 ustring result(str_a);
1386 result.append(str_b);
1387 return result;
1388 }
1389
1390 friend ustring operator+(const value_type* str_a, const ustring& str_b) {
1391 ustring result(str_a);
1392 result.append(str_b);
1393 return result;
1394 }
1395
1396 friend ustring operator+(const std::u8string& str_a, const ustring& str_b) {
1397 ustring result(str_a);
1398 result.append(str_b);
1399 return result;
1400 }
1401
1402 friend ustring operator+(const char8_t* str_a, const ustring& str_b) {
1403 ustring result(str_a);
1404 result.append(str_b);
1405 return result;
1406 }
1407
1408 friend ustring operator+(const std::u16string& str_a, const ustring& str_b) {
1409 ustring result(str_a);
1410 result.append(str_b);
1411 return result;
1412 }
1413
1414 friend ustring operator+(const char16_t* str_a, const ustring& str_b) {
1415 ustring result(str_a);
1416 result.append(str_b);
1417 return result;
1418 }
1419
1420 friend ustring operator+(const std::u32string& str_a, const ustring& str_b) {
1421 ustring result(str_a);
1422 result.append(str_b);
1423 return result;
1424 }
1425
1426 friend ustring operator+(const char32_t* str_a, const ustring& str_b) {
1427 ustring result(str_a);
1428 result.append(str_b);
1429 return result;
1430 }
1431
1432 friend ustring operator+(const std::wstring& str_a, const ustring& str_b) {
1433 ustring result(str_a);
1434 result.append(str_b);
1435 return result;
1436 }
1437
1438 friend ustring operator+(const wchar_t* str_a, const ustring& str_b) {
1439 ustring result(str_a);
1440 result.append(str_b);
1441 return result;
1442 }
1443
1444 friend ustring operator+(value_type character, const ustring& str_b) {
1445 ustring result(1, character);
1446 result.append(str_b);
1447 return result;
1448 }
1449
1450 friend ustring operator+(char8_t character, const ustring& str_b) {
1451 ustring result(1, character);
1452 result.append(str_b);
1453 return result;
1454 }
1455
1456 friend ustring operator+(char16_t character, const ustring& str_b) {
1457 ustring result(1, character);
1458 result.append(str_b);
1459 return result;
1460 }
1461
1462 friend ustring operator+(char32_t character, const ustring& str_b) {
1463 ustring result(1, character);
1464 result.append(str_b);
1465 return result;
1466 }
1467
1468 friend ustring operator+(wchar_t character, const ustring& str_b) {
1469 ustring result(1, character);
1470 result.append(str_b);
1471 return result;
1472 }
1473
1474 friend ustring operator+(const std::initializer_list<value_type>& il, const ustring& str_b) {
1475 ustring result(il);
1476 result.append(str_b);
1477 return result;
1478 }
1479
1480 friend ustring operator+(const std::initializer_list<char8_t>& il, const ustring& str_b) {
1481 ustring result(il);
1482 result.append(str_b);
1483 return result;
1484 }
1485
1486 friend ustring operator+(const std::initializer_list<char16_t>& il, const ustring& str_b) {
1487 ustring result(il);
1488 result.append(str_b);
1489 return result;
1490 }
1491
1492 friend ustring operator+(const std::initializer_list<char32_t>& il, const ustring& str_b) {
1493 ustring result(il);
1494 result.append(str_b);
1495 return result;
1496 }
1497
1498 friend ustring operator+(const std::initializer_list<wchar_t>& il, const ustring& str_b) {
1499 ustring result(il);
1500 result.append(str_b);
1501 return result;
1502 }
1504
1505 private:
1506 template<typename arg_t>
1507 static auto convert_param(arg_t&& arg) noexcept {
1508 if constexpr (std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>, std::string>::value) return std::forward<arg_t>(arg).c_str();
1509 else if constexpr (std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>, std::wstring>::value) return std::forward<arg_t>(arg).c_str();
1510 else return std::forward<arg_t>(arg);
1511 }
1512
1513 static ustring get_class_name(const ustring& full_name);
1514
1515 using std::basic_string<value_type>::assign;
1516 using std::basic_string<value_type>::reserve;
1517 using std::basic_string<value_type>::shrink_to_fit;
1518 using std::basic_string<value_type>::clear;
1519 using std::basic_string<value_type>::erase;
1520 using std::basic_string<value_type>::push_back;
1521 using std::basic_string<value_type>::pop_back;
1522 using std::basic_string<value_type>::append;
1523 using std::basic_string<value_type>::replace;
1524 using std::basic_string<value_type>::resize;
1525 };
1526
1534 ustring to_ustring(unsigned val);
1542 ustring to_ustring(unsigned long val);
1546 ustring to_ustring(long long val);
1550 ustring to_ustring(unsigned long long val);
1558 ustring to_ustring(double val);
1562 ustring to_ustring(long double val);
1566 template <typename type_t>
1567 ustring to_ustring(type_t val) {
1568 return ustring::format("{}", val);
1569 }
1570}
1571
1573template<typename arg_t>
1574void __ustring_extract_format_arg(std::string& fmt, size_t& index, std::vector<__format_information<char>>& formats, arg_t&& arg) {
1575 size_t offset = 0;
1576 for (auto& format : formats) {
1577 format.location += offset;
1578 if (format.index == index) {
1579 xtd::ustring arg_str = format.format.empty() ? __format_stringer<char, arg_t>(arg) : xtd::to_string(arg, format.format);
1580
1581 if (!format.alignment.empty()) {
1582 int alignment = 0;
1583 try {
1584 alignment = std::stoi(format.alignment);
1585 } catch(...) {
1586 __throw_ustring_format_exception();
1587 }
1588 if (alignment > 0) arg_str = arg_str.pad_left(alignment);
1589 else if (alignment < 0) arg_str = arg_str.pad_right(-alignment);
1590 }
1591 fmt.insert(format.location, arg_str);
1592 offset += arg_str.size();
1593 }
1594 }
1595 ++index;
1596}
1597
1598template <typename ...args_t>
1599void __xtd_ustrings_unused(args_t&& ... args) {}
1600
1601template<typename ...args_t>
1602void __ustring_extract_format_arg(xtd::ustring& fmt, std::vector<__format_information<char>>& formats, args_t&&... args) {
1603 size_t index = 0;
1604 (__ustring_extract_format_arg(fmt, index, formats, args),...);
1605 __xtd_ustrings_unused(index); // workaround to mute gcc warning: unused-but-set-variable
1606}
Supports all classes in the xtd class hierarchy and provides low-level services to derived classes....
Definition object.h:26
Represents text as a sequence of UTF-8 code units.
Definition ustring.h:48
ustring(std::initializer_list< value_type > il, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified initializer list and allocator.
ustring remove(size_t start_index, size_t count) const noexcept
Deletes all the characters from this string beginning at a specified position and continuing through ...
static ustring concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c) noexcept
Concatenates three specified instances of object.
Definition ustring.h:565
size_t last_index_of_any(const std::vector< value_type > &values) const noexcept
Reports the index of the last occurrence in this instance of any character in a specified array of ch...
size_t last_index_of(const ustring &value, size_t start_index) const noexcept
Reports the index of the last occurrence of the specified character in this string....
size_t last_index_of(const ustring &value, size_t start_index, size_t count) const noexcept
Reports the index of the last occurrence of the specified character in this string....
ustring(std::initializer_list< char32_t > il, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified initializer list and allocator.
ustring(std::initializer_list< char32_t > il)
Initializes a new instance of xtd::ustring with specified initializer list.
size_t last_index_of(value_type value) const noexcept
Reports the index of the last occurrence of the specified character in this tring.
ustring(std::initializer_list< wchar_t > il)
Initializes a new instance of xtd::ustring with specified initializer list.
bool is_empty() const noexcept
Indicates whether this string is an empty string ("").
ustring(input_iterator_t first, input_iterator_t last, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified first and last iterators of substring and a...
Definition ustring.h:278
static ustring demangle(const ustring &name)
Gets demangled string of name,.
Definition ustring.h:628
static int compare(const ustring &str_a, size_t index_a, const ustring &str_b, size_t index_b, size_t length, xtd::string_comparison comparison_type) noexcept
Compares substrings of two specified string objects using the specified rules, and returns an integer...
ustring(std::initializer_list< char8_t > il)
Initializes a new instance of xtd::ustring with specified initializer list.
ustring(std::initializer_list< value_type > il)
Initializes a new instance of xtd::ustring with specified initializer list.
size_t last_index_of(value_type value, size_t start_index) const noexcept
Reports the index of the last occurrence of the specified character in this string....
ustring substring(size_t start_index, size_t length) const noexcept
Retrieves a substring from this instance. The substring starts at a specified character position and ...
static ustring concat(value_t value) noexcept
Creates the string representation of a specified object.
Definition ustring.h:622
ustring replace(const ustring &old_string, const ustring &new_string) const noexcept
Replaces all occurrences of a specified string in this string with another specified string.
ustring pad_left(size_t total_width, value_type padding_char) const noexcept
Right-aligns the characters in this string, padding with spaces on the left for a specified total len...
ustring to_upper() const noexcept
Returns a copy of the current string converted to uppercase.
static int compare(const ustring &str_a, const ustring &str_b, bool ignore_case) noexcept
Compares two specified string objects, ignoring or honoring their case, and returns an integer that i...
ustring pad_right(size_t total_width, value_type padding_char) const noexcept
Left-aligns the characters in this string, padding with spaces on the right for a specified total len...
ustring insert(size_t start_index, const ustring &value) const noexcept
Inserts a specified instance of string at a specified index position in this instance.
static ustring join(const ustring &separator, const collection_t &values, size_t index, size_t count) noexcept
Concatenates a specified separator string between each element of a specified Object array,...
Definition ustring.h:863
size_t index_of_any(const std::vector< value_type > &values) const noexcept
Reports the index of the first occurrence in this instance of any character in a specified array of c...
std::vector< value_type > to_array() const noexcept
Copies the characters in this instance to a Unicode character array.
ustring(std::initializer_list< char16_t > il)
Initializes a new instance of xtd::ustring with specified initializer list.
static ustring class_name(const object_t &object)
Gets the class name of the specified object.
Definition ustring.h:450
ustring trim() const noexcept
Removes all leading and trailing occurrences of white-space characters from the specified String.
std::vector< ustring > split(const std::vector< value_type > &separators, size_t count, string_split_options options) const noexcept
Splits this string into a maximum number of substrings based on the characters in an array.
std::vector< ustring > split() const noexcept
Splits this string into substrings that are based on the default white-space characters....
ustring trim_end() const noexcept
Removes all trailing occurrences of white-space characters from the specified String.
static ustring concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c, object_d_t obj_d) noexcept
Concatenates four specified instances of object.
Definition ustring.h:548
size_t index_of(value_type value) const noexcept
Reports the index of the first occurrence of the specified character in this string.
ustring pad_right(size_t total_width) const noexcept
Left-aligns the characters in this string, padding with spaces on the right for a specified total len...
bool starts_with(value_type value, bool ignore_case) const noexcept
Determines whether the beginning of this instance of String matches a specified String,...
static ustring class_name(const std::type_info &info)
Gets the class name of the specified object.
Definition ustring.h:455
static ustring concat(const std::vector< object_t > &args) noexcept
Concatenates the string representations of the elements in a specified object array.
Definition ustring.h:601
static ustring full_class_name(const object_t &object)
Gets the fully qualified class name of the specified object, including the namespace of the specified...
Definition ustring.h:433
ustring(std::initializer_list< char16_t > il, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified initializer list and allocator.
ustring trim_start() const noexcept
Removes all leading occurrences of white-space characters from the specified String.
size_t last_index_of(const ustring &value) const noexcept
Reports the index of the last occurrence of the specified string in this string.
ustring replace(value_type old_char, value_type new_char) const noexcept
Replaces all occurrences of a specified char_t in this string with another specified char_t.
static int compare(const ustring &str_a, size_t index_a, const ustring &str_b, size_t index_b, size_t length, bool ignore_case) noexcept
Compares substrings of two specified string objects, ignoring or honoring their case,...
static ustring empty_string() noexcept
Represents the empty string.
size_t last_index_of_any(const std::vector< value_type > &values, size_t start_index, size_t count) const noexcept
Reports the index of the last occurrence in this instance of any character in a specified array of ch...
static ustring join(const ustring separator, const collection_t &values) noexcept
Concatenates a specified separator string between each element of a specified object array,...
Definition ustring.h:842
static ustring concat(const ustring &str_a, const ustring &str_b, const ustring &str_c, const ustring &str_d) noexcept
Concatenates four specified instances of string.
static ustring full_class_name()
Gets the fully qualified class name of the objec_t, including the namespace of the objec_t.
Definition ustring.h:427
static ustring concat(object_a_t obj_a, object_b_t obj_b) noexcept
Concatenates two specified instances of object.
Definition ustring.h:580
static int compare(const ustring &str_a, const ustring &str_b, xtd::string_comparison comparison_type) noexcept
Compares two specified string objects using the specified rules, and returns an integer that indicate...
static int compare(const ustring &str_a, const ustring &str_b) noexcept
Compares two specified string objects and returns an integer that indicates their relative position i...
ustring pad_left(size_t total_width) const noexcept
Right-aligns the characters in this string, padding with spaces on the left for a specified total len...
static ustring class_name()
Gets the class name of the object_t.
Definition ustring.h:444
size_t last_index_of(value_type value, size_t start_index, size_t count) const noexcept
Reports the index of the last occurrence of the specified character in this string....
bool ends_with(value_type value) const noexcept
Determines whether the end of this string matches the specified character.
size_t get_hash_code() const noexcept override
Returns the hash code for this string.
bool starts_with(const ustring &value) const noexcept
Determines whether the beginning of this instance of String matches a specified String.
ustring(std::initializer_list< wchar_t > il, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified initializer list and allocator.
ustring remove(size_t start_index) const noexcept
Deletes all the characters from this string beginning at a specified position and continuing through ...
static ustring concat(const std::vector< ustring > &values) noexcept
Concatenates the elements of a specified string array.
static ustring concat(const ustring &str_a, const ustring &str_b, const ustring &str_c) noexcept
Concatenates three specified instances of string.
ustring substring(size_t start_index) const noexcept
Retrieves a substring from this instance. The substring starts at a specified character position and ...
ustring() noexcept
Initializes a new instance of xtd::ustring.
bool starts_with(value_type value) const noexcept
Determines whether the beginning of this instance of String matches a specified String.
ustring to_string() const noexcept override
Returns a std::string that represents the current object.
ustring(std::initializer_list< char8_t > il, const allocator_type &allocator)
Initializes a new instance of xtd::ustring with specified initializer list and allocator.
static ustring join(const ustring &separator, const collection_t &values, size_t index) noexcept
Concatenates a specified separator string between each element of a specified object array,...
Definition ustring.h:852
static ustring concat(const ustring &str_a, const ustring &str_b) noexcept
Concatenates two specified instances of string.
bool contains(const ustring &value) const noexcept
Returns a value indicating whether a specified substring occurs within this string.
size_t last_index_of_any(const std::vector< value_type > &values, size_t start_index) const noexcept
Reports the index of the last occurrence in this instance of any character in a specified array of ch...
ustring to_lower() const noexcept
Returns a copy of the current string converted to lowercase.
static int compare(const ustring &str_a, size_t index_a, const ustring &str_b, size_t index_b, size_t length) noexcept
Compares substrings of two specified string objects and returns an integer that indicates their relat...
bool starts_with(const ustring &value, bool ignore_case) const noexcept
Determines whether the beginning of this instance of String matches a specified String,...
static ustring full_class_name(const std::type_info &info)
Gets the fully qualified class name of the specified object, including the namespace of the specified...
Definition ustring.h:438
static ustring sprintf(const ustring &fmt, args_t &&... args) noexcept
Writes the text representation of the specified arguments list, to string using the specified format ...
Definition ustring.h:1114
static ustring format(const ustring &fmt, args_t &&... args)
Writes the text representation of the specified arguments list, to string using the specified format ...
Definition ustring.h:689
string_comparison
Specifies the culture, case, and sort rules to be used by certain overloads of the xtd::ustring::comp...
Definition string_comparison.h:17
string_split_options
Specifies whether applicable xtd::ustring::split method overloads include or omit empty substrings fr...
Definition string_split_options.h:17
std::string to_string(const value_t &value, const std::string &fmt, const std::locale &loc)
Convert a specified value into a string with specified format and locale.
Definition to_string.h:37
@ clear
The CLEAR key.
@ s
The S key.
@ c
The C key.
@ i
The I key.
@ separator
The Separator key.
@ insert
The INS (INSERT) key.
@ stream
Supports reliable, two-way, connection-based byte streams without the duplication of data and without...
The xtd namespace contains all fundamental classes to access Hardware, Os, System,...
Definition system_report.h:17
ustring to_ustring(int val)
Converts a signed integer to xtd::ustring.
Contains xtd::object class.
Contains xtd::parse methods.
Contains xtd::string_comparison enum class.
Contains xtd::string_split_options enum class.
Contains xtd::to_string methods.
Contains xtd fundamental types.