74 using base_type = std::basic_string<char_t, traits_t, allocator_t>;
76 using traits_type =
typename base_type::traits_type;
78 using value_type =
typename base_type::value_type;
80 using allocator_type =
typename base_type::allocator_type;
82 using size_type =
typename base_type::size_type;
84 using difference_type =
typename base_type::difference_type;
86 using reference =
typename base_type::reference;
88 using const_reference =
typename base_type::const_reference;
90 using pointer =
typename base_type::pointer;
92 using const_pointer =
typename base_type::const_pointer;
100 using reverse_iterator =
typename base_type::reverse_iterator;
102 using const_reverse_iterator =
typename base_type::const_reverse_iterator;
122 inline static constexpr size_type
npos = base_type::npos;
160 explicit basic_string(
const allocator_type & allocator)
noexcept;
165 if constexpr(std::is_same_v<char, char_t>) chars_ = str.chars_;
166 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
172 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str.chars_;
173 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
178 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str.chars_;
179 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
184 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str.chars_;
185 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
190 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str.chars_;
191 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
198 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, allocator);
199 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
205 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, allocator);
206 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
212 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, allocator);
213 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
219 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, allocator);
220 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
226 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, allocator);
227 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
236 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index);
237 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)));
245 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index);
246 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)));
254 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index);
255 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)));
263 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index);
264 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)));
272 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index);
273 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)));
283 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index, allocator);
284 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)), allocator);
293 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index, allocator);
294 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)), allocator);
303 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index, allocator);
304 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)), allocator);
313 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index, allocator);
314 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)), allocator);
323 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index, allocator);
324 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)), allocator);
334 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count);
335 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)));
344 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count);
345 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)));
354 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count);
355 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)));
364 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count);
365 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)));
374 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count);
375 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)));
386 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
387 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)), allocator);
397 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
398 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)), allocator);
408 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
409 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)), allocator);
419 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
420 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)), allocator);
430 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
431 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)), allocator);
541 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
542 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
548 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
549 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
555 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
556 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
562 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
563 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
569 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
570 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
576 basic_string(
const char* str,
const allocator_type & allocator) {
578 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str, allocator);
579 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str), allocator);
586 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str, allocator);
587 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str), allocator);
594 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str, allocator);
595 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str), allocator);
602 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str, allocator);
603 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str), allocator);
610 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
611 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
618 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count);
619 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count));
625 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count);
626 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count));
632 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count);
633 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count));
639 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count);
640 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count));
646 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count);
647 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count));
656 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count, allocator);
657 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count), allocator);
665 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count, allocator);
666 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count), allocator);
674 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count, allocator);
675 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count), allocator);
683 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count, allocator);
684 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count), allocator);
692 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count, allocator);
693 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count), allocator);
698 basic_string(
const std::basic_string<char>& str)
noexcept {
699 if constexpr(std::is_same_v<char, char_t>) chars_ = str;
700 else chars_ = __xtd_convert_to_string<value_type>(str);
704 basic_string(
const std::basic_string<xtd::char16>& str)
noexcept {
705 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str;
706 else chars_ = __xtd_convert_to_string<value_type>(str);
710 basic_string(
const std::basic_string<xtd::char32>& str)
noexcept {
711 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str;
712 else chars_ = __xtd_convert_to_string<value_type>(str);
716 basic_string(
const std::basic_string<xtd::char8>& str)
noexcept {
717 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str;
718 else chars_ = __xtd_convert_to_string<value_type>(str);
722 basic_string(
const std::basic_string<xtd::wchar>& str)
noexcept {
723 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str;
724 else chars_ = __xtd_convert_to_string<value_type>(str);
730 basic_string(
const std::basic_string<char>& str,
const allocator_type & allocator)
noexcept {
731 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str, allocator);
732 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
737 basic_string(
const std::basic_string<xtd::char16>& str,
const allocator_type & allocator)
noexcept {
738 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str, allocator);
739 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
744 basic_string(
const std::basic_string<xtd::char32>& str,
const allocator_type & allocator)
noexcept {
745 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str, allocator);
746 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
751 basic_string(
const std::basic_string<xtd::char8>& str,
const allocator_type & allocator)
noexcept {
752 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str, allocator);
753 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
758 basic_string(
const std::basic_string<xtd::wchar>& str,
const allocator_type & allocator)
noexcept {
759 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str, allocator);
760 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
766 template<
class input_iterator_t>
772 template<
class input_iterator_t>
778 template<
class string_view_like_t>
779 explicit constexpr basic_string(
const string_view_like_t& string_view) : chars_(string_view) {}
783 template<
class string_view_like_t>
784 explicit constexpr basic_string(
const string_view_like_t& string_view,
const allocator_type & allocator) : chars_(string_view, allocator) {}
790 template<
class string_view_like_t>
791 constexpr basic_string(
const string_view_like_t& string_view, size_type index, size_type
count) : chars_(string_view, index,
count) {}
797 template<
class string_view_like_t>
798 constexpr basic_string(
const string_view_like_t& string_view, size_type index, size_type
count,
const allocator_type & allocator) : chars_(string_view, index,
count, allocator) {}
819 basic_string(std::initializer_list<char> il,
const allocator_type & allocator) :
basic_string(std::basic_string<char>(il), allocator) {}
823 basic_string(std::initializer_list<xtd::char16> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char16>(il), allocator) {}
827 basic_string(std::initializer_list<xtd::char32> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char32>(il), allocator) {}
831 basic_string(std::initializer_list<xtd::char8> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char8>(il), allocator) {}
835 basic_string(std::initializer_list<xtd::wchar> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::wchar>(il), allocator) {}
849 const_pointer c_str()
const noexcept {
return chars_.c_str();}
852 const base_type& chars()
const noexcept {
return chars_;}
856 base_type& chars()
noexcept {
return chars_;}
861 virtual size_type
count()
const noexcept {
return chars_.size();}
870 const_pointer
data()
const noexcept {
return chars_.data();}
874 virtual bool empty()
const noexcept {
return length() == 0;}
879 virtual size_type
length()
const noexcept {
return chars_.size();}
884 virtual size_type
size()
const noexcept {
return chars_.size();}
930 int32 compare(size_type pos1, size_type count1,
const basic_string & str)
const {
return chars_.compare(pos1, count1, str);}
954 int32 compare(size_type pos1, size_type count1,
const basic_string & str, size_type pos2)
const {
return chars_.compare(pos1, count1, str, pos2);}
979 int32 compare(size_type pos1, size_type count1,
const basic_string & str, size_type pos2, size_type count2)
const {
return chars_.compare(pos1, count1, str, pos2, count2);}
998 int32 compare(const_pointer
s)
const {
return chars_.compare(
s);}
1020 int32 compare(size_type pos1, size_type count1, const_pointer
s)
const {
return chars_.compare(pos1, count1,
s);}
1043 int32 compare(size_type pos1, size_type count1, const_pointer
s, size_type count2)
const {
return chars_.compare(pos1, count1,
s, count2);}
1092 if (ignore_case)
return to_upper().chars_ == value.to_upper().chars_;
1093 return chars_ == value.chars_;
1105 if (ignore_case)
return to_lower().rfind(
static_cast<value_type>(tolower(value))) ==
length() - 1;
1106 return chars_.rfind(value) ==
length() - 1;
1123 return chars_.rfind(value) + value.length() ==
length();
1143 size_type
find(const_pointer
s, size_type pos, size_type
count)
const {
return chars_.find(
s, pos,
count);}
1149 size_type
find(const_pointer
s)
const {
return chars_.find(
s);}
1156 size_type
find(const_pointer
s, size_type pos)
const {
return chars_.find(
s, pos);}
1200 size_type
find_first_of(const_pointer
s, size_type pos)
const {
return chars_.find_first_of(
s, pos);}
1211 size_type
find_first_of(char_t ch, size_type pos)
const {
return chars_.find_first_of(ch, pos);}
1255 size_type
find_first_not_of(char_t ch, size_type pos)
const {
return chars_.find_first_not_of(ch, pos);}
1288 size_type
find_last_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_of(
s, pos);}
1299 size_type
find_last_of(char_t ch, size_type pos)
const {
return chars_.find_last_of(ch, pos);}
1332 size_type
find_last_not_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_not_of(
s, pos);}
1343 size_type
find_last_not_of(char_t ch, size_type pos)
const {
return chars_.find_last_not_of(ch, pos);}
1359 explicit basic_string_enumerator(
const basic_string & chars) : chars_(chars) {}
1362 return chars_[index_];
1364 bool move_next()
override {
return ++index_ < chars_.length();}
1365 void reset()
override {index_ = basic_string::npos;}
1369 size_type index_ = basic_string::npos;
1391 auto result =
find(value, start_index);
1392 return result > start_index +
count ?
npos : result;
1411 auto result =
find(value, start_index);
1412 return result > start_index +
count ?
npos : result;
1446 auto result =
self_;
1447 result.chars_.insert(start_index, value);
1469 auto result = chars_.rfind(value, start_index +
count - value.length());
1470 return result < start_index ?
npos : result;
1491 auto result = chars_.rfind(value, start_index +
count - 1);
1492 return result < start_index ?
npos : result;
1560 std::wstringstream ss;
1561 if constexpr(std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1562 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1576 auto result =
self_;
1577 result.chars_.erase(start_index,
count);
1592 auto result =
self_;
1593 auto old_size = old_string.length();
1594 auto new_size = new_string.length();
1597 index = result.find(old_string, index);
1598 if (index ==
npos)
break;
1599 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1601 result.chars_.erase(index, old_string.length());
1602 result.chars_.insert(index, new_string);
1604 index += new_string.length();
1618 size_type
rfind(
const basic_string & str, size_type pos)
const {
return chars_.rfind(str, pos);}
1632 size_type
rfind(const_pointer
s)
const {
return chars_.rfind(
s);}
1639 size_type
rfind(const_pointer
s, size_type pos)
const {
return chars_.rfind(
s, pos);}
1650 size_type
rfind(
value_type ch, size_type pos)
const {
return chars_.rfind(ch, pos);}
1656 xtd::array<basic_string> split() const noexcept;
1706 xtd::array<basic_string> split(const xtd::array<
value_type>& separators) const noexcept;
1732 xtd::array<basic_string> split(const xtd::array<
value_type>& separators, xtd::
size count) const noexcept;
1750 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1756 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1757 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1758 return find(value) == 0;
1777 return find(value) == 0;
1784 basic_string substr()
const {
return chars_.substr();}
1790 basic_string substr(size_type pos)
const {
1792 return chars_.substr(pos);
1800 basic_string substr(size_type pos, size_type
count)
const {
1802 return chars_.substr(pos,
count);
1810 basic_string substring(
xtd::size start_index)
const {
1812 return substr(start_index);
1821 return substr(start_index,
length);
1826 xtd::array<value_type>
to_array() const noexcept;
1839 xtd::array<
value_type> to_char_array() const noexcept;
1848 basic_string to_lower() const noexcept {
1849 auto result = basic_string::empty_string;
1850 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1857 basic_string<char>
to_string() const noexcept
override {
1858 if constexpr(std::is_same_v<char, char_t>)
return chars_;
1859 else return __xtd_convert_to_string<char>(chars_);
1864 basic_string to_title_case() const noexcept;
1868 basic_string<xtd::
char16> to_u16string() const noexcept {
1869 if constexpr(std::is_same_v<xtd::char16, char_t>)
return chars_;
1870 else return __xtd_convert_to_string<xtd::char16>(chars_);
1875 basic_string<xtd::char32> to_u32string() const noexcept {
1876 if constexpr(std::is_same_v<xtd::char32, char_t>)
return chars_;
1877 else return __xtd_convert_to_string<xtd::char32>(chars_);
1882 basic_string<xtd::char8> to_u8string() const noexcept {
1883 if constexpr(std::is_same_v<xtd::char8, char_t>)
return chars_;
1884 else return __xtd_convert_to_string<xtd::char8>(chars_);
1889 basic_string to_upper() const noexcept {
1890 auto result = basic_string::empty_string;
1891 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1897 basic_string<xtd::wchar> to_wstring() const noexcept {
1898 if constexpr(std::is_same_v<xtd::wchar, char_t>)
return chars_;
1899 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1906 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1911 basic_string trim(
value_type trim_char)
const noexcept;
1916 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1922 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1927 basic_string trim_end(
value_type trim_char)
const noexcept;
1932 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1938 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1943 basic_string trim_start(
value_type trim_char)
const noexcept;
1948 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
1963 static int32 compare(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return compare(str_a, str_b,
false);}
2012 static int32 compare(
const basic_string & str_a,
xtd::size index_a,
const basic_string & str_b,
xtd::size index_b,
xtd::size length,
bool ignore_case) {
return compare(str_a, index_a, str_b, index_b,
length, ignore_case ?
xtd::string_comparison::ordinal_ignore_case :
xtd::string_comparison::ordinal);}
2034 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b,
const basic_string & str_c,
const basic_string & str_d)
noexcept {
return str_a + str_b + str_c + str_d;}
2041 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
2042 inline static basic_string
concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c, object_d_t obj_d)
noexcept {
return format(
"{}{}{}{}", obj_a, obj_b, obj_c, obj_d);}
2048 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b,
const basic_string & str_c)
noexcept {
return str_a + str_b + str_c;}
2054 template<
class object_a_t,
class object_b_t,
class object_c_t>
2055 inline static basic_string
concat(object_a_t obj_a, object_b_t obj_b, object_c_t obj_c)
noexcept {
return format(
"{}{}{}", obj_a, obj_b, obj_c);}
2060 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return str_a + str_b;}
2065 template<
class object_a_t,
class object_b_t>
2066 inline static basic_string
concat(object_a_t obj_a, object_b_t obj_b)
noexcept {
return format(
"{}{}", obj_a, obj_b);}
2070 static basic_string
concat(
const xtd::array<basic_string>& values)
noexcept;
2072 static basic_string
concat(
const xtd::array<const_pointer>& values)
noexcept;
2073 template<
class other_
char_t>
2074 inline static basic_string
concat(
const xtd::array<const other_char_t*>& values)
noexcept;
2075 static basic_string
concat(
const std::initializer_list<basic_string>& values)
noexcept {
2076 auto result = basic_string::empty_string;
2077 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2080 static basic_string
concat(
const std::initializer_list<const_pointer>& values)
noexcept {
2081 auto result = basic_string::empty_string;
2082 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2085 template<
class other_
char_t>
2086 inline static basic_string
concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
2087 auto result = basic_string::empty_string;
2088 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2095 template<
class object_t>
2096 inline static basic_string
concat(
const xtd::array<object_t>& args)
noexcept;
2098 template<
class object_t>
2099 inline static basic_string
concat(
const std::initializer_list<object_t>& args)
noexcept {
2100 basic_string result;
2101 for (
const auto& arg : args)
2102 result +=
format(
"{}", arg);
2109 template<
class value_t>
2110 inline static basic_string
concat(value_t value)
noexcept {
2111 return format(
"{}", value);
2134 static basic_string demangle(
const basic_string & name) {
2135 if constexpr(std::is_same_v<char, char_t>)
return __xtd_demangle(
name.chars());
2136 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.chars()));
2144 static bool equals(
const basic_string &
a,
const basic_string &
b)
noexcept {
return a.equals(
b);}
2150 template<
class char_a_t,
class char_b_t>
2151 inline static bool equals(
const char_a_t*
a,
const char_b_t*
b)
noexcept {
return basic_string {
a}.
equals(basic_string {
b});}
2159 static bool equals(
const basic_string &
a,
const basic_string &
b,
bool ignore_case)
noexcept {
return a.equals(
b, ignore_case);}
2166 template<
class char_a_t,
class char_b_t>
2167 inline static bool equals(
const char_a_t*
a,
const char_b_t*
b,
bool ignore_case)
noexcept {
return basic_string {
a}.
equals(basic_string {
b}, ignore_case);}
2175 template<
class ...args_t>
2176 inline static basic_string
format(
const basic_string<char>& fmt, args_t&& ... args);
2185 template<
class ...args_t>
2186 inline static basic_string
format(
const std::locale & loc,
const basic_string<char>& fmt, args_t&& ... args);
2191 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
2199 template<
class collection_t>
2200 inline static basic_string join(
const basic_string &
separator,
const collection_t& values)
noexcept {
2202 basic_string result;
2203 for (
const auto& item : values)
2214 template<
class collection_t>
2215 inline static basic_string join(
const basic_string &
separator,
const collection_t& values,
xtd::size index) {
return join(
separator, values, index, values.size() - index);}
2224 template<
class collection_t>
2228 basic_string result;
2229 for (
const auto& item : values) {
2230 if (
i >= index) result +=
format(
"{}{}", (
i != index ?
separator : basic_string {}), item);
2231 if (++
i >= index +
count)
break;
2237 template<
class value_t>
2238 inline static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values)
noexcept;
2239 template<
class value_t>
2240 inline static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values,
xtd::size index);
2241 template<
class value_t>
2248 template<
class value_t>
2249 inline static value_t
parse(
const basic_string & str) {
2313 template<
class ...args_t>
2314 inline static basic_string
sprintf(
const basic_string & fmt, args_t&& ... args)
noexcept {
return __sprintf(fmt.chars().c_str(), convert_param(std::forward<args_t>(args)) ...);}
2320 template<
class value_t>
2321 inline static bool try_parse(
const basic_string & str, value_t& value)
noexcept {
2340 return chars_[index ==
epos ?
length() - 1 : index];
2345 operator const base_type& ()
const noexcept {
return chars_;}
2350 basic_string& operator =(
const basic_string<char>& str)
noexcept {
2351 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
2352 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2358 basic_string& operator =(
const basic_string<xtd::char16>& str)
noexcept {
2359 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
2360 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2366 basic_string& operator =(
const basic_string<xtd::char32>& str)
noexcept {
2367 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
2368 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2374 basic_string& operator =(
const basic_string<xtd::char8>& str)
noexcept {
2375 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
2376 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2382 basic_string& operator =(
const basic_string<xtd::wchar>& str)
noexcept {
2383 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
2384 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2391 basic_string& operator =(basic_string<char>&& str)
noexcept {
2392 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
2393 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2399 basic_string& operator =(basic_string<xtd::char16>&& str)
noexcept {
2400 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
2401 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2407 basic_string& operator =(basic_string<xtd::char32>&& str)
noexcept {
2408 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
2409 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2415 basic_string& operator =(basic_string<xtd::char8>&& str)
noexcept {
2416 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
2417 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2423 basic_string& operator =(basic_string<xtd::wchar>&& str)
noexcept {
2424 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
2425 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2432 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
2433 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
2434 else chars_ = __xtd_convert_to_string<value_type>(str);
2440 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
2441 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
2442 else chars_ = __xtd_convert_to_string<value_type>(str);
2448 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
2449 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
2450 else chars_ = __xtd_convert_to_string<value_type>(str);
2456 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
2457 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
2458 else chars_ = __xtd_convert_to_string<value_type>(str);
2464 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
2465 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
2466 else chars_ = __xtd_convert_to_string<value_type>(str);
2473 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
2474 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
2475 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2481 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
2482 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
2483 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2489 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
2490 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
2491 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2497 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
2498 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2499 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2505 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2506 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2507 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2515 basic_string& operator =(
const char* str) {
2517 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2518 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2525 basic_string& operator =(
const xtd::char16 * str) {
2527 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2528 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2535 basic_string& operator =(
const xtd::char32 * str) {
2537 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2538 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2545 basic_string& operator =(
const xtd::char8 * str) {
2547 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2548 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2555 basic_string& operator =(
const xtd::wchar * str) {
2557 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2558 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2565 basic_string& operator =(
char character) {
2566 self_ = basic_string(1, character);
2573 self_ = basic_string(1, character);
2580 self_ = basic_string(1, character);
2586 basic_string& operator =(
xtd::char8 character) {
2587 self_ = basic_string(1, character);
2593 basic_string& operator =(
xtd::wchar character) {
2594 self_ = basic_string(1, character);
2601 basic_string& operator =(
const std::initializer_list<char>& il) {
2602 self_ = basic_string(il);
2608 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2609 self_ = basic_string(il);
2615 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2616 self_ = basic_string(il);
2622 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2623 self_ = basic_string(il);
2629 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2630 self_ = basic_string(il);
2637 basic_string& operator +=(
const basic_string<char>& str) {
2638 if constexpr(std::is_same_v<char, char_t>) chars_ += str.chars_;
2639 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2645 basic_string& operator +=(
const basic_string<xtd::char16>& str) {
2646 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2647 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2653 basic_string& operator +=(
const basic_string<xtd::char32>& str) {
2654 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2655 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2661 basic_string& operator +=(
const basic_string<xtd::char8>& str) {
2662 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2663 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2669 basic_string& operator +=(
const basic_string<xtd::wchar>& str) {
2670 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2671 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2678 basic_string& operator +=(basic_string<char>&& str) {
2679 if constexpr(std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2680 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2686 basic_string& operator +=(basic_string<xtd::char16>&& str) {
2687 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2688 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2694 basic_string& operator +=(basic_string<xtd::char32>&& str) {
2695 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2696 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2702 basic_string& operator +=(basic_string<xtd::char8>&& str) {
2703 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2704 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2710 basic_string& operator +=(basic_string<xtd::wchar>&& str) {
2711 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2712 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2719 basic_string& operator +=(
const std::basic_string<char>& str) {
2720 if constexpr(std::is_same_v<char, char_t>) chars_ += str;
2721 else chars_ += __xtd_convert_to_string<value_type>(str);
2727 basic_string& operator +=(
const std::basic_string<xtd::char16>& str) {
2728 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str;
2729 else chars_ += __xtd_convert_to_string<value_type>(str);
2735 basic_string& operator +=(
const std::basic_string<xtd::char32>& str) {
2736 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str;
2737 else chars_ += __xtd_convert_to_string<value_type>(str);
2743 basic_string& operator +=(
const std::basic_string<xtd::char8>& str) {
2744 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str;
2745 else chars_ += __xtd_convert_to_string<value_type>(str);
2751 basic_string& operator +=(
const std::basic_string<xtd::wchar>& str) {
2752 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2753 else chars_ += __xtd_convert_to_string<value_type>(str);
2760 basic_string& operator +=(
const char* str) {
2761 chars_ += basic_string(str).chars_;
2767 basic_string& operator +=(
const xtd::char16 * str) {
2768 chars_.
append(basic_string(str).chars_);
return self_;
2773 basic_string& operator +=(
const xtd::char32 * str) {
2774 chars_ += basic_string(str).chars_;
2780 basic_string& operator +=(
const xtd::char8 * str) {
2781 chars_ += basic_string(str).chars_;
2787 basic_string& operator +=(
const xtd::wchar * str) {
2788 chars_ += basic_string(str).chars_;
2794 basic_string& operator +=(
char ch) {
2795 chars_ += basic_string(1, ch).chars_;
2802 chars_ += basic_string(1, ch).chars_;
2809 chars_ += basic_string(1, ch).chars_;
2816 chars_ += basic_string(1, ch).chars_;
2823 chars_ += basic_string(1, ch).chars_;
2831 friend basic_string operator +(
const basic_string & lhs,
const basic_string<char>& rhs) {
2840 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char16>& rhs) {
2849 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char32>& rhs) {
2858 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char8>& rhs) {
2867 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::wchar>& rhs) {
2877 friend basic_string operator +(basic_string&& lhs, basic_string<char>&& rhs) {
2878 auto result = std::move(lhs);
2879 result += std::move(rhs);
2886 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char16>&& rhs) {
2887 auto result = std::move(lhs);
2888 result += std::move(rhs);
2895 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char32>&& rhs) {
2896 auto result = std::move(lhs);
2897 result += std::move(rhs);
2904 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char8>&& rhs) {
2905 auto result = std::move(lhs);
2906 result += std::move(rhs);
2913 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::wchar>&& rhs) {
2914 auto result = std::move(lhs);
2915 result += std::move(rhs);
2923 friend basic_string operator +(basic_string&& lhs,
const basic_string<char>& rhs) {
2924 auto result = std::move(lhs);
2932 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char16>& rhs) {
2933 auto result = std::move(lhs);
2941 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char32>& rhs) {
2942 auto result = std::move(lhs);
2950 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char8>& rhs) {
2951 auto result = std::move(lhs);
2959 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::wchar>& rhs) {
2960 auto result = std::move(lhs);
2969 friend basic_string operator +(
const basic_string & lhs, basic_string<char>&& rhs) {
2971 result += std::move(rhs);
2978 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char16>&& rhs) {
2980 result += std::move(rhs);
2987 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char32>&& rhs) {
2989 result += std::move(rhs);
2996 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char8>&& rhs) {
2998 result += std::move(rhs);
3005 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::wchar>&& rhs) {
3007 result += std::move(rhs);
3015 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<char>& rhs) {
3024 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char16>& rhs) {
3033 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char32>& rhs) {
3042 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char8>& rhs) {
3051 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::wchar>& rhs) {
3061 friend basic_string operator +(
const std::basic_string<char>& lhs,
const basic_string & rhs) {
3063 if constexpr(std::is_same_v<char, char_t>) result += rhs.chars();
3064 else result += __xtd_convert_to_string<char>(rhs.chars());
3071 friend basic_string operator +(
const std::basic_string<xtd::char16>& lhs,
const basic_string & rhs) {
3073 if constexpr(std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
3074 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
3081 friend basic_string operator +(
const std::basic_string<xtd::char32>& lhs,
const basic_string & rhs) {
3083 if constexpr(std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
3084 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
3091 friend basic_string operator +(
const std::basic_string<xtd::char8>& lhs,
const basic_string & rhs) {
3093 if constexpr(std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
3094 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
3101 friend basic_string operator +(
const std::basic_string<xtd::wchar>& lhs,
const basic_string & rhs) {
3103 if constexpr(std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
3104 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
3112 friend basic_string operator +(
const basic_string & lhs,
const char* rhs) {
3121 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 * rhs) {
3130 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 * rhs) {
3139 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 * rhs) {
3148 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar * rhs) {
3158 friend basic_string operator +(basic_string&& lhs,
const char* rhs) {
3159 auto result = std::move(lhs);
3167 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 * rhs) {
3168 auto result = std::move(lhs);
3176 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 * rhs) {
3177 auto result = std::move(lhs);
3185 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 * rhs) {
3186 auto result = std::move(lhs);
3194 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar * rhs) {
3195 auto result = std::move(lhs);
3204 friend basic_string operator +(
const char* lhs,
const basic_string & rhs) {
3205 auto result = basic_string(lhs);
3213 friend basic_string operator +(
const xtd::char16 * lhs,
const basic_string & rhs) {
3214 auto result = basic_string(lhs);
3222 friend basic_string operator +(
const xtd::char32 * lhs,
const basic_string & rhs) {
3223 auto result = basic_string(lhs);
3231 friend basic_string operator +(
const xtd::char8 * lhs,
const basic_string & rhs) {
3232 auto result = basic_string(lhs);
3240 friend basic_string operator +(
const xtd::wchar * lhs,
const basic_string & rhs) {
3241 auto result = basic_string(lhs);
3250 friend basic_string operator +(
const char* lhs, basic_string&& rhs) {
3251 auto result = basic_string(lhs);
3252 result += std::move(rhs);
3259 friend basic_string operator +(
const xtd::char16 * lhs, basic_string&& rhs) {
3260 auto result = basic_string(lhs);
3261 result += std::move(rhs);
3268 friend basic_string operator +(
const xtd::char32 * lhs, basic_string&& rhs) {
3269 auto result = basic_string(lhs);
3270 result += std::move(rhs);
3277 friend basic_string operator +(
const xtd::char8 * lhs, basic_string&& rhs) {
3278 auto result = basic_string(lhs);
3279 result += std::move(rhs);
3286 friend basic_string operator +(
const xtd::wchar * lhs, basic_string&& rhs) {
3287 auto result = basic_string(lhs);
3288 result += std::move(rhs);
3296 friend basic_string operator +(
const basic_string & lhs,
const char rhs) {
3305 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 rhs) {
3314 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 rhs) {
3323 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 rhs) {
3332 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar rhs) {
3342 friend basic_string operator +(basic_string&& lhs,
const char rhs) {
3343 auto result = std::move(lhs);
3351 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 rhs) {
3352 auto result = std::move(lhs);
3360 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 rhs) {
3361 auto result = std::move(lhs);
3369 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 rhs) {
3370 auto result = std::move(lhs);
3378 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar rhs) {
3379 auto result = std::move(lhs);
3388 friend basic_string operator +(
char lhs,
const basic_string & rhs) {
3389 auto result = basic_string(1, lhs);
3397 friend basic_string operator +(
xtd::char16 lhs,
const basic_string & rhs) {
3398 auto result = basic_string(1, lhs);
3406 friend basic_string operator +(
xtd::char32 lhs,
const basic_string & rhs) {
3407 auto result = basic_string(1, lhs);
3415 friend basic_string operator +(
xtd::char8 lhs,
const basic_string & rhs) {
3416 auto result = basic_string(1, lhs);
3424 friend basic_string operator +(
xtd::wchar lhs,
const basic_string & rhs) {
3425 auto result = basic_string(1, lhs);
3434 friend basic_string operator +(
char lhs, basic_string&& rhs) {
3435 auto result = basic_string(1, lhs);
3436 result += std::move(rhs);
3443 friend basic_string operator +(
xtd::char16 lhs, basic_string&& rhs) {
3444 auto result = basic_string(1, lhs);
3445 result += std::move(rhs);
3452 friend basic_string operator +(
xtd::char32 lhs, basic_string&& rhs) {
3453 auto result = basic_string(1, lhs);
3454 result += std::move(rhs);
3461 friend basic_string operator +(
xtd::char8 lhs, basic_string&& rhs) {
3462 auto result = basic_string(1, lhs);
3463 result += std::move(rhs);
3470 friend basic_string operator +(
xtd::wchar lhs, basic_string&& rhs) {
3471 auto result = basic_string(1, lhs);
3472 result += std::move(rhs);
3485 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string & str) {
3486 if constexpr(std::is_same_v<char, char_t>)
return stream << str.chars();
3487 else return stream << __xtd_convert_to_string<char>(str.chars());
3495 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string & str) {
return stream << str.to_wstring().chars();}
3505 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream, basic_string & str) {
3506 auto s = std::basic_string<char> {};
3519 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream, basic_string & str) {
3520 auto s = std::basic_string<xtd::wchar> {};
3532 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
3542 template<
class object_t>
3543 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
3549 template<
class object_t>
3550 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
3556 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
3562 template<
class object_t>
3563 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
3569 template<
class object_t>
3570 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
3576 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
3587 static const
xtd::array<value_type> default_split_separators;
3588 static const
xtd::array<value_type> default_trim_chars;
3590 template<class arg_t>
3591 inline static auto convert_param(arg_t&& arg) noexcept {
3592 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();
3593 else if constexpr(std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>, std::u16string>::value)
return std::forward<arg_t>(arg).c_str();
3594 else if constexpr(std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>, std::u32string>::value)
return std::forward<arg_t>(arg).c_str();
3595 else if constexpr(std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>, std::u8string>::value)
return std::forward<arg_t>(arg).c_str();
3596 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();
3597 else if constexpr(std::is_same<std::remove_cv_t<std::remove_reference_t<arg_t>>,
basic_string>::value)
return std::forward<arg_t>(arg).c_str();
3598 else return std::forward<arg_t>(arg);
3601 static basic_string get_class_name(
const basic_string & full_name) {
3604 if (full_name.last_index_of(
"::", 0,
length) ==
npos)
return full_name;
3605 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);