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;
126 inline static constexpr size_type
npos = base_type::npos;
164 explicit basic_string(
const allocator_type & allocator)
noexcept;
169 if constexpr(std::is_same_v<char, char_t>) chars_ = str.chars_;
170 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
176 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str.chars_;
177 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
182 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str.chars_;
183 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
188 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str.chars_;
189 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
194 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str.chars_;
195 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
202 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, allocator);
203 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
209 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, allocator);
210 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
216 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, allocator);
217 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
223 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, allocator);
224 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
230 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, allocator);
231 else chars_ = base_type(__xtd_convert_to_string<value_type>(str.chars_), allocator);
240 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index);
241 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)));
249 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index);
250 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)));
258 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index);
259 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)));
267 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index);
268 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)));
276 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index);
277 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)));
287 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index, allocator);
288 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index)), allocator);
297 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index, allocator);
298 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index)), allocator);
307 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index, allocator);
308 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index)), allocator);
317 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index, allocator);
318 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index)), allocator);
327 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index, allocator);
328 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index)), allocator);
338 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count);
339 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)));
348 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count);
349 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)));
358 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count);
359 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)));
368 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count);
369 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)));
378 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count);
379 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)));
390 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
391 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<char>(str.chars_, index,
count)), allocator);
401 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
402 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str.chars_, index,
count)), allocator);
412 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
413 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str.chars_, index,
count)), allocator);
423 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
424 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str.chars_, index,
count)), allocator);
434 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str.chars_, index,
count, allocator);
435 else chars_ = base_type(__xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str.chars_, index,
count)), allocator);
545 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
546 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
552 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
553 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
559 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
560 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
566 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
567 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
573 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
574 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
580 basic_string(
const char* str,
const allocator_type & allocator) {
582 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str, allocator);
583 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str), allocator);
590 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str, allocator);
591 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str), allocator);
598 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str, allocator);
599 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str), allocator);
606 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str, allocator);
607 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str), allocator);
614 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
615 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
622 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count);
623 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count));
629 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count);
630 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count));
636 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count);
637 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count));
643 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count);
644 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count));
650 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count);
651 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count));
660 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count, allocator);
661 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count), allocator);
669 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count, allocator);
670 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count), allocator);
678 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count, allocator);
679 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count), allocator);
687 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count, allocator);
688 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count), allocator);
696 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count, allocator);
697 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count), allocator);
702 basic_string(
const std::basic_string<char>& str)
noexcept {
703 if constexpr(std::is_same_v<char, char_t>) chars_ = str;
704 else chars_ = __xtd_convert_to_string<value_type>(str);
708 basic_string(
const std::basic_string<xtd::char16>& str)
noexcept {
709 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str;
710 else chars_ = __xtd_convert_to_string<value_type>(str);
714 basic_string(
const std::basic_string<xtd::char32>& str)
noexcept {
715 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str;
716 else chars_ = __xtd_convert_to_string<value_type>(str);
720 basic_string(
const std::basic_string<xtd::char8>& str)
noexcept {
721 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str;
722 else chars_ = __xtd_convert_to_string<value_type>(str);
726 basic_string(
const std::basic_string<xtd::wchar>& str)
noexcept {
727 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str;
728 else chars_ = __xtd_convert_to_string<value_type>(str);
734 basic_string(
const std::basic_string<char>& str,
const allocator_type & allocator)
noexcept {
735 if constexpr(std::is_same_v<char, char_t>) chars_ = base_type(str, allocator);
736 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
741 basic_string(
const std::basic_string<xtd::char16>& str,
const allocator_type & allocator)
noexcept {
742 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = base_type(str, allocator);
743 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
748 basic_string(
const std::basic_string<xtd::char32>& str,
const allocator_type & allocator)
noexcept {
749 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = base_type(str, allocator);
750 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
755 basic_string(
const std::basic_string<xtd::char8>& str,
const allocator_type & allocator)
noexcept {
756 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = base_type(str, allocator);
757 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
762 basic_string(
const std::basic_string<xtd::wchar>& str,
const allocator_type & allocator)
noexcept {
763 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = base_type(str, allocator);
764 else chars_ = base_type(__xtd_convert_to_string<value_type>(str), allocator);
770 template<
class input_iterator_t>
776 template<
class input_iterator_t>
782 template<
class string_view_like_t>
783 explicit constexpr basic_string(
const string_view_like_t& string_view) : chars_(string_view) {}
787 template<
class string_view_like_t>
788 explicit constexpr basic_string(
const string_view_like_t& string_view,
const allocator_type & allocator) : chars_(string_view, allocator) {}
794 template<
class string_view_like_t>
795 constexpr basic_string(
const string_view_like_t& string_view, size_type index, size_type
count) : chars_(string_view, index,
count) {}
801 template<
class string_view_like_t>
802 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) {}
823 basic_string(std::initializer_list<char> il,
const allocator_type & allocator) :
basic_string(std::basic_string<char>(il), allocator) {}
827 basic_string(std::initializer_list<xtd::char16> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char16>(il), allocator) {}
831 basic_string(std::initializer_list<xtd::char32> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char32>(il), allocator) {}
835 basic_string(std::initializer_list<xtd::char8> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::char8>(il), allocator) {}
839 basic_string(std::initializer_list<xtd::wchar> il,
const allocator_type & allocator) :
basic_string(std::basic_string<xtd::wchar>(il), allocator) {}
853 const_pointer c_str()
const noexcept {
return chars_.c_str();}
857 const base_type & chars()
const noexcept {
return chars_;}
861 base_type & chars()
noexcept {
return chars_;}
866 virtual size_type
count()
const noexcept {
return chars_.size();}
875 const_pointer
data()
const noexcept {
return chars_.data();}
879 virtual bool empty()
const noexcept {
return length() == 0;}
884 virtual size_type
length()
const noexcept {
return chars_.size();}
889 virtual size_type
size()
const noexcept {
return chars_.size();}
935 int32 compare(size_type pos1, size_type count1,
const basic_string & str)
const {
return chars_.compare(pos1, count1, str);}
959 int32 compare(size_type pos1, size_type count1,
const basic_string & str, size_type pos2)
const {
return chars_.compare(pos1, count1, str, pos2);}
984 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);}
1003 int32 compare(const_pointer
s)
const {
return chars_.compare(
s);}
1025 int32 compare(size_type pos1, size_type count1, const_pointer
s)
const {
return chars_.compare(pos1, count1,
s);}
1048 int32 compare(size_type pos1, size_type count1, const_pointer
s, size_type count2)
const {
return chars_.compare(pos1, count1,
s, count2);}
1097 if (ignore_case)
return to_upper().chars_ == value.to_upper().chars_;
1098 return chars_ == value.chars_;
1110 if (ignore_case)
return to_lower().rfind(
static_cast<value_type>(tolower(value))) ==
length() - 1;
1148 size_type
find(const_pointer
s, size_type pos, size_type
count)
const {
return chars_.find(
s, pos,
count);}
1154 size_type
find(const_pointer
s)
const {
return chars_.find(
s);}
1161 size_type
find(const_pointer
s, size_type pos)
const {
return chars_.find(
s, pos);}
1205 size_type
find_first_of(const_pointer
s, size_type pos)
const {
return chars_.find_first_of(
s, pos);}
1216 size_type
find_first_of(char_t ch, size_type pos)
const {
return chars_.find_first_of(ch, pos);}
1260 size_type
find_first_not_of(char_t ch, size_type pos)
const {
return chars_.find_first_not_of(ch, pos);}
1293 size_type
find_last_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_of(
s, pos);}
1304 size_type
find_last_of(char_t ch, size_type pos)
const {
return chars_.find_last_of(ch, pos);}
1337 size_type
find_last_not_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_not_of(
s, pos);}
1348 size_type
find_last_not_of(char_t ch, size_type pos)
const {
return chars_.find_last_not_of(ch, pos);}
1365 explicit basic_string_enumerator(
const basic_string & chars) : chars_(chars) {}
1367 const value_type & current()
const override {
return chars_[index_];}
1369 bool move_next()
override {
return ++index_ < chars_.length();}
1371 void reset()
override {index_ = basic_string::npos;}
1397 auto result =
find(value, start_index);
1398 return result > start_index +
count ?
npos : result;
1417 auto result =
find(value, start_index);
1418 return result > start_index +
count ?
npos : result;
1452 auto result =
self_;
1453 result.chars_.insert(start_index, value);
1475 auto result =
rfind(value, start_index +
count - value.length());
1476 return result < start_index ?
npos : result;
1497 auto result =
rfind(value, start_index +
count - 1);
1498 return result < start_index ?
npos : result;
1566 std::wstringstream ss;
1567 if constexpr(std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1568 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1582 auto result =
self_;
1583 result.chars_.erase(start_index,
count);
1598 auto result =
self_;
1599 auto old_size = old_string.length();
1600 auto new_size = new_string.length();
1603 index = result.find(old_string, index);
1604 if (index ==
npos)
break;
1605 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1607 result.chars_.erase(index, old_string.length());
1608 result.chars_.insert(index, new_string);
1610 index += new_string.length();
1624 size_type
rfind(
const basic_string & str, size_type pos)
const {
return chars_.rfind(str, pos);}
1638 size_type
rfind(const_pointer
s)
const {
return chars_.rfind(
s);}
1645 size_type
rfind(const_pointer
s, size_type pos)
const {
return chars_.rfind(
s, pos);}
1656 size_type
rfind(
value_type ch, size_type pos)
const {
return chars_.rfind(ch, pos);}
1662 xtd::array<basic_string> split() const noexcept;
1712 xtd::array<basic_string> split(const xtd::array<
value_type>& separators) const noexcept;
1738 xtd::array<basic_string> split(const xtd::array<
value_type>& separators, xtd::
size count) const noexcept;
1756 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1762 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1763 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1764 return find(value) == 0;
1783 return find(value) == 0;
1790 basic_string substr()
const {
return chars_.substr();}
1796 basic_string substr(size_type pos)
const {
1798 return chars_.substr(pos);
1806 basic_string substr(size_type pos, size_type
count)
const {
1808 return chars_.substr(pos,
count);
1816 basic_string substring(
xtd::size start_index)
const {
1818 return substr(start_index);
1827 return substr(start_index,
length);
1832 xtd::array<value_type>
to_array() const noexcept;
1845 xtd::array<
value_type> to_char_array() const noexcept;
1854 basic_string to_lower() const noexcept {
1855 auto result = basic_string::empty_string;
1856 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1863 basic_string<char>
to_string() const noexcept
override {
1864 if constexpr(std::is_same_v<char, char_t>)
return chars_;
1865 else return __xtd_convert_to_string<char>(chars_);
1870 basic_string to_title_case() const noexcept;
1874 basic_string<xtd::
char16> to_u16string() const noexcept {
1875 if constexpr(std::is_same_v<xtd::char16, char_t>)
return chars_;
1876 else return __xtd_convert_to_string<xtd::char16>(chars_);
1881 basic_string<xtd::char32> to_u32string() const noexcept {
1882 if constexpr(std::is_same_v<xtd::char32, char_t>)
return chars_;
1883 else return __xtd_convert_to_string<xtd::char32>(chars_);
1888 basic_string<xtd::char8> to_u8string() const noexcept {
1889 if constexpr(std::is_same_v<xtd::char8, char_t>)
return chars_;
1890 else return __xtd_convert_to_string<xtd::char8>(chars_);
1895 basic_string to_upper() const noexcept {
1896 auto result = basic_string::empty_string;
1897 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1903 basic_string<xtd::wchar> to_wstring() const noexcept {
1904 if constexpr(std::is_same_v<xtd::wchar, char_t>)
return chars_;
1905 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1912 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1917 basic_string trim(
value_type trim_char)
const noexcept;
1922 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1928 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1933 basic_string trim_end(
value_type trim_char)
const noexcept;
1938 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1944 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1949 basic_string trim_start(
value_type trim_char)
const noexcept;
1954 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
1969 static int32 compare(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return compare(str_a, str_b,
false);}
2018 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);}
2040 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;}
2047 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
2048 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);}
2054 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;}
2060 template<
class object_a_t,
class object_b_t,
class object_c_t>
2061 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);}
2066 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return str_a + str_b;}
2071 template<
class object_a_t,
class object_b_t>
2072 static basic_string
concat(object_a_t obj_a, object_b_t obj_b)
noexcept {
return format(
"{}{}", obj_a, obj_b);}
2076 static basic_string
concat(
const xtd::array<basic_string>& values)
noexcept;
2078 static basic_string
concat(
const xtd::array<const_pointer>& values)
noexcept;
2079 template<
class other_
char_t>
2080 static basic_string
concat(
const xtd::array<const other_char_t*>& values)
noexcept;
2081 static basic_string
concat(
const std::initializer_list<basic_string>& values)
noexcept {
2082 auto result = basic_string::empty_string;
2083 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2086 static basic_string
concat(
const std::initializer_list<const_pointer>& values)
noexcept {
2087 auto result = basic_string::empty_string;
2088 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2091 template<
class other_
char_t>
2092 static basic_string
concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
2093 auto result = basic_string::empty_string;
2094 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2101 template<
class object_t>
2102 static basic_string
concat(
const xtd::array<object_t>& args)
noexcept;
2104 template<
class object_t>
2105 static basic_string
concat(
const std::initializer_list<object_t>& args)
noexcept {
2106 basic_string result;
2107 for (
const auto& arg : args)
2108 result +=
format(
"{}", arg);
2115 template<
class value_t>
2116 static basic_string
concat(value_t value)
noexcept {
2117 return format(
"{}", value);
2140 static basic_string demangle(
const basic_string & name) {
2141 if constexpr(std::is_same_v<char, char_t>)
return __xtd_demangle(
name.chars());
2142 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.chars()));
2150 static bool equals(
const basic_string &
a,
const basic_string &
b)
noexcept{
return a.equals(
b);}
2156 template<
class char_a_t,
class char_b_t>
2157 static bool equals(
const char_a_t*
a,
const char_b_t*
b)
noexcept{
return basic_string {
a}.
equals(basic_string {
b});}
2165 static bool equals(
const basic_string &
a,
const basic_string &
b,
bool ignore_case)
noexcept {
return a.equals(
b, ignore_case);}
2172 template<
class char_a_t,
class char_b_t>
2173 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);}
2181 template<
class ...args_t>
2182 static basic_string
format(
const basic_string<char>& fmt, args_t&& ... args);
2187 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
2195 template<
class collection_t>
2196 static basic_string join(
const basic_string
separator,
const collection_t& values)
noexcept {
2198 basic_string result;
2199 for (
const auto& item : values)
2210 template<
class collection_t>
2211 static basic_string join(
const basic_string &
separator,
const collection_t& values,
xtd::size index) {
return join(
separator, values, index, values.size() - index);}
2220 template<
class collection_t>
2224 basic_string result;
2225 for (
const auto& item : values) {
2226 if (
i >= index) result +=
format(
"{}{}", (
i != index ?
separator : basic_string {}), item);
2227 if (++
i >= index +
count)
break;
2233 template<
class value_t>
2234 static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values)
noexcept;
2235 template<
class value_t>
2236 static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values,
xtd::size index);
2237 template<
class value_t>
2244 template<
class value_t>
2245 static value_t
parse(
const basic_string & str) {
2309 template<
class ...args_t>
2310 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)) ...);}
2316 template<
class value_t>
2317 static bool try_parse(
const basic_string & str, value_t& value)
noexcept {
2336 return chars_[index ==
epos ?
length() - 1 : index];
2341 operator const base_type & ()
const noexcept {
return chars_;}
2346 basic_string& operator =(
const basic_string<char>& str)
noexcept {
2347 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
2348 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2354 basic_string& operator =(
const basic_string<xtd::char16>& str)
noexcept {
2355 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
2356 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2362 basic_string& operator =(
const basic_string<xtd::char32>& str)
noexcept {
2363 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
2364 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2370 basic_string& operator =(
const basic_string<xtd::char8>& str)
noexcept {
2371 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
2372 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2378 basic_string& operator =(
const basic_string<xtd::wchar>& str)
noexcept {
2379 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
2380 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2387 basic_string& operator =(basic_string<char>&& str)
noexcept {
2388 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
2389 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2395 basic_string& operator =(basic_string<xtd::char16>&& str)
noexcept {
2396 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
2397 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2403 basic_string& operator =(basic_string<xtd::char32>&& str)
noexcept {
2404 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
2405 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2411 basic_string& operator =(basic_string<xtd::char8>&& str)
noexcept {
2412 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
2413 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2419 basic_string& operator =(basic_string<xtd::wchar>&& str)
noexcept {
2420 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
2421 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2428 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
2429 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
2430 else chars_ = __xtd_convert_to_string<value_type>(str);
2436 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
2437 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
2438 else chars_ = __xtd_convert_to_string<value_type>(str);
2444 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
2445 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
2446 else chars_ = __xtd_convert_to_string<value_type>(str);
2452 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
2453 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
2454 else chars_ = __xtd_convert_to_string<value_type>(str);
2460 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
2461 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
2462 else chars_ = __xtd_convert_to_string<value_type>(str);
2469 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
2470 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
2471 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2477 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
2478 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
2479 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2485 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
2486 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
2487 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2493 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
2494 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2495 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2501 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2502 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2503 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2511 basic_string& operator =(
const char* str) {
2513 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2514 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2521 basic_string& operator =(
const xtd::char16 * str) {
2523 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2524 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2531 basic_string& operator =(
const xtd::char32 * str) {
2533 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2534 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2541 basic_string& operator =(
const xtd::char8 * str) {
2543 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2544 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2551 basic_string& operator =(
const xtd::wchar * str) {
2553 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2554 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2561 basic_string& operator =(
char character) {
2562 self_ = basic_string(1, character);
2569 self_ = basic_string(1, character);
2576 self_ = basic_string(1, character);
2582 basic_string& operator =(
xtd::char8 character) {
2583 self_ = basic_string(1, character);
2589 basic_string& operator =(
xtd::wchar character) {
2590 self_ = basic_string(1, character);
2597 basic_string& operator =(
const std::initializer_list<char>& il) {
2598 self_ = basic_string(il);
2604 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2605 self_ = basic_string(il);
2611 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2612 self_ = basic_string(il);
2618 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2619 self_ = basic_string(il);
2625 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2626 self_ = basic_string(il);
2633 basic_string & operator +=(
const basic_string<char>& str) {
2634 if constexpr(std::is_same_v<char, char_t>) chars_ += str.chars_;
2635 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2641 basic_string & operator +=(
const basic_string<xtd::char16>& str) {
2642 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2643 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2649 basic_string & operator +=(
const basic_string<xtd::char32>& str) {
2650 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2651 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2657 basic_string & operator +=(
const basic_string<xtd::char8>& str) {
2658 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2659 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2665 basic_string & operator +=(
const basic_string<xtd::wchar>& str) {
2666 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2667 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2674 basic_string & operator +=(basic_string<char>&& str) {
2675 if constexpr(std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2676 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2682 basic_string & operator +=(basic_string<xtd::char16>&& str) {
2683 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2684 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2690 basic_string & operator +=(basic_string<xtd::char32>&& str) {
2691 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2692 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2698 basic_string & operator +=(basic_string<xtd::char8>&& str) {
2699 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2700 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2706 basic_string & operator +=(basic_string<xtd::wchar>&& str) {
2707 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2708 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2715 basic_string & operator +=(
const std::basic_string<char>& str) {
2716 if constexpr(std::is_same_v<char, char_t>) chars_ += str;
2717 else chars_ += __xtd_convert_to_string<value_type>(str);
2723 basic_string & operator +=(
const std::basic_string<xtd::char16>& str) {
2724 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str;
2725 else chars_ += __xtd_convert_to_string<value_type>(str);
2731 basic_string & operator +=(
const std::basic_string<xtd::char32>& str) {
2732 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str;
2733 else chars_ += __xtd_convert_to_string<value_type>(str);
2739 basic_string & operator +=(
const std::basic_string<xtd::char8>& str) {
2740 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str;
2741 else chars_ += __xtd_convert_to_string<value_type>(str);
2747 basic_string & operator +=(
const std::basic_string<xtd::wchar>& str) {
2748 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2749 else chars_ += __xtd_convert_to_string<value_type>(str);
2756 basic_string & operator +=(
const char* str) {
2757 chars_ += basic_string(str).chars_;
2763 basic_string & operator +=(
const xtd::char16 * str) {
2764 chars_.
append(basic_string(str).chars_);
return self_;
2769 basic_string & operator +=(
const xtd::char32 * str) {
2770 chars_ += basic_string(str).chars_;
2776 basic_string & operator +=(
const xtd::char8 * str) {
2777 chars_ += basic_string(str).chars_;
2783 basic_string & operator +=(
const xtd::wchar * str) {
2784 chars_ += basic_string(str).chars_;
2790 basic_string & operator +=(
char ch) {
2791 chars_ += basic_string(1, ch).chars_;
2798 chars_ += basic_string(1, ch).chars_;
2805 chars_ += basic_string(1, ch).chars_;
2812 chars_ += basic_string(1, ch).chars_;
2819 chars_ += basic_string(1, ch).chars_;
2827 friend basic_string operator +(
const basic_string & lhs,
const basic_string<char>& rhs) {
2836 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char16>& rhs) {
2845 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char32>& rhs) {
2854 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char8>& rhs) {
2863 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::wchar>& rhs) {
2873 friend basic_string operator +(basic_string&& lhs, basic_string<char>&& rhs) {
2874 auto result = std::move(lhs);
2875 result += std::move(rhs);
2882 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char16>&& rhs) {
2883 auto result = std::move(lhs);
2884 result += std::move(rhs);
2891 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char32>&& rhs) {
2892 auto result = std::move(lhs);
2893 result += std::move(rhs);
2900 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char8>&& rhs) {
2901 auto result = std::move(lhs);
2902 result += std::move(rhs);
2909 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::wchar>&& rhs) {
2910 auto result = std::move(lhs);
2911 result += std::move(rhs);
2919 friend basic_string operator +(basic_string&& lhs,
const basic_string<char>& rhs) {
2920 auto result = std::move(lhs);
2928 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char16>& rhs) {
2929 auto result = std::move(lhs);
2937 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char32>& rhs) {
2938 auto result = std::move(lhs);
2946 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char8>& rhs) {
2947 auto result = std::move(lhs);
2955 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::wchar>& rhs) {
2956 auto result = std::move(lhs);
2965 friend basic_string operator +(
const basic_string & lhs, basic_string<char>&& rhs) {
2967 result += std::move(rhs);
2974 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char16>&& rhs) {
2976 result += std::move(rhs);
2983 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char32>&& rhs) {
2985 result += std::move(rhs);
2992 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char8>&& rhs) {
2994 result += std::move(rhs);
3001 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::wchar>&& rhs) {
3003 result += std::move(rhs);
3011 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<char>& rhs) {
3020 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char16>& rhs) {
3029 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char32>& rhs) {
3038 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char8>& rhs) {
3047 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::wchar>& rhs) {
3057 friend basic_string operator +(
const std::basic_string<char>& lhs,
const basic_string & rhs) {
3059 if constexpr(std::is_same_v<char, char_t>) result += rhs.chars();
3060 else result += __xtd_convert_to_string<char>(rhs.chars());
3067 friend basic_string operator +(
const std::basic_string<xtd::char16>& lhs,
const basic_string & rhs) {
3069 if constexpr(std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
3070 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
3077 friend basic_string operator +(
const std::basic_string<xtd::char32>& lhs,
const basic_string & rhs) {
3079 if constexpr(std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
3080 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
3087 friend basic_string operator +(
const std::basic_string<xtd::char8>& lhs,
const basic_string & rhs) {
3089 if constexpr(std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
3090 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
3097 friend basic_string operator +(
const std::basic_string<xtd::wchar>& lhs,
const basic_string & rhs) {
3099 if constexpr(std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
3100 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
3108 friend basic_string operator +(
const basic_string & lhs,
const char* rhs) {
3117 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 * rhs) {
3126 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 * rhs) {
3135 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 * rhs) {
3144 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar * rhs) {
3154 friend basic_string operator +(basic_string&& lhs,
const char* rhs) {
3155 auto result = std::move(lhs);
3163 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 * rhs) {
3164 auto result = std::move(lhs);
3172 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 * rhs) {
3173 auto result = std::move(lhs);
3181 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 * rhs) {
3182 auto result = std::move(lhs);
3190 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar * rhs) {
3191 auto result = std::move(lhs);
3200 friend basic_string operator +(
const char* lhs,
const basic_string & rhs) {
3201 auto result = basic_string(lhs);
3209 friend basic_string operator +(
const xtd::char16 * lhs,
const basic_string & rhs) {
3210 auto result = basic_string(lhs);
3218 friend basic_string operator +(
const xtd::char32 * lhs,
const basic_string & rhs) {
3219 auto result = basic_string(lhs);
3227 friend basic_string operator +(
const xtd::char8 * lhs,
const basic_string & rhs) {
3228 auto result = basic_string(lhs);
3236 friend basic_string operator +(
const xtd::wchar * lhs,
const basic_string & rhs) {
3237 auto result = basic_string(lhs);
3246 friend basic_string operator +(
const char* lhs, basic_string&& rhs) {
3247 auto result = basic_string(lhs);
3248 result += std::move(rhs);
3255 friend basic_string operator +(
const xtd::char16 * lhs, basic_string&& rhs) {
3256 auto result = basic_string(lhs);
3257 result += std::move(rhs);
3264 friend basic_string operator +(
const xtd::char32 * lhs, basic_string&& rhs) {
3265 auto result = basic_string(lhs);
3266 result += std::move(rhs);
3273 friend basic_string operator +(
const xtd::char8 * lhs, basic_string&& rhs) {
3274 auto result = basic_string(lhs);
3275 result += std::move(rhs);
3282 friend basic_string operator +(
const xtd::wchar * lhs, basic_string&& rhs) {
3283 auto result = basic_string(lhs);
3284 result += std::move(rhs);
3292 friend basic_string operator +(
const basic_string & lhs,
const char rhs) {
3301 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 rhs) {
3310 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 rhs) {
3319 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 rhs) {
3328 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar rhs) {
3338 friend basic_string operator +(basic_string&& lhs,
const char rhs) {
3339 auto result = std::move(lhs);
3347 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 rhs) {
3348 auto result = std::move(lhs);
3356 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 rhs) {
3357 auto result = std::move(lhs);
3365 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 rhs) {
3366 auto result = std::move(lhs);
3374 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar rhs) {
3375 auto result = std::move(lhs);
3384 friend basic_string operator +(
char lhs,
const basic_string & rhs) {
3385 auto result = basic_string(1, lhs);
3393 friend basic_string operator +(
xtd::char16 lhs,
const basic_string & rhs) {
3394 auto result = basic_string(1, lhs);
3402 friend basic_string operator +(
xtd::char32 lhs,
const basic_string & rhs) {
3403 auto result = basic_string(1, lhs);
3411 friend basic_string operator +(
xtd::char8 lhs,
const basic_string & rhs) {
3412 auto result = basic_string(1, lhs);
3420 friend basic_string operator +(
xtd::wchar lhs,
const basic_string & rhs) {
3421 auto result = basic_string(1, lhs);
3430 friend basic_string operator +(
char lhs, basic_string&& rhs) {
3431 auto result = basic_string(1, lhs);
3432 result += std::move(rhs);
3439 friend basic_string operator +(
xtd::char16 lhs, basic_string&& rhs) {
3440 auto result = basic_string(1, lhs);
3441 result += std::move(rhs);
3448 friend basic_string operator +(
xtd::char32 lhs, basic_string&& rhs) {
3449 auto result = basic_string(1, lhs);
3450 result += std::move(rhs);
3457 friend basic_string operator +(
xtd::char8 lhs, basic_string&& rhs) {
3458 auto result = basic_string(1, lhs);
3459 result += std::move(rhs);
3466 friend basic_string operator +(
xtd::wchar lhs, basic_string&& rhs) {
3467 auto result = basic_string(1, lhs);
3468 result += std::move(rhs);
3481 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string & str) {
3482 if constexpr(std::is_same_v<char, char_t>)
return stream << str.chars();
3483 else return stream << __xtd_convert_to_string<char>(str.chars());
3491 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string & str) {
return stream << str.to_wstring().chars();}
3501 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream, basic_string & str) {
3502 auto s = std::basic_string<char> {};
3515 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream, basic_string & str) {
3516 auto s = std::basic_string<xtd::wchar> {};
3528 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
3538 template<
class object_t>
3539 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
3545 template<
class object_t>
3546 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
3552 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
3558 template<
class object_t>
3559 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
3565 template<
class object_t>
3566 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
3572 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
3583 static const
xtd::array<value_type> default_split_separators;
3584 static const
xtd::array<value_type> default_trim_chars;
3586 template<class arg_t>
3587 static auto convert_param(arg_t&& arg) noexcept {
3588 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();
3589 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();
3590 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();
3591 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();
3592 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();
3593 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();
3594 else return std::forward<arg_t>(arg);
3597 static basic_string get_class_name(
const basic_string & full_name) {
3600 if (full_name.last_index_of(
"::", 0,
length) ==
npos)
return full_name;
3601 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);