78 using base_type = std::basic_string<char_t, traits_t, allocator_t>;
80 using traits_type =
typename base_type::traits_type;
82 using value_type =
typename base_type::value_type;
84 using allocator_type =
typename base_type::allocator_type;
86 using size_type =
typename base_type::size_type;
88 using difference_type =
typename base_type::difference_type;
90 using reference =
typename base_type::reference;
92 using const_reference =
typename base_type::const_reference;
94 using pointer =
typename base_type::pointer;
96 using const_pointer =
typename base_type::const_pointer;
104 using reverse_iterator =
typename base_type::reverse_iterator;
106 using const_reverse_iterator =
typename base_type::const_reverse_iterator;
119 inline static constexpr size_type npos = base_type::npos;
129 explicit basic_string(
const allocator_type& allocator)
noexcept;
134 if constexpr (std::is_same_v<char, char_t>) chars_ = str.chars_;
135 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
141 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = str.chars_;
142 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
147 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = str.chars_;
148 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
150#if defined(__xtd__cpp_lib_char8_t)
154 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = str.chars_;
155 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
161 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = str.chars_;
162 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
169 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, allocator);
170 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
176 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, allocator);
177 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
183 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, allocator);
184 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
186#if defined(__xtd__cpp_lib_char8_t)
191 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, allocator);
192 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
199 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, allocator);
200 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
209 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index);
210 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)));
218 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index);
219 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)));
227 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index);
228 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)));
230#if defined(__xtd__cpp_lib_char8_t)
237 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index);
238 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)));
247 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index);
248 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)));
258 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index, allocator);
259 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)), allocator);
268 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index, allocator);
269 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)), allocator);
278 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index, allocator);
279 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)), allocator);
281#if defined(__xtd__cpp_lib_char8_t)
289 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index, allocator);
290 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)), allocator);
300 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index, allocator);
301 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)), allocator);
311 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count);
312 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)));
321 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count);
322 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)));
331 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count);
332 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)));
334#if defined(__xtd__cpp_lib_char8_t)
342 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count);
343 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)));
353 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count);
354 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)));
365 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
366 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)), allocator);
376 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
377 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)), allocator);
387 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
388 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)), allocator);
390#if defined(__xtd__cpp_lib_char8_t)
399 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
400 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)), allocator);
411 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
412 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)), allocator);
452#if defined(__xtd__cpp_lib_char8_t)
501#if defined(__xtd__cpp_lib_char8_t)
526 if constexpr (std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
527 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
533 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
534 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
540 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
541 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
543#if defined(__xtd__cpp_lib_char8_t)
548 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
549 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
556 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
557 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
563 basic_string(
const char* str,
const allocator_type& allocator) {
565 if constexpr (std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str, allocator);
566 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str), allocator);
573 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str, allocator);
574 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str), allocator);
581 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str, allocator);
582 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str), allocator);
584#if defined(__xtd__cpp_lib_char8_t)
590 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str, allocator);
591 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str), allocator);
599 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
600 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
607 if constexpr (std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count);
608 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count));
614 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count);
615 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count));
621 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count);
622 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count));
624#if defined(__xtd__cpp_lib_char8_t)
629 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count);
630 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count));
637 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count);
638 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count));
647 if constexpr (std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count, allocator);
648 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count), allocator);
656 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count, allocator);
657 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count), allocator);
665 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count, allocator);
666 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count), allocator);
668#if defined(__xtd__cpp_lib_char8_t)
675 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count, allocator);
676 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count), allocator);
685 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count, allocator);
686 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count), allocator);
691 basic_string(
const std::basic_string<char>& str)
noexcept {
692 if constexpr (std::is_same_v<char, char_t>) chars_ = str;
693 else chars_ = __xtd_convert_to_string<value_type>(str);
697 basic_string(
const std::basic_string<xtd::char16>& str)
noexcept {
698 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = str;
699 else chars_ = __xtd_convert_to_string<value_type>(str);
703 basic_string(
const std::basic_string<xtd::char32>& str)
noexcept {
704 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = str;
705 else chars_ = __xtd_convert_to_string<value_type>(str);
707#if defined(__xtd__cpp_lib_char8_t)
710 basic_string(
const std::basic_string<xtd::char8>& str)
noexcept {
711 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = str;
712 else chars_ = __xtd_convert_to_string<value_type>(str);
717 basic_string(
const std::basic_string<xtd::wchar>& str)
noexcept {
718 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = str;
719 else chars_ = __xtd_convert_to_string<value_type>(str);
725 basic_string(
const std::basic_string<char>& str,
const allocator_type& allocator)
noexcept {
726 if constexpr (std::is_same_v<char, char_t>) chars_ = base_type(str, allocator);
727 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
732 basic_string(
const std::basic_string<xtd::char16>& str,
const allocator_type& allocator)
noexcept {
733 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str, allocator);
734 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
739 basic_string(
const std::basic_string<xtd::char32>& str,
const allocator_type& allocator)
noexcept {
740 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str, allocator);
741 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
743#if defined(__xtd__cpp_lib_char8_t)
747 basic_string(
const std::basic_string<xtd::char8>& str,
const allocator_type& allocator)
noexcept {
748 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str, allocator);
749 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
755 basic_string(
const std::basic_string<xtd::wchar>& str,
const allocator_type& allocator)
noexcept {
756 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str, allocator);
757 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
763 template<
class input_iterator_t>
769 template<
class input_iterator_t>
775 template<
class string_view_like_t>
776 explicit constexpr basic_string(
const string_view_like_t& string_view) : chars_(string_view) {}
780 template<
class string_view_like_t>
781 explicit constexpr basic_string(
const string_view_like_t& string_view,
const allocator_type& allocator) : chars_(string_view, allocator) {}
787 template<
class string_view_like_t>
788 constexpr basic_string(
const string_view_like_t& string_view, size_type index, size_type
count) : chars_(string_view, index,
count) {}
794 template<
class string_view_like_t>
795 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) {}
806#if defined(__xtd__cpp_lib_char8_t)
818 basic_string(std::initializer_list<char> il,
const allocator_type& allocator) :
basic_string(std::basic_string<char>(il), allocator) {}
822 basic_string(std::initializer_list<xtd::char16> il,
const allocator_type& allocator) :
basic_string(std::basic_string<xtd::char16>(il), allocator) {}
826 basic_string(std::initializer_list<xtd::char32> il,
const allocator_type& allocator) :
basic_string(std::basic_string<xtd::char32>(il), allocator) {}
827#if defined(__xtd__cpp_lib_char8_t)
831 basic_string(std::initializer_list<xtd::char8> il,
const allocator_type& allocator) :
basic_string(std::basic_string<xtd::char8>(il), allocator) {}
836 basic_string(std::initializer_list<xtd::wchar> il,
const allocator_type& allocator) :
basic_string(std::basic_string<xtd::wchar>(il), allocator) {}
859 const_pointer c_str()
const noexcept {
return chars_.c_str();}
863 size_type capacity()
const noexcept {
return chars_.capacity();}
871 const_reverse_iterator
crbegin()
const {
return chars_.crbegin();}
875 const base_type& chars()
const noexcept {
return chars_;}
883 const_reverse_iterator
crend()
const {
return chars_.crend();}
892 const_pointer
data()
const noexcept {
return chars_.data();}
896 bool empty()
const noexcept {
return chars_.empty();}
910 size_type
length()
const noexcept {
return chars_.size();}
914 size_type max_size()
const noexcept {
return chars_.max_size();}
918 const_reverse_iterator
rbegin()
const {
return chars_.crbegin();}
922 const_reverse_iterator
rend()
const {
return chars_.crend();}
926 size_type
size()
const noexcept {
return chars_.size();}
935 const_reference
at(size_type pos)
const {
return operator [](pos);}
977 int32 compare(size_type pos1, size_type count1,
const basic_string& str)
const {
return chars_.compare(pos1, count1, str);}
1001 int32 compare(size_type pos1, size_type count1,
const basic_string& str, size_type pos2)
const {
return chars_.compare(pos1, count1, str, pos2);}
1026 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);}
1045 int32 compare(const_pointer
s)
const {
return chars_.compare(
s);}
1067 int32 compare(size_type pos1, size_type count1, const_pointer
s)
const {
return chars_.compare(pos1, count1,
s);}
1090 int32 compare(size_type pos1, size_type count1, const_pointer
s, size_type count2)
const {
return chars_.compare(pos1, count1,
s, count2);}
1139 if (ignore_case)
return to_upper().chars_ == value.to_upper().chars_;
1140 return chars_ == value.chars_;
1152 if (ignore_case)
return to_lower().rfind(
static_cast<value_type>(tolower(value))) ==
size() - 1;
1170 return rfind(value) + value.size() ==
size();
1190 size_type
find(const_pointer
s, size_type pos, size_type
count)
const {
return chars_.find(
s, pos,
count);}
1196 size_type
find(const_pointer
s)
const {
return chars_.find(
s);}
1203 size_type
find(const_pointer
s, size_type pos)
const {
return chars_.find(
s, pos);}
1247 size_type
find_first_of(const_pointer
s, size_type pos)
const {
return chars_.find_first_of(
s, pos);}
1258 size_type
find_first_of(char_t ch, size_type pos)
const {
return chars_.find_first_of(ch, pos);}
1302 size_type
find_first_not_of(char_t ch, size_type pos)
const {
return chars_.find_first_not_of(ch, pos);}
1335 size_type
find_last_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_of(
s, pos);}
1346 size_type
find_last_of(char_t ch, size_type pos)
const {
return chars_.find_last_of(ch, pos);}
1379 size_type
find_last_not_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_not_of(
s, pos);}
1390 size_type
find_last_not_of(char_t ch, size_type pos)
const {
return chars_.find_last_not_of(ch, pos);}
1407 explicit basic_string_enumerator(
const basic_string& chars) : chars_(chars) {}
1409 const value_type& current()
const override {
return chars_[index_];}
1411 bool move_next()
override {
return ++index_ < chars_.size();}
1413 void reset()
override {index_ = basic_string::npos;}
1439 auto result =
find(value, start_index);
1440 return result > start_index +
count ? npos : result;
1459 auto result =
find(value, start_index);
1460 return result > start_index +
count ? npos : result;
1494 auto result = *
this;
1495 result.chars_.insert(start_index, value);
1502 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
1523 auto result =
rfind(value, start_index +
count - value.size());
1524 return result < start_index ? npos : result;
1545 auto result =
rfind(value, start_index +
count - 1);
1546 return result < start_index ? npos : result;
1614 std::wstringstream ss;
1615 if constexpr (std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1616 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1630 auto result = *
this;
1631 result.chars_.erase(start_index,
count);
1646 auto result = *
this;
1647 auto old_size = old_string.size();
1648 auto new_size = new_string.size();
1651 index = result.find(old_string, index);
1652 if (index == npos)
break;
1653 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1655 result.chars_.erase(index, old_string.size());
1656 result.chars_.insert(index, new_string);
1658 index += new_string.size();
1672 size_type
rfind(
const basic_string& str, size_type pos)
const {
return chars_.rfind(str, pos);}
1686 size_type
rfind(const_pointer
s)
const {
return chars_.rfind(
s);}
1693 size_type
rfind(const_pointer
s, size_type pos)
const {
return chars_.rfind(
s, pos);}
1704 size_type
rfind(
value_type ch, size_type pos)
const {
return chars_.rfind(ch, pos);}
1710 xtd::array<basic_string> split() const noexcept;
1760 xtd::array<basic_string> split(const xtd::array<
value_type>& separators) const noexcept;
1786 xtd::array<basic_string> split(const xtd::array<
value_type>& separators, xtd::
size count) const noexcept;
1804 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1810 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1811 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1812 return find(value) == 0;
1831 return find(value) == 0;
1838 basic_string substr()
const {
return chars_.substr();}
1844 basic_string substr(size_type pos)
const {
1846 return chars_.substr(pos);
1854 basic_string substr(size_type pos, size_type
count)
const {
1856 return chars_.substr(pos,
count);
1864 basic_string substring(
xtd::size start_index)
const {
1866 return substr(start_index);
1875 return substr(start_index,
length);
1880 xtd::array<value_type>
to_array() const noexcept;
1893 xtd::array<
value_type> to_char_array() const noexcept;
1902 basic_string to_lower() const noexcept {
1903 auto result = basic_string::empty_string;
1904 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1911 basic_string<char>
to_string() const noexcept
override {
1912 if constexpr (std::is_same_v<char, char_t>)
return chars_;
1913 else return __xtd_convert_to_string<char>(chars_);
1918 basic_string to_title_case() const noexcept;
1922 basic_string<xtd::
char16> to_u16string() const noexcept {
1923 if constexpr (std::is_same_v<xtd::char16, char_t>)
return chars_;
1924 else return __xtd_convert_to_string<xtd::char16>(chars_);
1929 basic_string<xtd::char32> to_u32string() const noexcept {
1930 if constexpr (std::is_same_v<xtd::char32, char_t>)
return chars_;
1931 else return __xtd_convert_to_string<xtd::char32>(chars_);
1934#if defined(__xtd__cpp_lib_char8_t)
1937 basic_string<xtd::char8> to_u8string() const noexcept {
1938 if constexpr (std::is_same_v<xtd::char8, char_t>)
return chars_;
1939 else return __xtd_convert_to_string<xtd::char8>(chars_);
1945 basic_string to_upper() const noexcept {
1946 auto result = basic_string::empty_string;
1947 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1953 basic_string<xtd::wchar> to_wstring() const noexcept {
1954 if constexpr (std::is_same_v<xtd::wchar, char_t>)
return chars_;
1955 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1962 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1967 basic_string trim(
value_type trim_char)
const noexcept;
1972 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1978 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1983 basic_string trim_end(
value_type trim_char)
const noexcept;
1988 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1994 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1999 basic_string trim_start(
value_type trim_char)
const noexcept;
2004 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
2014 template<
class object_t>
2015 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
2016 static basic_string class_name() {
return get_class_name(full_class_name<object_t>());}
2021 template<
class object_t>
2022 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
2023 static basic_string class_name(
const object_t&
object) {
return get_class_name(full_class_name(
object));}
2028 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
2029 static basic_string class_name(
const std::type_info& info) {
return __xtd_get_class_name(info);}
2040 static int32 compare(
const basic_string& str_a,
const basic_string& str_b)
noexcept {
return compare(str_a, str_b,
false);}
2089 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);}
2111 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;}
2118 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
2119 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);}
2125 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;}
2131 template<
class object_a_t,
class object_b_t,
class object_c_t>
2132 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);}
2137 static basic_string
concat(
const basic_string& str_a,
const basic_string& str_b)
noexcept {
return str_a + str_b;}
2142 template<
class object_a_t,
class object_b_t>
2143 static basic_string
concat(object_a_t obj_a, object_b_t obj_b)
noexcept {
return format(
"{}{}", obj_a, obj_b);}
2147 static basic_string
concat(
const xtd::array<basic_string>& values)
noexcept;
2149 static basic_string
concat(
const xtd::array<const_pointer>& values)
noexcept;
2150 template<
class other_
char_t>
2151 static basic_string
concat(
const xtd::array<const other_char_t*>& values)
noexcept;
2152 static basic_string
concat(
const std::initializer_list<basic_string>& values)
noexcept {
2153 auto result = basic_string::empty_string;
2154 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2157 static basic_string
concat(
const std::initializer_list<const_pointer>& values)
noexcept {
2158 auto result = basic_string::empty_string;
2159 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2162 template<
class other_
char_t>
2163 static basic_string
concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
2164 auto result = basic_string::empty_string;
2165 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2172 template<
class object_t>
2173 static basic_string
concat(
const xtd::array<object_t>& args)
noexcept;
2175 template<
class object_t>
2176 static basic_string
concat(
const std::initializer_list<object_t>& args)
noexcept {
2177 basic_string result;
2178 for (
const auto& arg : args)
2179 result +=
format(
"{}", arg);
2186 template<
class value_t>
2187 static basic_string
concat(value_t value)
noexcept {
2188 return format(
"{}", value);
2211 static basic_string demangle(
const basic_string& name) {
2212 if constexpr (std::is_same_v<char, char_t>)
return __xtd_demangle(
name.chars());
2213 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.chars()));
2221 static bool equals(
const basic_string&
a,
const basic_string&
b)
noexcept{
return a.equals(
b);}
2227 template<
class char_a_t,
class char_b_t>
2228 static bool equals(
const char_a_t*
a,
const char_b_t*
b)
noexcept{
return basic_string {
a}.
equals(basic_string {
b});}
2236 static bool equals(
const basic_string&
a,
const basic_string&
b,
bool ignore_case)
noexcept {
return a.equals(
b, ignore_case);}
2243 template<
class char_a_t,
class char_b_t>
2244 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);}
2252 template<
class ...args_t>
2253 static basic_string
format(
const basic_string<char>& fmt, args_t&& ... args);
2259 template<
class object_t>
2260 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
2261 static basic_string full_class_name() {
return demangle(
typeid(object_t).
name());}
2266 template<
class object_t>
2267 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
2268 static basic_string full_class_name(
const object_t&
object) {
return demangle(
typeid(
object).
name());}
2273 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
2274 static basic_string full_class_name(
const std::type_info& info) {
return __xtd_get_full_class_name(info);}
2279 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
2287 template<
class collection_t>
2288 static basic_string join(
const basic_string
separator,
const collection_t& values)
noexcept {
2290 basic_string result;
2291 for (
const auto& item : values)
2302 template<
class collection_t>
2303 static basic_string join(
const basic_string&
separator,
const collection_t& values,
xtd::size index) {
return join(
separator, values, index, values.size() - index);}
2312 template<
class collection_t>
2316 basic_string result;
2317 for (
const auto& item : values) {
2318 if (
i >= index) result +=
format(
"{}{}", (
i != index ?
separator : basic_string {}), item);
2319 if (++
i >= index +
count)
break;
2325 template<
class value_t>
2326 static basic_string join(
const basic_string&
separator,
const std::initializer_list<value_t>& values)
noexcept;
2327 template<
class value_t>
2328 static basic_string join(
const basic_string&
separator,
const std::initializer_list<value_t>& values,
xtd::size index);
2329 template<
class value_t>
2336 template<
class value_t>
2337 static value_t
parse(
const basic_string& str) {
2401 template<
class ...args_t>
2402 static basic_string
sprintf(
const basic_string& fmt, args_t&& ... args)
noexcept {
return __sprintf(fmt.c_str(), convert_param(std::forward<args_t>(args)) ...);}
2408 template<
class value_t>
2409 static bool try_parse(
const basic_string& str, value_t& value)
noexcept {
2428 return chars_[index];
2433 operator const base_type&()
const noexcept {
return chars_;}
2438 basic_string& operator =(
const basic_string<char>& str)
noexcept {
2439 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
2440 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2446 basic_string& operator =(
const basic_string<xtd::char16>& str)
noexcept {
2447 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
2448 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2454 basic_string& operator =(
const basic_string<xtd::char32>& str)
noexcept {
2455 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
2456 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2459#if defined(__xtd__cpp_lib_char8_t)
2463 basic_string& operator =(
const basic_string<xtd::char8>& str)
noexcept {
2464 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
2465 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2472 basic_string& operator =(
const basic_string<xtd::wchar>& str)
noexcept {
2473 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
2474 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2481 basic_string& operator =(basic_string<char>&& str)
noexcept {
2482 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
2483 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2489 basic_string& operator =(basic_string<xtd::char16>&& str)
noexcept {
2490 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
2491 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2497 basic_string& operator =(basic_string<xtd::char32>&& str)
noexcept {
2498 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
2499 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2502#if defined(__xtd__cpp_lib_char8_t)
2506 basic_string& operator =(basic_string<xtd::char8>&& str)
noexcept {
2507 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
2508 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2515 basic_string& operator =(basic_string<xtd::wchar>&& str)
noexcept {
2516 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
2517 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2524 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
2525 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
2526 else chars_ = __xtd_convert_to_string<value_type>(str);
2532 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
2533 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
2534 else chars_ = __xtd_convert_to_string<value_type>(str);
2540 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
2541 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
2542 else chars_ = __xtd_convert_to_string<value_type>(str);
2545#if defined(__xtd__cpp_lib_char8_t)
2549 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
2550 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
2551 else chars_ = __xtd_convert_to_string<value_type>(str);
2558 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
2559 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
2560 else chars_ = __xtd_convert_to_string<value_type>(str);
2567 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
2568 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
2569 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2575 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
2576 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
2577 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2583 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
2584 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
2585 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2588#if defined(__xtd__cpp_lib_char8_t)
2592 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
2593 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2594 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2601 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2602 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2603 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2611 basic_string& operator =(
const char* str) {
2613 if constexpr (std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2614 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2621 basic_string& operator =(
const xtd::char16* str) {
2623 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2624 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2631 basic_string& operator =(
const xtd::char32* str) {
2633 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2634 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2637#if defined(__xtd__cpp_lib_char8_t)
2642 basic_string& operator =(
const xtd::char8* str) {
2644 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2645 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2653 basic_string& operator =(
const xtd::wchar* str) {
2655 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2656 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2663 basic_string& operator =(
char character) {
2664 *
this = basic_string(1, character);
2671 *
this = basic_string(1, character);
2678 *
this = basic_string(1, character);
2681#if defined(__xtd__cpp_lib_char8_t)
2685 basic_string& operator =(
xtd::char8 character) {
2686 *
this = basic_string(1, character);
2693 basic_string& operator =(
xtd::wchar character) {
2694 *
this = basic_string(1, character);
2701 basic_string& operator =(
const std::initializer_list<char>& il) {
2702 *
this = basic_string(il);
2708 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2709 *
this = basic_string(il);
2715 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2716 *
this = basic_string(il);
2719#if defined(__xtd__cpp_lib_char8_t)
2723 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2724 *
this = basic_string(il);
2731 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2732 *
this = basic_string(il);
2739 basic_string& operator +=(
const basic_string<char>& str) {
2740 if constexpr (std::is_same_v<char, char_t>) chars_ += str.chars_;
2741 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2747 basic_string& operator +=(
const basic_string<xtd::char16>& str) {
2748 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2749 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2755 basic_string& operator +=(
const basic_string<xtd::char32>& str) {
2756 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2757 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2760#if defined(__xtd__cpp_lib_char8_t)
2764 basic_string& operator +=(
const basic_string<xtd::char8>& str) {
2765 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2766 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2773 basic_string& operator +=(
const basic_string<xtd::wchar>& str) {
2774 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2775 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2782 basic_string& operator +=(basic_string<char>&& str) {
2783 if constexpr (std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2784 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2790 basic_string& operator +=(basic_string<xtd::char16>&& str) {
2791 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2792 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2798 basic_string& operator +=(basic_string<xtd::char32>&& str) {
2799 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2800 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2803#if defined(__xtd__cpp_lib_char8_t)
2807 basic_string& operator +=(basic_string<xtd::char8>&& str) {
2808 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2809 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2816 basic_string& operator +=(basic_string<xtd::wchar>&& str) {
2817 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2818 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2825 basic_string& operator +=(
const std::basic_string<char>& str) {
2826 if constexpr (std::is_same_v<char, char_t>) chars_ += str;
2827 else chars_ += __xtd_convert_to_string<value_type>(str);
2833 basic_string& operator +=(
const std::basic_string<xtd::char16>& str) {
2834 if constexpr (std::is_same_v<xtd::char16, char_t>) chars_ += str;
2835 else chars_ += __xtd_convert_to_string<value_type>(str);
2841 basic_string& operator +=(
const std::basic_string<xtd::char32>& str) {
2842 if constexpr (std::is_same_v<xtd::char32, char_t>) chars_ += str;
2843 else chars_ += __xtd_convert_to_string<value_type>(str);
2846#if defined(__xtd__cpp_lib_char8_t)
2850 basic_string& operator +=(
const std::basic_string<xtd::char8>& str) {
2851 if constexpr (std::is_same_v<xtd::char8, char_t>) chars_ += str;
2852 else chars_ += __xtd_convert_to_string<value_type>(str);
2859 basic_string& operator +=(
const std::basic_string<xtd::wchar>& str) {
2860 if constexpr (std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2861 else chars_ += __xtd_convert_to_string<value_type>(str);
2868 basic_string& operator +=(
const char* str) {
2869 chars_ += basic_string(str).chars_;
2875 basic_string& operator +=(
const xtd::char16* str) {
2876 chars_.
append(basic_string(str).chars_);
return *
this;
2881 basic_string& operator +=(
const xtd::char32* str) {
2882 chars_ += basic_string(str).chars_;
2885#if defined(__xtd__cpp_lib_char8_t)
2889 basic_string& operator +=(
const xtd::char8* str) {
2890 chars_ += basic_string(str).chars_;
2897 basic_string& operator +=(
const xtd::wchar* str) {
2898 chars_ += basic_string(str).chars_;
2904 basic_string& operator +=(
char ch) {
2905 chars_ += basic_string(1, ch).chars_;
2912 chars_ += basic_string(1, ch).chars_;
2919 chars_ += basic_string(1, ch).chars_;
2922#if defined(__xtd__cpp_lib_char8_t)
2927 chars_ += basic_string(1, ch).chars_;
2935 chars_ += basic_string(1, ch).chars_;
2943 friend basic_string operator +(
const basic_string& lhs,
const basic_string<char>& rhs) {
2952 friend basic_string operator +(
const basic_string& lhs,
const basic_string<xtd::char16>& rhs) {
2961 friend basic_string operator +(
const basic_string& lhs,
const basic_string<xtd::char32>& rhs) {
2966#if defined(__xtd__cpp_lib_char8_t)
2971 friend basic_string operator +(
const basic_string& lhs,
const basic_string<xtd::char8>& rhs) {
2981 friend basic_string operator +(
const basic_string& lhs,
const basic_string<xtd::wchar>& rhs) {
2991 friend basic_string operator +(basic_string&& lhs, basic_string<char>&& rhs) {
2992 auto result = std::move(lhs);
2993 result += std::move(rhs);
3000 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char16>&& rhs) {
3001 auto result = std::move(lhs);
3002 result += std::move(rhs);
3009 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char32>&& rhs) {
3010 auto result = std::move(lhs);
3011 result += std::move(rhs);
3014#if defined(__xtd__cpp_lib_char8_t)
3019 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char8>&& rhs) {
3020 auto result = std::move(lhs);
3021 result += std::move(rhs);
3029 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::wchar>&& rhs) {
3030 auto result = std::move(lhs);
3031 result += std::move(rhs);
3039 friend basic_string operator +(basic_string&& lhs,
const basic_string<char>& rhs) {
3040 auto result = std::move(lhs);
3048 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char16>& rhs) {
3049 auto result = std::move(lhs);
3057 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char32>& rhs) {
3058 auto result = std::move(lhs);
3062#if defined(__xtd__cpp_lib_char8_t)
3067 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char8>& rhs) {
3068 auto result = std::move(lhs);
3077 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::wchar>& rhs) {
3078 auto result = std::move(lhs);
3087 friend basic_string operator +(
const basic_string& lhs, basic_string<char>&& rhs) {
3089 result += std::move(rhs);
3096 friend basic_string operator +(
const basic_string& lhs, basic_string<xtd::char16>&& rhs) {
3098 result += std::move(rhs);
3105 friend basic_string operator +(
const basic_string& lhs, basic_string<xtd::char32>&& rhs) {
3107 result += std::move(rhs);
3110#if defined(__xtd__cpp_lib_char8_t)
3115 friend basic_string operator +(
const basic_string& lhs, basic_string<xtd::char8>&& rhs) {
3117 result += std::move(rhs);
3125 friend basic_string operator +(
const basic_string& lhs, basic_string<xtd::wchar>&& rhs) {
3127 result += std::move(rhs);
3135 friend basic_string operator +(
const basic_string& lhs,
const std::basic_string<char>& rhs) {
3144 friend basic_string operator +(
const basic_string& lhs,
const std::basic_string<xtd::char16>& rhs) {
3153 friend basic_string operator +(
const basic_string& lhs,
const std::basic_string<xtd::char32>& rhs) {
3158#if defined(__xtd__cpp_lib_char8_t)
3163 friend basic_string operator +(
const basic_string& lhs,
const std::basic_string<xtd::char8>& rhs) {
3173 friend basic_string operator +(
const basic_string& lhs,
const std::basic_string<xtd::wchar>& rhs) {
3183 friend basic_string operator +(
const std::basic_string<char>& lhs,
const basic_string& rhs) {
3185 if constexpr (std::is_same_v<char, char_t>) result += rhs.chars();
3186 else result += __xtd_convert_to_string<char>(rhs.chars());
3193 friend basic_string operator +(
const std::basic_string<xtd::char16>& lhs,
const basic_string& rhs) {
3195 if constexpr (std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
3196 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
3203 friend basic_string operator +(
const std::basic_string<xtd::char32>& lhs,
const basic_string& rhs) {
3205 if constexpr (std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
3206 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
3209#if defined(__xtd__cpp_lib_char8_t)
3214 friend basic_string operator +(
const std::basic_string<xtd::char8>& lhs,
const basic_string& rhs) {
3216 if constexpr (std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
3217 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
3225 friend basic_string operator +(
const std::basic_string<xtd::wchar>& lhs,
const basic_string& rhs) {
3227 if constexpr (std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
3228 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
3236 friend basic_string operator +(
const basic_string& lhs,
const char* rhs) {
3245 friend basic_string operator +(
const basic_string& lhs,
const xtd::char16* rhs) {
3254 friend basic_string operator +(
const basic_string& lhs,
const xtd::char32* rhs) {
3259#if defined(__xtd__cpp_lib_char8_t)
3264 friend basic_string operator +(
const basic_string& lhs,
const xtd::char8* rhs) {
3274 friend basic_string operator +(
const basic_string& lhs,
const xtd::wchar* rhs) {
3284 friend basic_string operator +(basic_string&& lhs,
const char* rhs) {
3285 auto result = std::move(lhs);
3293 friend basic_string operator +(basic_string&& lhs,
const xtd::char16* rhs) {
3294 auto result = std::move(lhs);
3302 friend basic_string operator +(basic_string&& lhs,
const xtd::char32* rhs) {
3303 auto result = std::move(lhs);
3307#if defined(__xtd__cpp_lib_char8_t)
3312 friend basic_string operator +(basic_string&& lhs,
const xtd::char8* rhs) {
3313 auto result = std::move(lhs);
3322 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar* rhs) {
3323 auto result = std::move(lhs);
3332 friend basic_string operator +(
const char* lhs,
const basic_string& rhs) {
3333 auto result = basic_string(lhs);
3341 friend basic_string operator +(
const xtd::char16* lhs,
const basic_string& rhs) {
3342 auto result = basic_string(lhs);
3350 friend basic_string operator +(
const xtd::char32* lhs,
const basic_string& rhs) {
3351 auto result = basic_string(lhs);
3355#if defined(__xtd__cpp_lib_char8_t)
3360 friend basic_string operator +(
const xtd::char8* lhs,
const basic_string& rhs) {
3361 auto result = basic_string(lhs);
3370 friend basic_string operator +(
const xtd::wchar* lhs,
const basic_string& rhs) {
3371 auto result = basic_string(lhs);
3380 friend basic_string operator +(
const char* lhs, basic_string&& rhs) {
3381 auto result = basic_string(lhs);
3382 result += std::move(rhs);
3389 friend basic_string operator +(
const xtd::char16* lhs, basic_string&& rhs) {
3390 auto result = basic_string(lhs);
3391 result += std::move(rhs);
3398 friend basic_string operator +(
const xtd::char32* lhs, basic_string&& rhs) {
3399 auto result = basic_string(lhs);
3400 result += std::move(rhs);
3404#if defined(__xtd__cpp_lib_char8_t)
3409 friend basic_string operator +(
const xtd::char8* lhs, basic_string&& rhs) {
3410 auto result = basic_string(lhs);
3411 result += std::move(rhs);
3419 friend basic_string operator +(
const xtd::wchar* lhs, basic_string&& rhs) {
3420 auto result = basic_string(lhs);
3421 result += std::move(rhs);
3429 friend basic_string operator +(
const basic_string& lhs,
const char rhs) {
3438 friend basic_string operator +(
const basic_string& lhs,
const xtd::char16 rhs) {
3447 friend basic_string operator +(
const basic_string& lhs,
const xtd::char32 rhs) {
3452#if defined(__xtd__cpp_lib_char8_t)
3457 friend basic_string operator +(
const basic_string& lhs,
const xtd::char8 rhs) {
3467 friend basic_string operator +(
const basic_string& lhs,
const xtd::wchar rhs) {
3477 friend basic_string operator +(basic_string&& lhs,
const char rhs) {
3478 auto result = std::move(lhs);
3486 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 rhs) {
3487 auto result = std::move(lhs);
3495 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 rhs) {
3496 auto result = std::move(lhs);
3500#if defined(__xtd__cpp_lib_char8_t)
3505 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 rhs) {
3506 auto result = std::move(lhs);
3515 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar rhs) {
3516 auto result = std::move(lhs);
3525 friend basic_string operator +(
char lhs,
const basic_string& rhs) {
3526 auto result = basic_string(1, lhs);
3534 friend basic_string operator +(
xtd::char16 lhs,
const basic_string& rhs) {
3535 auto result = basic_string(1, lhs);
3543 friend basic_string operator +(
xtd::char32 lhs,
const basic_string& rhs) {
3544 auto result = basic_string(1, lhs);
3548#if defined(__xtd__cpp_lib_char8_t)
3553 friend basic_string operator +(
xtd::char8 lhs,
const basic_string& rhs) {
3554 auto result = basic_string(1, lhs);
3563 friend basic_string operator +(
xtd::wchar lhs,
const basic_string& rhs) {
3564 auto result = basic_string(1, lhs);
3573 friend basic_string operator +(
char lhs, basic_string&& rhs) {
3574 auto result = basic_string(1, lhs);
3575 result += std::move(rhs);
3582 friend basic_string operator +(
xtd::char16 lhs, basic_string&& rhs) {
3583 auto result = basic_string(1, lhs);
3584 result += std::move(rhs);
3591 friend basic_string operator +(
xtd::char32 lhs, basic_string&& rhs) {
3592 auto result = basic_string(1, lhs);
3593 result += std::move(rhs);
3596#if defined(__xtd__cpp_lib_char8_t)
3601 friend basic_string operator +(
xtd::char8 lhs, basic_string&& rhs) {
3602 auto result = basic_string(1, lhs);
3603 result += std::move(rhs);
3611 friend basic_string operator +(
xtd::wchar lhs, basic_string&& rhs) {
3612 auto result = basic_string(1, lhs);
3613 result += std::move(rhs);
3626 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string& str) {
3627 if constexpr (std::is_same_v<char, char_t>)
return stream << str.chars();
3628 else return stream << __xtd_convert_to_string<char>(str.chars());
3636 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string& str) {
return stream << str.to_wstring().chars();}
3646 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream, basic_string& str) {
3647 auto s = std::basic_string<char> {};
3660 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream, basic_string& str) {
3661 auto s = std::basic_string<xtd::wchar> {};
3669 friend class basic_string<char>;
3670 friend class basic_string<xtd::
char16>;
3671 friend class basic_string<xtd::char32>;
3672#if defined(__xtd__cpp_lib_char8_t)
3673 friend class basic_string<xtd::char8>;
3675 friend class basic_string<xtd::wchar>;
3677 static const xtd::array<value_type> default_split_separators;
3678 static const xtd::array<value_type> default_trim_chars;
3680 template<class arg_t>
3681 static auto convert_param(arg_t&& arg) noexcept {
3682 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();
3683 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();
3684 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();
3685#if defined(__xtd__cpp_lib_char8_t)
3686 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();
3688 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();
3689 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();
3690 else return std::forward<arg_t>(arg);
3693 static basic_string get_class_name(
const basic_string& full_name) {
3694 auto length = full_name.last_index_of(
"<");
3696 if (full_name.last_index_of(
"::", 0,
length) == npos)
return full_name;
3697 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);
3700 typename base_type::iterator to_base_type_iterator(
iterator value)
const noexcept {
3701 if (value ==
begin())
return chars_.begin();
3702 if (value ==
end())
return chars_.end();
3703 return chars_.begin() + (value -
begin());
3706 iterator to_iterator(
typename base_type::iterator value)
const noexcept {
3707 if (value == chars_.begin())
return begin();
3708 if (value == chars_.end())
return end();
3709 return begin() + (value - chars_.begin());