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();}
856 const base_type & chars()
const noexcept {
return chars_;}
860 base_type & chars()
noexcept {
return chars_;}
865 virtual size_type
count()
const noexcept {
return chars_.size();}
874 const_pointer
data()
const noexcept {
return chars_.data();}
878 virtual bool empty()
const noexcept {
return length() == 0;}
883 virtual size_type
length()
const noexcept {
return chars_.size();}
888 virtual size_type
size()
const noexcept {
return chars_.size();}
934 int32 compare(size_type pos1, size_type count1,
const basic_string & str)
const {
return chars_.compare(pos1, count1, str);}
958 int32 compare(size_type pos1, size_type count1,
const basic_string & str, size_type pos2)
const {
return chars_.compare(pos1, count1, str, pos2);}
983 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);}
1002 int32 compare(const_pointer
s)
const {
return chars_.compare(
s);}
1024 int32 compare(size_type pos1, size_type count1, const_pointer
s)
const {
return chars_.compare(pos1, count1,
s);}
1047 int32 compare(size_type pos1, size_type count1, const_pointer
s, size_type count2)
const {
return chars_.compare(pos1, count1,
s, count2);}
1096 if (ignore_case)
return to_upper().chars_ == value.to_upper().chars_;
1097 return chars_ == value.chars_;
1109 if (ignore_case)
return to_lower().rfind(
static_cast<value_type>(tolower(value))) ==
length() - 1;
1110 return chars_.rfind(value) ==
length() - 1;
1127 return chars_.rfind(value) + value.length() ==
length();
1147 size_type
find(const_pointer
s, size_type pos, size_type
count)
const {
return chars_.find(
s, pos,
count);}
1153 size_type
find(const_pointer
s)
const {
return chars_.find(
s);}
1160 size_type
find(const_pointer
s, size_type pos)
const {
return chars_.find(
s, pos);}
1204 size_type
find_first_of(const_pointer
s, size_type pos)
const {
return chars_.find_first_of(
s, pos);}
1215 size_type
find_first_of(char_t ch, size_type pos)
const {
return chars_.find_first_of(ch, pos);}
1259 size_type
find_first_not_of(char_t ch, size_type pos)
const {
return chars_.find_first_not_of(ch, pos);}
1292 size_type
find_last_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_of(
s, pos);}
1303 size_type
find_last_of(char_t ch, size_type pos)
const {
return chars_.find_last_of(ch, pos);}
1336 size_type
find_last_not_of(const_pointer
s, size_type pos)
const {
return chars_.find_last_not_of(
s, pos);}
1347 size_type
find_last_not_of(char_t ch, size_type pos)
const {
return chars_.find_last_not_of(ch, pos);}
1364 explicit basic_string_enumerator(
const basic_string & chars) : chars_(chars) {}
1366 const value_type & current()
const override {
return chars_[index_];}
1368 bool move_next()
override {
return ++index_ < chars_.length();}
1370 void reset()
override {index_ = basic_string::npos;}
1396 auto result =
find(value, start_index);
1397 return result > start_index +
count ?
npos : result;
1416 auto result =
find(value, start_index);
1417 return result > start_index +
count ?
npos : result;
1451 auto result =
self_;
1452 result.chars_.insert(start_index, value);
1474 auto result = chars_.rfind(value, start_index +
count - value.length());
1475 return result < start_index ?
npos : result;
1496 auto result = chars_.rfind(value, start_index +
count - 1);
1497 return result < start_index ?
npos : result;
1565 std::wstringstream ss;
1566 if constexpr(std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1567 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1581 auto result =
self_;
1582 result.chars_.erase(start_index,
count);
1597 auto result =
self_;
1598 auto old_size = old_string.length();
1599 auto new_size = new_string.length();
1602 index = result.find(old_string, index);
1603 if (index ==
npos)
break;
1604 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1606 result.chars_.erase(index, old_string.length());
1607 result.chars_.insert(index, new_string);
1609 index += new_string.length();
1623 size_type
rfind(
const basic_string & str, size_type pos)
const {
return chars_.rfind(str, pos);}
1637 size_type
rfind(const_pointer
s)
const {
return chars_.rfind(
s);}
1644 size_type
rfind(const_pointer
s, size_type pos)
const {
return chars_.rfind(
s, pos);}
1655 size_type
rfind(
value_type ch, size_type pos)
const {
return chars_.rfind(ch, pos);}
1661 xtd::array<basic_string> split() const noexcept;
1711 xtd::array<basic_string> split(const xtd::array<
value_type>& separators) const noexcept;
1737 xtd::array<basic_string> split(const xtd::array<
value_type>& separators, xtd::
size count) const noexcept;
1755 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1761 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1762 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1763 return find(value) == 0;
1782 return find(value) == 0;
1789 basic_string substr()
const {
return chars_.substr();}
1795 basic_string substr(size_type pos)
const {
1797 return chars_.substr(pos);
1805 basic_string substr(size_type pos, size_type
count)
const {
1807 return chars_.substr(pos,
count);
1815 basic_string substring(
xtd::size start_index)
const {
1817 return substr(start_index);
1826 return substr(start_index,
length);
1831 xtd::array<value_type>
to_array() const noexcept;
1844 xtd::array<
value_type> to_char_array() const noexcept;
1853 basic_string to_lower() const noexcept {
1854 auto result = basic_string::empty_string;
1855 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1862 basic_string<char>
to_string() const noexcept
override {
1863 if constexpr(std::is_same_v<char, char_t>)
return chars_;
1864 else return __xtd_convert_to_string<char>(chars_);
1869 basic_string to_title_case() const noexcept;
1873 basic_string<xtd::
char16> to_u16string() const noexcept {
1874 if constexpr(std::is_same_v<xtd::char16, char_t>)
return chars_;
1875 else return __xtd_convert_to_string<xtd::char16>(chars_);
1880 basic_string<xtd::char32> to_u32string() const noexcept {
1881 if constexpr(std::is_same_v<xtd::char32, char_t>)
return chars_;
1882 else return __xtd_convert_to_string<xtd::char32>(chars_);
1887 basic_string<xtd::char8> to_u8string() const noexcept {
1888 if constexpr(std::is_same_v<xtd::char8, char_t>)
return chars_;
1889 else return __xtd_convert_to_string<xtd::char8>(chars_);
1894 basic_string to_upper() const noexcept {
1895 auto result = basic_string::empty_string;
1896 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1902 basic_string<xtd::wchar> to_wstring() const noexcept {
1903 if constexpr(std::is_same_v<xtd::wchar, char_t>)
return chars_;
1904 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1911 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1916 basic_string trim(
value_type trim_char)
const noexcept;
1921 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1927 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1932 basic_string trim_end(
value_type trim_char)
const noexcept;
1937 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1943 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1948 basic_string trim_start(
value_type trim_char)
const noexcept;
1953 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
1968 static int32 compare(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return compare(str_a, str_b,
false);}
2017 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);}
2039 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;}
2046 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
2047 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);}
2053 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;}
2059 template<
class object_a_t,
class object_b_t,
class object_c_t>
2060 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);}
2065 static basic_string
concat(
const basic_string & str_a,
const basic_string & str_b)
noexcept {
return str_a + str_b;}
2070 template<
class object_a_t,
class object_b_t>
2071 static basic_string
concat(object_a_t obj_a, object_b_t obj_b)
noexcept {
return format(
"{}{}", obj_a, obj_b);}
2075 static basic_string
concat(
const xtd::array<basic_string>& values)
noexcept;
2077 static basic_string
concat(
const xtd::array<const_pointer>& values)
noexcept;
2078 template<
class other_
char_t>
2079 static basic_string
concat(
const xtd::array<const other_char_t*>& values)
noexcept;
2080 static basic_string
concat(
const std::initializer_list<basic_string>& values)
noexcept {
2081 auto result = basic_string::empty_string;
2082 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2085 static basic_string
concat(
const std::initializer_list<const_pointer>& values)
noexcept {
2086 auto result = basic_string::empty_string;
2087 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2090 template<
class other_
char_t>
2091 static basic_string
concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
2092 auto result = basic_string::empty_string;
2093 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
2100 template<
class object_t>
2101 static basic_string
concat(
const xtd::array<object_t>& args)
noexcept;
2103 template<
class object_t>
2104 static basic_string
concat(
const std::initializer_list<object_t>& args)
noexcept {
2105 basic_string result;
2106 for (
const auto& arg : args)
2107 result +=
format(
"{}", arg);
2114 template<
class value_t>
2115 static basic_string
concat(value_t value)
noexcept {
2116 return format(
"{}", value);
2139 static basic_string demangle(
const basic_string & name) {
2140 if constexpr(std::is_same_v<char, char_t>)
return __xtd_demangle(
name.chars());
2141 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.chars()));
2149 static bool equals(
const basic_string &
a,
const basic_string &
b)
noexcept{
return a.equals(
b);}
2155 template<
class char_a_t,
class char_b_t>
2156 static bool equals(
const char_a_t*
a,
const char_b_t*
b)
noexcept{
return basic_string {
a}.
equals(basic_string {
b});}
2164 static bool equals(
const basic_string &
a,
const basic_string &
b,
bool ignore_case)
noexcept {
return a.equals(
b, ignore_case);}
2171 template<
class char_a_t,
class char_b_t>
2172 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);}
2180 template<
class ...args_t>
2181 static basic_string
format(
const basic_string<char>& fmt, args_t&& ... args);
2190 template<
class ...args_t>
2191 static basic_string
format(
const std::locale & loc,
const basic_string<char>& fmt, args_t&& ... args);
2196 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
2204 template<
class collection_t>
2205 static basic_string join(
const basic_string
separator,
const collection_t& values)
noexcept {
2207 basic_string result;
2208 for (
const auto& item : values)
2219 template<
class collection_t>
2220 static basic_string join(
const basic_string &
separator,
const collection_t& values,
xtd::size index) {
return join(
separator, values, index, values.size() - index);}
2229 template<
class collection_t>
2233 basic_string result;
2234 for (
const auto& item : values) {
2235 if (
i >= index) result +=
format(
"{}{}", (
i != index ?
separator : basic_string {}), item);
2236 if (++
i >= index +
count)
break;
2242 template<
class value_t>
2243 static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values)
noexcept;
2244 template<
class value_t>
2245 static basic_string join(
const basic_string &
separator,
const std::initializer_list<value_t>& values,
xtd::size index);
2246 template<
class value_t>
2253 template<
class value_t>
2254 static value_t
parse(
const basic_string & str) {
2318 template<
class ...args_t>
2319 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)) ...);}
2325 template<
class value_t>
2326 static bool try_parse(
const basic_string & str, value_t& value)
noexcept {
2345 return chars_[index ==
epos ?
length() - 1 : index];
2350 operator const base_type & ()
const noexcept {
return chars_;}
2355 basic_string& operator =(
const basic_string<char>& str)
noexcept {
2356 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
2357 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2363 basic_string& operator =(
const basic_string<xtd::char16>& str)
noexcept {
2364 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
2365 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2371 basic_string& operator =(
const basic_string<xtd::char32>& str)
noexcept {
2372 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
2373 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2379 basic_string& operator =(
const basic_string<xtd::char8>& str)
noexcept {
2380 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
2381 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2387 basic_string& operator =(
const basic_string<xtd::wchar>& str)
noexcept {
2388 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
2389 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
2396 basic_string& operator =(basic_string<char>&& str)
noexcept {
2397 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
2398 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2404 basic_string& operator =(basic_string<xtd::char16>&& str)
noexcept {
2405 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
2406 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2412 basic_string& operator =(basic_string<xtd::char32>&& str)
noexcept {
2413 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
2414 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2420 basic_string& operator =(basic_string<xtd::char8>&& str)
noexcept {
2421 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
2422 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2428 basic_string& operator =(basic_string<xtd::wchar>&& str)
noexcept {
2429 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
2430 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
2437 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
2438 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
2439 else chars_ = __xtd_convert_to_string<value_type>(str);
2445 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
2446 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
2447 else chars_ = __xtd_convert_to_string<value_type>(str);
2453 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
2454 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
2455 else chars_ = __xtd_convert_to_string<value_type>(str);
2461 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
2462 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
2463 else chars_ = __xtd_convert_to_string<value_type>(str);
2469 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
2470 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
2471 else chars_ = __xtd_convert_to_string<value_type>(str);
2478 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
2479 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
2480 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2486 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
2487 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
2488 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2494 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
2495 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
2496 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2502 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
2503 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2504 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2510 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2511 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2512 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2520 basic_string& operator =(
const char* str) {
2522 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2523 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2530 basic_string& operator =(
const xtd::char16 * str) {
2532 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2533 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2540 basic_string& operator =(
const xtd::char32 * str) {
2542 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2543 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2550 basic_string& operator =(
const xtd::char8 * str) {
2552 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2553 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2560 basic_string& operator =(
const xtd::wchar * str) {
2562 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2563 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2570 basic_string& operator =(
char character) {
2571 self_ = basic_string(1, character);
2578 self_ = basic_string(1, character);
2585 self_ = basic_string(1, character);
2591 basic_string& operator =(
xtd::char8 character) {
2592 self_ = basic_string(1, character);
2598 basic_string& operator =(
xtd::wchar character) {
2599 self_ = basic_string(1, character);
2606 basic_string& operator =(
const std::initializer_list<char>& il) {
2607 self_ = basic_string(il);
2613 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2614 self_ = basic_string(il);
2620 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2621 self_ = basic_string(il);
2627 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2628 self_ = basic_string(il);
2634 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2635 self_ = basic_string(il);
2642 basic_string & operator +=(
const basic_string<char>& str) {
2643 if constexpr(std::is_same_v<char, char_t>) chars_ += str.chars_;
2644 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2650 basic_string & operator +=(
const basic_string<xtd::char16>& str) {
2651 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2652 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2658 basic_string & operator +=(
const basic_string<xtd::char32>& str) {
2659 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2660 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2666 basic_string & operator +=(
const basic_string<xtd::char8>& str) {
2667 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2668 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2674 basic_string & operator +=(
const basic_string<xtd::wchar>& str) {
2675 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2676 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2683 basic_string & operator +=(basic_string<char>&& str) {
2684 if constexpr(std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2685 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2691 basic_string & operator +=(basic_string<xtd::char16>&& str) {
2692 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2693 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2699 basic_string & operator +=(basic_string<xtd::char32>&& str) {
2700 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2701 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2707 basic_string & operator +=(basic_string<xtd::char8>&& str) {
2708 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2709 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2715 basic_string & operator +=(basic_string<xtd::wchar>&& str) {
2716 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2717 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2724 basic_string & operator +=(
const std::basic_string<char>& str) {
2725 if constexpr(std::is_same_v<char, char_t>) chars_ += str;
2726 else chars_ += __xtd_convert_to_string<value_type>(str);
2732 basic_string & operator +=(
const std::basic_string<xtd::char16>& str) {
2733 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str;
2734 else chars_ += __xtd_convert_to_string<value_type>(str);
2740 basic_string & operator +=(
const std::basic_string<xtd::char32>& str) {
2741 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str;
2742 else chars_ += __xtd_convert_to_string<value_type>(str);
2748 basic_string & operator +=(
const std::basic_string<xtd::char8>& str) {
2749 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str;
2750 else chars_ += __xtd_convert_to_string<value_type>(str);
2756 basic_string & operator +=(
const std::basic_string<xtd::wchar>& str) {
2757 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2758 else chars_ += __xtd_convert_to_string<value_type>(str);
2765 basic_string & operator +=(
const char* str) {
2766 chars_ += basic_string(str).chars_;
2772 basic_string & operator +=(
const xtd::char16 * str) {
2773 chars_.
append(basic_string(str).chars_);
return self_;
2778 basic_string & operator +=(
const xtd::char32 * str) {
2779 chars_ += basic_string(str).chars_;
2785 basic_string & operator +=(
const xtd::char8 * str) {
2786 chars_ += basic_string(str).chars_;
2792 basic_string & operator +=(
const xtd::wchar * str) {
2793 chars_ += basic_string(str).chars_;
2799 basic_string & operator +=(
char ch) {
2800 chars_ += basic_string(1, ch).chars_;
2807 chars_ += basic_string(1, ch).chars_;
2814 chars_ += basic_string(1, ch).chars_;
2821 chars_ += basic_string(1, ch).chars_;
2828 chars_ += basic_string(1, ch).chars_;
2836 friend basic_string operator +(
const basic_string & lhs,
const basic_string<char>& rhs) {
2845 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char16>& rhs) {
2854 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char32>& rhs) {
2863 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::char8>& rhs) {
2872 friend basic_string operator +(
const basic_string & lhs,
const basic_string<xtd::wchar>& rhs) {
2882 friend basic_string operator +(basic_string&& lhs, basic_string<char>&& rhs) {
2883 auto result = std::move(lhs);
2884 result += std::move(rhs);
2891 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char16>&& rhs) {
2892 auto result = std::move(lhs);
2893 result += std::move(rhs);
2900 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char32>&& rhs) {
2901 auto result = std::move(lhs);
2902 result += std::move(rhs);
2909 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::char8>&& rhs) {
2910 auto result = std::move(lhs);
2911 result += std::move(rhs);
2918 friend basic_string operator +(basic_string&& lhs, basic_string<xtd::wchar>&& rhs) {
2919 auto result = std::move(lhs);
2920 result += std::move(rhs);
2928 friend basic_string operator +(basic_string&& lhs,
const basic_string<char>& rhs) {
2929 auto result = std::move(lhs);
2937 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char16>& rhs) {
2938 auto result = std::move(lhs);
2946 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char32>& rhs) {
2947 auto result = std::move(lhs);
2955 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::char8>& rhs) {
2956 auto result = std::move(lhs);
2964 friend basic_string operator +(basic_string&& lhs,
const basic_string<xtd::wchar>& rhs) {
2965 auto result = std::move(lhs);
2974 friend basic_string operator +(
const basic_string & lhs, basic_string<char>&& rhs) {
2976 result += std::move(rhs);
2983 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char16>&& rhs) {
2985 result += std::move(rhs);
2992 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char32>&& rhs) {
2994 result += std::move(rhs);
3001 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::char8>&& rhs) {
3003 result += std::move(rhs);
3010 friend basic_string operator +(
const basic_string & lhs, basic_string<xtd::wchar>&& rhs) {
3012 result += std::move(rhs);
3020 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<char>& rhs) {
3029 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char16>& rhs) {
3038 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char32>& rhs) {
3047 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::char8>& rhs) {
3056 friend basic_string operator +(
const basic_string & lhs,
const std::basic_string<xtd::wchar>& rhs) {
3066 friend basic_string operator +(
const std::basic_string<char>& lhs,
const basic_string & rhs) {
3068 if constexpr(std::is_same_v<char, char_t>) result += rhs.chars();
3069 else result += __xtd_convert_to_string<char>(rhs.chars());
3076 friend basic_string operator +(
const std::basic_string<xtd::char16>& lhs,
const basic_string & rhs) {
3078 if constexpr(std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
3079 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
3086 friend basic_string operator +(
const std::basic_string<xtd::char32>& lhs,
const basic_string & rhs) {
3088 if constexpr(std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
3089 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
3096 friend basic_string operator +(
const std::basic_string<xtd::char8>& lhs,
const basic_string & rhs) {
3098 if constexpr(std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
3099 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
3106 friend basic_string operator +(
const std::basic_string<xtd::wchar>& lhs,
const basic_string & rhs) {
3108 if constexpr(std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
3109 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
3117 friend basic_string operator +(
const basic_string & lhs,
const char* rhs) {
3126 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 * rhs) {
3135 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 * rhs) {
3144 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 * rhs) {
3153 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar * rhs) {
3163 friend basic_string operator +(basic_string&& lhs,
const char* rhs) {
3164 auto result = std::move(lhs);
3172 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 * rhs) {
3173 auto result = std::move(lhs);
3181 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 * rhs) {
3182 auto result = std::move(lhs);
3190 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 * rhs) {
3191 auto result = std::move(lhs);
3199 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar * rhs) {
3200 auto result = std::move(lhs);
3209 friend basic_string operator +(
const char* lhs,
const basic_string & rhs) {
3210 auto result = basic_string(lhs);
3218 friend basic_string operator +(
const xtd::char16 * lhs,
const basic_string & rhs) {
3219 auto result = basic_string(lhs);
3227 friend basic_string operator +(
const xtd::char32 * lhs,
const basic_string & rhs) {
3228 auto result = basic_string(lhs);
3236 friend basic_string operator +(
const xtd::char8 * lhs,
const basic_string & rhs) {
3237 auto result = basic_string(lhs);
3245 friend basic_string operator +(
const xtd::wchar * lhs,
const basic_string & rhs) {
3246 auto result = basic_string(lhs);
3255 friend basic_string operator +(
const char* lhs, basic_string&& rhs) {
3256 auto result = basic_string(lhs);
3257 result += std::move(rhs);
3264 friend basic_string operator +(
const xtd::char16 * lhs, basic_string&& rhs) {
3265 auto result = basic_string(lhs);
3266 result += std::move(rhs);
3273 friend basic_string operator +(
const xtd::char32 * lhs, basic_string&& rhs) {
3274 auto result = basic_string(lhs);
3275 result += std::move(rhs);
3282 friend basic_string operator +(
const xtd::char8 * lhs, basic_string&& rhs) {
3283 auto result = basic_string(lhs);
3284 result += std::move(rhs);
3291 friend basic_string operator +(
const xtd::wchar * lhs, basic_string&& rhs) {
3292 auto result = basic_string(lhs);
3293 result += std::move(rhs);
3301 friend basic_string operator +(
const basic_string & lhs,
const char rhs) {
3310 friend basic_string operator +(
const basic_string & lhs,
const xtd::char16 rhs) {
3319 friend basic_string operator +(
const basic_string & lhs,
const xtd::char32 rhs) {
3328 friend basic_string operator +(
const basic_string & lhs,
const xtd::char8 rhs) {
3337 friend basic_string operator +(
const basic_string & lhs,
const xtd::wchar rhs) {
3347 friend basic_string operator +(basic_string&& lhs,
const char rhs) {
3348 auto result = std::move(lhs);
3356 friend basic_string operator +(basic_string&& lhs,
const xtd::char16 rhs) {
3357 auto result = std::move(lhs);
3365 friend basic_string operator +(basic_string&& lhs,
const xtd::char32 rhs) {
3366 auto result = std::move(lhs);
3374 friend basic_string operator +(basic_string&& lhs,
const xtd::char8 rhs) {
3375 auto result = std::move(lhs);
3383 friend basic_string operator +(basic_string&& lhs,
const xtd::wchar rhs) {
3384 auto result = std::move(lhs);
3393 friend basic_string operator +(
char lhs,
const basic_string & rhs) {
3394 auto result = basic_string(1, lhs);
3402 friend basic_string operator +(
xtd::char16 lhs,
const basic_string & rhs) {
3403 auto result = basic_string(1, lhs);
3411 friend basic_string operator +(
xtd::char32 lhs,
const basic_string & rhs) {
3412 auto result = basic_string(1, lhs);
3420 friend basic_string operator +(
xtd::char8 lhs,
const basic_string & rhs) {
3421 auto result = basic_string(1, lhs);
3429 friend basic_string operator +(
xtd::wchar lhs,
const basic_string & rhs) {
3430 auto result = basic_string(1, lhs);
3439 friend basic_string operator +(
char lhs, basic_string&& rhs) {
3440 auto result = basic_string(1, lhs);
3441 result += std::move(rhs);
3448 friend basic_string operator +(
xtd::char16 lhs, basic_string&& rhs) {
3449 auto result = basic_string(1, lhs);
3450 result += std::move(rhs);
3457 friend basic_string operator +(
xtd::char32 lhs, basic_string&& rhs) {
3458 auto result = basic_string(1, lhs);
3459 result += std::move(rhs);
3466 friend basic_string operator +(
xtd::char8 lhs, basic_string&& rhs) {
3467 auto result = basic_string(1, lhs);
3468 result += std::move(rhs);
3475 friend basic_string operator +(
xtd::wchar lhs, basic_string&& rhs) {
3476 auto result = basic_string(1, lhs);
3477 result += std::move(rhs);
3490 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string & str) {
3491 if constexpr(std::is_same_v<char, char_t>)
return stream << str.chars();
3492 else return stream << __xtd_convert_to_string<char>(str.chars());
3500 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string & str) {
return stream << str.to_wstring().chars();}
3510 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream, basic_string & str) {
3511 auto s = std::basic_string<char> {};
3524 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream, basic_string & str) {
3525 auto s = std::basic_string<xtd::wchar> {};
3537 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
3547 template<
class object_t>
3548 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
3554 template<
class object_t>
3555 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
3561 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
3567 template<
class object_t>
3568 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
3574 template<
class object_t>
3575 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
3581 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
3592 static const
xtd::array<value_type> default_split_separators;
3593 static const
xtd::array<value_type> default_trim_chars;
3595 template<class arg_t>
3596 static auto convert_param(arg_t&& arg) noexcept {
3597 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();
3598 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();
3599 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();
3600 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();
3601 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();
3602 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();
3603 else return std::forward<arg_t>(arg);
3606 static basic_string get_class_name(
const basic_string & full_name) {
3609 if (full_name.last_index_of(
"::", 0,
length) ==
npos)
return full_name;
3610 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);