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);}
1360 explicit basic_string_enumerator(
const basic_string & chars) : chars_(chars) {}
1362 const value_type & current()
const override {
return chars_[index_];}
1364 bool move_next()
override {
return ++index_ < chars_.length();}
1366 void reset()
override {index_ = basic_string::npos;}
1392 auto result =
find(value, start_index);
1393 return result > start_index +
count ?
npos : result;
1412 auto result =
find(value, start_index);
1413 return result > start_index +
count ?
npos : result;
1447 auto result =
self_;
1448 result.chars_.insert(start_index, value);
1470 auto result = chars_.rfind(value, start_index +
count - value.length());
1471 return result < start_index ?
npos : result;
1492 auto result = chars_.rfind(value, start_index +
count - 1);
1493 return result < start_index ?
npos : result;
1561 std::wstringstream ss;
1562 if constexpr(std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1563 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1577 auto result =
self_;
1578 result.chars_.erase(start_index,
count);
1593 auto result =
self_;
1594 auto old_size = old_string.length();
1595 auto new_size = new_string.length();
1598 index = result.find(old_string, index);
1599 if (index ==
npos)
break;
1600 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1602 result.chars_.erase(index, old_string.length());
1603 result.chars_.insert(index, new_string);
1605 index += new_string.length();
1619 size_type
rfind(
const basic_string & str, size_type pos)
const {
return chars_.rfind(str, pos);}
1633 size_type
rfind(const_pointer
s)
const {
return chars_.rfind(
s);}
1640 size_type
rfind(const_pointer
s, size_type pos)
const {
return chars_.rfind(
s, pos);}
1651 size_type
rfind(
value_type ch, size_type pos)
const {
return chars_.rfind(ch, pos);}
1657 xtd::array<basic_string> split() const noexcept;
1707 xtd::array<basic_string> split(const xtd::array<
value_type>& separators) const noexcept;
1733 xtd::array<basic_string> split(const xtd::array<
value_type>& separators, xtd::
size count) const noexcept;
1751 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1757 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1758 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1759 return find(value) == 0;
1778 return find(value) == 0;
1785 basic_string substr()
const {
return chars_.substr();}
1791 basic_string substr(size_type pos)
const {
1793 return chars_.substr(pos);
1801 basic_string substr(size_type pos, size_type
count)
const {
1803 return chars_.substr(pos,
count);
1811 basic_string substring(
xtd::size start_index)
const {
1813 return substr(start_index);
1822 return substr(start_index,
length);
1827 xtd::array<value_type>
to_array() const noexcept;
1840 xtd::array<
value_type> to_char_array() const noexcept;
1849 basic_string to_lower() const noexcept {
1850 auto result = basic_string::empty_string;
1851 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1858 basic_string<char>
to_string() const noexcept
override {
1859 if constexpr(std::is_same_v<char, char_t>)
return chars_;
1860 else return __xtd_convert_to_string<char>(chars_);
1865 basic_string to_title_case() const noexcept;
1869 basic_string<xtd::
char16> to_u16string() const noexcept {
1870 if constexpr(std::is_same_v<xtd::char16, char_t>)
return chars_;
1871 else return __xtd_convert_to_string<xtd::char16>(chars_);
1876 basic_string<xtd::char32> to_u32string() const noexcept {
1877 if constexpr(std::is_same_v<xtd::char32, char_t>)
return chars_;
1878 else return __xtd_convert_to_string<xtd::char32>(chars_);
1883 basic_string<xtd::char8> to_u8string() const noexcept {
1884 if constexpr(std::is_same_v<xtd::char8, char_t>)
return chars_;
1885 else return __xtd_convert_to_string<xtd::char8>(chars_);
1890 basic_string to_upper() const noexcept {
1891 auto result = basic_string::empty_string;
1892 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1898 basic_string<xtd::wchar> to_wstring() const noexcept {
1899 if constexpr(std::is_same_v<xtd::wchar, char_t>)
return chars_;
1900 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1907 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1912 basic_string trim(
value_type trim_char)
const noexcept;
1917 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1923 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1928 basic_string trim_end(
value_type trim_char)
const noexcept;
1933 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1939 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1944 basic_string trim_start(
value_type trim_char)
const noexcept;
1949 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
1964 static int32 compare(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return compare(str_a, str_b,
false);}
2013 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);}
2035 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;}
2042 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
2043 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);}
2049 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;}
2055 template<
class object_a_t,
class object_b_t,
class object_c_t>
2056 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);}
2061 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return str_a + str_b;}
2066 template<
class object_a_t,
class object_b_t>
2067 inline static basic_string
concat(object_a_t obj_a, object_b_t obj_b)
noexcept {
return format(
"{}{}", obj_a, obj_b);}
2071 static basic_string
concat(
const xtd::array<basic_string>& values)
noexcept;
2073 static basic_string
concat(
const xtd::array<const_pointer>& values)
noexcept;
2074 template<
class other_
char_t>
2075 inline static basic_string
concat(
const xtd::array<const other_char_t*>& values)
noexcept;
2076 static basic_string
concat(
const std::initializer_list<basic_string>& values)
noexcept {
2077 auto result = basic_string::empty_string;
2078 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2081 static basic_string
concat(
const std::initializer_list<const_pointer>& values)
noexcept {
2082 auto result = basic_string::empty_string;
2083 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2086 template<
class other_
char_t>
2087 inline static basic_string
concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
2088 auto result = basic_string::empty_string;
2089 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2096 template<
class object_t>
2097 inline static basic_string
concat(
const xtd::array<object_t>& args)
noexcept;
2099 template<
class object_t>
2100 inline static basic_string
concat(
const std::initializer_list<object_t>& args)
noexcept {
2101 basic_string result;
2102 for (
const auto& arg : args)
2103 result +=
format(
"{}", arg);
2110 template<
class value_t>
2111 inline static basic_string
concat(value_t value)
noexcept {
2112 return format(
"{}", value);
2135 static basic_string demangle(
const basic_string & name) {
2136 if constexpr(std::is_same_v<char, char_t>)
return __xtd_demangle(
name.chars());
2137 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.chars()));
2145 static bool equals(
const basic_string &
a,
const basic_string &
b)
noexcept{
return a.equals(
b);}
2151 template<
class char_a_t,
class char_b_t>
2152 inline static bool equals(
const char_a_t*
a,
const char_b_t*
b)
noexcept{
return basic_string {
a}.
equals(basic_string {
b});}
2160 static bool equals(
const basic_string &
a,
const basic_string &
b,
bool ignore_case)
noexcept {
return a.equals(
b, ignore_case);}
2167 template<
class char_a_t,
class char_b_t>
2168 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);}
2176 template<
class ...args_t>
2177 inline static basic_string
format(
const basic_string<char>& fmt, args_t&& ... args);
2186 template<
class ...args_t>
2187 inline static basic_string
format(
const std::locale & loc,
const basic_string<char>& fmt, args_t&& ... args);
2192 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
2200 template<
class collection_t>
2201 inline static basic_string join(
const basic_string
separator,
const collection_t& values)
noexcept {
2203 basic_string result;
2204 for (
const auto& item : values)
2215 template<
class collection_t>
2216 inline static basic_string join(
const basic_string &
separator,
const collection_t& values,
xtd::size index) {
return join(
separator, values, index, values.size() - index);}
2225 template<
class collection_t>
2229 basic_string result;
2230 for (
const auto& item : values) {
2231 if (
i >= index) result +=
format(
"{}{}", (
i != index ?
separator : basic_string {}), item);
2232 if (++
i >= index +
count)
break;
2238 template<
class value_t>
2239 inline static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values)
noexcept;
2240 template<
class value_t>
2241 inline static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values,
xtd::size index);
2242 template<
class value_t>
2249 template<
class value_t>
2250 inline static value_t
parse(
const basic_string & str) {
2314 template<
class ...args_t>
2315 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)) ...);}
2321 template<
class value_t>
2322 inline static bool try_parse(
const basic_string & str, value_t& value)
noexcept {
2341 return chars_[index ==
epos ?
length() - 1 : index];
2346 operator const base_type & ()
const noexcept {
return chars_;}
2351 basic_string& operator =(
const basic_string<char>& str)
noexcept {
2352 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
2353 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2359 basic_string& operator =(
const basic_string<xtd::char16>& str)
noexcept {
2360 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
2361 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2367 basic_string& operator =(
const basic_string<xtd::char32>& str)
noexcept {
2368 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
2369 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2375 basic_string& operator =(
const basic_string<xtd::char8>& str)
noexcept {
2376 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
2377 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2383 basic_string& operator =(
const basic_string<xtd::wchar>& str)
noexcept {
2384 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
2385 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2392 basic_string& operator =(basic_string<char>&& str)
noexcept {
2393 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
2394 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2400 basic_string& operator =(basic_string<xtd::char16>&& str)
noexcept {
2401 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
2402 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2408 basic_string& operator =(basic_string<xtd::char32>&& str)
noexcept {
2409 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
2410 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2416 basic_string& operator =(basic_string<xtd::char8>&& str)
noexcept {
2417 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
2418 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2424 basic_string& operator =(basic_string<xtd::wchar>&& str)
noexcept {
2425 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
2426 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2433 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
2434 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
2435 else chars_ = __xtd_convert_to_string<value_type>(str);
2441 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
2442 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
2443 else chars_ = __xtd_convert_to_string<value_type>(str);
2449 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
2450 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
2451 else chars_ = __xtd_convert_to_string<value_type>(str);
2457 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
2458 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
2459 else chars_ = __xtd_convert_to_string<value_type>(str);
2465 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
2466 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
2467 else chars_ = __xtd_convert_to_string<value_type>(str);
2474 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
2475 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
2476 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2482 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
2483 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
2484 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2490 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
2491 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
2492 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2498 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
2499 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2500 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2506 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2507 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2508 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2516 basic_string& operator =(
const char* str) {
2518 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2519 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2526 basic_string& operator =(
const xtd::char16 * str) {
2528 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2529 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2536 basic_string& operator =(
const xtd::char32 * str) {
2538 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2539 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2546 basic_string& operator =(
const xtd::char8 * str) {
2548 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2549 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2556 basic_string& operator =(
const xtd::wchar * str) {
2558 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2559 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2566 basic_string& operator =(
char character) {
2567 self_ = basic_string(1, character);
2574 self_ = basic_string(1, character);
2581 self_ = basic_string(1, character);
2587 basic_string& operator =(
xtd::char8 character) {
2588 self_ = basic_string(1, character);
2594 basic_string& operator =(
xtd::wchar character) {
2595 self_ = basic_string(1, character);
2602 basic_string& operator =(
const std::initializer_list<char>& il) {
2603 self_ = basic_string(il);
2609 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2610 self_ = basic_string(il);
2616 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2617 self_ = basic_string(il);
2623 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2624 self_ = basic_string(il);
2630 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2631 self_ = basic_string(il);
2638 basic_string & operator +=(
const basic_string<char>& str) {
2639 if constexpr(std::is_same_v<char, char_t>) chars_ += str.chars_;
2640 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2646 basic_string & operator +=(
const basic_string<xtd::char16>& str) {
2647 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2648 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2654 basic_string & operator +=(
const basic_string<xtd::char32>& str) {
2655 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2656 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2662 basic_string & operator +=(
const basic_string<xtd::char8>& str) {
2663 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2664 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2670 basic_string & operator +=(
const basic_string<xtd::wchar>& str) {
2671 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2672 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2679 basic_string & operator +=(basic_string<char>&& str) {
2680 if constexpr(std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2681 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2687 basic_string & operator +=(basic_string<xtd::char16>&& str) {
2688 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2689 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2695 basic_string & operator +=(basic_string<xtd::char32>&& str) {
2696 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2697 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2703 basic_string & operator +=(basic_string<xtd::char8>&& str) {
2704 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2705 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2711 basic_string & operator +=(basic_string<xtd::wchar>&& str) {
2712 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2713 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2720 basic_string & operator +=(
const std::basic_string<char>& str) {
2721 if constexpr(std::is_same_v<char, char_t>) chars_ += str;
2722 else chars_ += __xtd_convert_to_string<value_type>(str);
2728 basic_string & operator +=(
const std::basic_string<xtd::char16>& str) {
2729 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str;
2730 else chars_ += __xtd_convert_to_string<value_type>(str);
2736 basic_string & operator +=(
const std::basic_string<xtd::char32>& str) {
2737 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str;
2738 else chars_ += __xtd_convert_to_string<value_type>(str);
2744 basic_string & operator +=(
const std::basic_string<xtd::char8>& str) {
2745 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str;
2746 else chars_ += __xtd_convert_to_string<value_type>(str);
2752 basic_string & operator +=(
const std::basic_string<xtd::wchar>& str) {
2753 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2754 else chars_ += __xtd_convert_to_string<value_type>(str);
2761 basic_string & operator +=(
const char* str) {
2762 chars_ += basic_string(str).chars_;
2768 basic_string & operator +=(
const xtd::char16 * str) {
2769 chars_.
append(basic_string(str).chars_);
return self_;
2774 basic_string & operator +=(
const xtd::char32 * str) {
2775 chars_ += basic_string(str).chars_;
2781 basic_string & operator +=(
const xtd::char8 * str) {
2782 chars_ += basic_string(str).chars_;
2788 basic_string & operator +=(
const xtd::wchar * str) {
2789 chars_ += basic_string(str).chars_;
2795 basic_string & operator +=(
char ch) {
2796 chars_ += basic_string(1, ch).chars_;
2803 chars_ += basic_string(1, ch).chars_;
2810 chars_ += basic_string(1, ch).chars_;
2817 chars_ += basic_string(1, ch).chars_;
2824 chars_ += basic_string(1, ch).chars_;
2832 friend basic_string operator +(
const basic_string & lhs,
const basic_string<char>& rhs) {
2841 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char16>& rhs) {
2850 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char32>& rhs) {
2859 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char8>& rhs) {
2868 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::wchar>& rhs) {
2878 friend basic_string operator +(basic_string&& lhs, basic_string<char>&& rhs) {
2879 auto result = std::move(lhs);
2880 result += std::move(rhs);
2887 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char16>&& rhs) {
2888 auto result = std::move(lhs);
2889 result += std::move(rhs);
2896 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char32>&& rhs) {
2897 auto result = std::move(lhs);
2898 result += std::move(rhs);
2905 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char8>&& rhs) {
2906 auto result = std::move(lhs);
2907 result += std::move(rhs);
2914 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::wchar>&& rhs) {
2915 auto result = std::move(lhs);
2916 result += std::move(rhs);
2924 friend basic_string operator +(basic_string&& lhs,
const basic_string<char>& rhs) {
2925 auto result = std::move(lhs);
2933 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char16>& rhs) {
2934 auto result = std::move(lhs);
2942 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char32>& rhs) {
2943 auto result = std::move(lhs);
2951 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char8>& rhs) {
2952 auto result = std::move(lhs);
2960 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::wchar>& rhs) {
2961 auto result = std::move(lhs);
2970 friend basic_string operator +(
const basic_string & lhs, basic_string<char>&& rhs) {
2972 result += std::move(rhs);
2979 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char16>&& rhs) {
2981 result += std::move(rhs);
2988 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char32>&& rhs) {
2990 result += std::move(rhs);
2997 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char8>&& rhs) {
2999 result += std::move(rhs);
3006 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::wchar>&& rhs) {
3008 result += std::move(rhs);
3016 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<char>& rhs) {
3025 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char16>& rhs) {
3034 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char32>& rhs) {
3043 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char8>& rhs) {
3052 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::wchar>& rhs) {
3062 friend basic_string operator +(
const std::basic_string<char>& lhs,
const basic_string & rhs) {
3064 if constexpr(std::is_same_v<char, char_t>) result += rhs.chars();
3065 else result += __xtd_convert_to_string<char>(rhs.chars());
3072 friend basic_string operator +(
const std::basic_string<xtd::char16>& lhs,
const basic_string & rhs) {
3074 if constexpr(std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
3075 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
3082 friend basic_string operator +(
const std::basic_string<xtd::char32>& lhs,
const basic_string & rhs) {
3084 if constexpr(std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
3085 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
3092 friend basic_string operator +(
const std::basic_string<xtd::char8>& lhs,
const basic_string & rhs) {
3094 if constexpr(std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
3095 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
3102 friend basic_string operator +(
const std::basic_string<xtd::wchar>& lhs,
const basic_string & rhs) {
3104 if constexpr(std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
3105 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
3113 friend basic_string operator +(
const basic_string & lhs,
const char* rhs) {
3122 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 * rhs) {
3131 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 * rhs) {
3140 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 * rhs) {
3149 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar * rhs) {
3159 friend basic_string operator +(basic_string&& lhs,
const char* rhs) {
3160 auto result = std::move(lhs);
3168 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 * rhs) {
3169 auto result = std::move(lhs);
3177 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 * rhs) {
3178 auto result = std::move(lhs);
3186 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 * rhs) {
3187 auto result = std::move(lhs);
3195 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar * rhs) {
3196 auto result = std::move(lhs);
3205 friend basic_string operator +(
const char* lhs,
const basic_string & rhs) {
3206 auto result = basic_string(lhs);
3214 friend basic_string operator +(
const xtd::char16 * lhs,
const basic_string & rhs) {
3215 auto result = basic_string(lhs);
3223 friend basic_string operator +(
const xtd::char32 * lhs,
const basic_string & rhs) {
3224 auto result = basic_string(lhs);
3232 friend basic_string operator +(
const xtd::char8 * lhs,
const basic_string & rhs) {
3233 auto result = basic_string(lhs);
3241 friend basic_string operator +(
const xtd::wchar * lhs,
const basic_string & rhs) {
3242 auto result = basic_string(lhs);
3251 friend basic_string operator +(
const char* lhs, basic_string&& rhs) {
3252 auto result = basic_string(lhs);
3253 result += std::move(rhs);
3260 friend basic_string operator +(
const xtd::char16 * lhs, basic_string&& rhs) {
3261 auto result = basic_string(lhs);
3262 result += std::move(rhs);
3269 friend basic_string operator +(
const xtd::char32 * lhs, basic_string&& rhs) {
3270 auto result = basic_string(lhs);
3271 result += std::move(rhs);
3278 friend basic_string operator +(
const xtd::char8 * lhs, basic_string&& rhs) {
3279 auto result = basic_string(lhs);
3280 result += std::move(rhs);
3287 friend basic_string operator +(
const xtd::wchar * lhs, basic_string&& rhs) {
3288 auto result = basic_string(lhs);
3289 result += std::move(rhs);
3297 friend basic_string operator +(
const basic_string & lhs,
const char rhs) {
3306 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 rhs) {
3315 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 rhs) {
3324 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 rhs) {
3333 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar rhs) {
3343 friend basic_string operator +(basic_string&& lhs,
const char rhs) {
3344 auto result = std::move(lhs);
3352 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 rhs) {
3353 auto result = std::move(lhs);
3361 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 rhs) {
3362 auto result = std::move(lhs);
3370 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 rhs) {
3371 auto result = std::move(lhs);
3379 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar rhs) {
3380 auto result = std::move(lhs);
3389 friend basic_string operator +(
char lhs,
const basic_string & rhs) {
3390 auto result = basic_string(1, lhs);
3398 friend basic_string operator +(
xtd::char16 lhs,
const basic_string & rhs) {
3399 auto result = basic_string(1, lhs);
3407 friend basic_string operator +(
xtd::char32 lhs,
const basic_string & rhs) {
3408 auto result = basic_string(1, lhs);
3416 friend basic_string operator +(
xtd::char8 lhs,
const basic_string & rhs) {
3417 auto result = basic_string(1, lhs);
3425 friend basic_string operator +(
xtd::wchar lhs,
const basic_string & rhs) {
3426 auto result = basic_string(1, lhs);
3435 friend basic_string operator +(
char lhs, basic_string&& rhs) {
3436 auto result = basic_string(1, lhs);
3437 result += std::move(rhs);
3444 friend basic_string operator +(
xtd::char16 lhs, basic_string&& rhs) {
3445 auto result = basic_string(1, lhs);
3446 result += std::move(rhs);
3453 friend basic_string operator +(
xtd::char32 lhs, basic_string&& rhs) {
3454 auto result = basic_string(1, lhs);
3455 result += std::move(rhs);
3462 friend basic_string operator +(
xtd::char8 lhs, basic_string&& rhs) {
3463 auto result = basic_string(1, lhs);
3464 result += std::move(rhs);
3471 friend basic_string operator +(
xtd::wchar lhs, basic_string&& rhs) {
3472 auto result = basic_string(1, lhs);
3473 result += std::move(rhs);
3486 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string & str) {
3487 if constexpr(std::is_same_v<char, char_t>)
return stream << str.chars();
3488 else return stream << __xtd_convert_to_string<char>(str.chars());
3496 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string & str) {
return stream << str.to_wstring().chars();}
3506 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream, basic_string & str) {
3507 auto s = std::basic_string<char> {};
3520 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream, basic_string & str) {
3521 auto s = std::basic_string<xtd::wchar> {};
3533 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
3543 template<
class object_t>
3544 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
3550 template<
class object_t>
3551 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
3557 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
3563 template<
class object_t>
3564 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
3570 template<
class object_t>
3571 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
3577 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
3588 static const
xtd::array<value_type> default_split_separators;
3589 static const
xtd::array<value_type> default_trim_chars;
3591 template<class arg_t>
3592 inline static auto convert_param(arg_t&& arg) noexcept {
3593 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();
3594 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();
3595 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();
3596 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();
3597 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();
3598 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();
3599 else return std::forward<arg_t>(arg);
3602 static basic_string get_class_name(
const basic_string & full_name) {
3605 if (full_name.last_index_of(
"::", 0,
length) ==
npos)
return full_name;
3606 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);