73 using base_type = std::basic_string<char_t, traits_t, allocator_t>;
89 using pointer =
typename base_type::pointer;
162 basic_string(std::basic_string<char_t>&& str) : chars_ {std::move(str)} {}
166 if constexpr(std::is_same_v<char, char_t>) chars_ = str.chars_;
167 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
172 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str.chars_;
173 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
178 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str.chars_;
179 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
184 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str.chars_;
185 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
190 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str.chars_;
191 else chars_ = __xtd_convert_to_string<value_type>(str.chars_);
196 if constexpr(std::is_same_v<char, char_t>) chars_ = str;
197 else chars_ = __xtd_convert_to_string<value_type>(str);
202 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = str;
203 else chars_ = __xtd_convert_to_string<value_type>(str);
208 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = str;
209 else chars_ = __xtd_convert_to_string<value_type>(str);
214 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = str;
215 else chars_ = __xtd_convert_to_string<value_type>(str);
220 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = str;
221 else chars_ = __xtd_convert_to_string<value_type>(str);
247 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
248 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
254 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
255 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
261 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
262 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
268 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
269 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
275 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
276 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
283 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str,
count);
284 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str,
count));
290 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str,
count);
291 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str,
count));
297 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str,
count);
298 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str,
count));
304 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str,
count);
305 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str,
count));
311 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str,
count);
312 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str,
count));
317 template<
class input_iterator_t>
321 basic_string(
const std::basic_string_view<char_t>& str) : chars_(str) {}
593 if (ignore_case)
return to_upper().chars_ == value.to_upper().chars_;
594 return chars_ == value.chars_;
600 bool ends_with(
value_type value)
const noexcept {
return ends_with(value,
false);}
605 bool ends_with(
value_type value,
bool ignore_case)
const noexcept {
606 if (ignore_case)
return to_lower().rfind(
static_cast<value_type>(tolower(value))) ==
length() - 1;
607 return chars_.rfind(value) ==
length() - 1;
624 return chars_.rfind(value) + value.length() ==
length();
706 size_type find_first_of(char_t ch)
const {
return chars_.find_first_of(ch);}
712 size_type find_first_of(char_t ch,
size_type pos)
const {
return chars_.find_first_of(ch, pos);}
750 size_type find_first_not_of(char_t ch)
const {
return chars_.find_first_not_of(ch);}
756 size_type find_first_not_of(char_t ch,
size_type pos)
const {
return chars_.find_first_not_of(ch, pos);}
794 size_type find_last_of(char_t ch)
const {
return chars_.find_last_of(ch);}
800 size_type find_last_of(char_t ch,
size_type pos)
const {
return chars_.find_last_of(ch, pos);}
838 size_type find_last_not_of(char_t ch)
const {
return chars_.find_last_not_of(ch);}
844 size_type find_last_not_of(char_t ch,
size_type pos)
const {
return chars_.find_last_not_of(ch, pos);}
848 allocator_type get_allocator()
const {
return chars_.get_allocator();}
852 virtual const base_type& get_base_type() const noexcept {
return chars_;}
859 struct basic_string_enumerator :
public xtd::collections::generic::ienumerator<value_type> {
860 explicit basic_string_enumerator(
const basic_string & chars) : chars_(chars) {}
861 const value_type&
current()
const override {
863 return chars_[index_];
865 bool move_next()
override {
return ++index_ < chars_.length();}
866 void reset()
override {index_ = basic_string::npos;}
869 const basic_string& chars_;
892 auto result = find(value, start_index);
893 return result > start_index +
count ?
npos : result;
912 auto result = find(value, start_index);
913 return result > start_index +
count ?
npos : result;
919 xtd::size index_of_any(
const xtd::array<value_type>& values)
const noexcept;
925 xtd::size index_of_any(
const xtd::array<value_type>& values,
xtd::size start_index)
const;
934 xtd::size index_of_any(
const std::initializer_list<value_type>& values)
const noexcept;
935 xtd::size index_of_any(
const std::initializer_list<value_type>& values,
xtd::size start_index)
const;
948 result.chars_.insert(start_index, value);
970 auto result = chars_.rfind(value, start_index +
count - value.length());
971 return result < start_index ?
npos : result;
992 auto result = chars_.rfind(value, start_index +
count - 1);
993 return result < start_index ?
npos : result;
999 xtd::size last_index_of_any(
const xtd::array<value_type>& values)
const noexcept;
1004 xtd::size last_index_of_any(
const xtd::array<value_type>& values,
xtd::size start_index)
const;
1012 xtd::size last_index_of_any(
const std::initializer_list<value_type>& values)
const noexcept;
1013 xtd::size last_index_of_any(
const std::initializer_list<value_type>& values,
xtd::size start_index)
const;
1049 basic_string quoted()
const {
return quoted(
'"',
'\\');}
1061 std::wstringstream ss;
1062 if constexpr(std::is_same_v<xtd::wchar, value_type>) ss << std::quoted(chars_, delimiter,
escape);
1063 else ss << std::quoted(__xtd_convert_to_string<xtd::wchar>(chars_),
static_cast<xtd::wchar>(delimiter),
static_cast<xtd::wchar>(
escape));
1077 auto result =
self_;
1078 result.chars_.erase(start_index,
count);
1093 auto result =
self_;
1094 auto old_size = old_string.length();
1095 auto new_size = new_string.length();
1098 index = result.find(old_string, index);
1099 if (index ==
npos)
break;
1100 if (old_size == new_size) result.chars_.replace(index, old_size, new_string);
1102 result.chars_.erase(index, old_string.length());
1103 result.chars_.insert(index, new_string);
1105 index += new_string.length();
1157 xtd::array<basic_string> split() const noexcept;
1251 bool starts_with(
value_type value) const noexcept {
return starts_with(value,
false);}
1257 bool starts_with(
value_type value,
bool ignore_case)
const noexcept {
1258 if (ignore_case)
return to_lower().find(
static_cast<value_type>(tolower(value))) == 0;
1259 return find(value) == 0;
1278 return find(value) == 0;
1293 return chars_.substr(pos);
1303 return chars_.substr(pos,
count);
1313 return substr(start_index);
1322 return substr(start_index,
length);
1327 xtd::array<value_type>
to_array() const noexcept;
1340 xtd::array<
value_type> to_char_array() const noexcept;
1351 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::tolower(c));});
1359 if constexpr(std::is_same_v<char, char_t>)
return chars_;
1360 else return __xtd_convert_to_string<char>(chars_);
1370 if constexpr(std::is_same_v<xtd::char16, char_t>)
return chars_;
1371 else return __xtd_convert_to_string<xtd::char16>(chars_);
1377 if constexpr(std::is_same_v<xtd::char32, char_t>)
return chars_;
1378 else return __xtd_convert_to_string<xtd::char32>(chars_);
1384 if constexpr(std::is_same_v<xtd::char8, char_t>)
return chars_;
1385 else return __xtd_convert_to_string<xtd::char8>(chars_);
1392 std::for_each(chars_.begin(), chars_.end(), [&](
auto c) {result += static_cast<value_type>(std::toupper(c));});
1399 if constexpr(std::is_same_v<xtd::wchar, char_t>)
return chars_;
1400 else return __xtd_convert_to_string<xtd::wchar>(chars_);
1407 basic_string trim() const noexcept {
return trim(default_trim_chars);}
1417 basic_string trim(
const xtd::array<value_type>& trim_chars)
const noexcept;
1423 basic_string trim_end() const noexcept {
return trim_end(default_trim_chars);}
1433 basic_string trim_end(
const xtd::array<value_type>& trim_chars)
const noexcept;
1439 basic_string trim_start() const noexcept {
return trim_start(default_trim_chars);}
1449 basic_string trim_start(
const xtd::array<value_type>& trim_chars)
const noexcept;
1513 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);}
1542 template<
class object_a_t,
class object_b_t,
class object_c_t,
class object_d_t>
1543 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);}
1555 template<
class object_a_t,
class object_b_t,
class object_c_t>
1556 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);}
1566 template<
class object_a_t,
class object_b_t>
1574 template<
class other_
char_t>
1576 static basic_string concat(
const std::initializer_list<basic_string>& values)
noexcept {
1578 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
1581 static basic_string concat(
const std::initializer_list<const_pointer>& values)
noexcept {
1583 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
1586 template<
class other_
char_t>
1587 static basic_string concat(
const std::initializer_list<const other_char_t*>& values)
noexcept {
1589 std::for_each(values.begin(), values.end(), [&](
const auto & item) {result += item;});
1596 template<
class object_t>
1599 template<
class object_t>
1602 for (
const auto& arg : args)
1603 result +=
format(
"{}", arg);
1610 template<
class value_t>
1612 return format(
"{}", value);
1636 if constexpr(std::is_same_v<char, char_t>)
return __xtd_demangle(
name.
chars());
1637 else return __xtd_demangle(__xtd_convert_to_string<char>(
name.
chars()));
1651 template<
class char_a_t,
class char_b_t>
1667 template<
class char_a_t,
class char_b_t>
1676 template<
class ...args_t>
1686 template<
class ...args_t>
1692 static bool is_empty(
const xtd::basic_string<value_type, traits_type, allocator_type>&
string)
noexcept {
return !
string.length();}
1700 template<
class collection_t>
1704 for (
const auto& item : values)
1715 template<
class collection_t>
1725 template<
class collection_t>
1730 for (
const auto& item : values) {
1732 if (++
i >= index +
count)
break;
1738 template<
class value_t>
1740 template<
class value_t>
1742 template<
class value_t>
1749 template<
class value_t>
1814 template<
class ...args_t>
1815 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)) ...);}
1821 template<
class value_t>
1841 return chars_[index ==
epos ?
length() - 1 : index];
1846 operator const base_type& ()
const noexcept {
return chars_;}
1852 if constexpr(std::is_same<char_t, char>::value) chars_ = str.chars_;
1853 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
1860 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str.chars_;
1861 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
1868 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str.chars_;
1869 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
1876 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str.chars_;
1877 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
1884 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str.chars_;
1885 else chars_ = __xtd_convert_to_string<value_type>(str.chars());
1893 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str.chars_);
1894 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
1901 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str.chars_);
1902 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
1909 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str.chars_);
1910 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
1917 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str.chars_);
1918 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
1925 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str.chars_);
1926 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str.chars_)));
1933 basic_string& operator =(
const std::basic_string<char>& str)
noexcept {
1934 if constexpr(std::is_same<char_t, char>::value) chars_ = str;
1935 else chars_ = __xtd_convert_to_string<value_type>(str);
1941 basic_string& operator =(
const std::basic_string<xtd::char16>& str)
noexcept {
1942 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = str;
1943 else chars_ = __xtd_convert_to_string<value_type>(str);
1949 basic_string& operator =(
const std::basic_string<xtd::char32>& str)
noexcept {
1950 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = str;
1951 else chars_ = __xtd_convert_to_string<value_type>(str);
1957 basic_string& operator =(
const std::basic_string<xtd::char8>& str)
noexcept {
1958 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = str;
1959 else chars_ = __xtd_convert_to_string<value_type>(str);
1965 basic_string& operator =(
const std::basic_string<xtd::wchar>& str)
noexcept {
1966 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = str;
1967 else chars_ = __xtd_convert_to_string<value_type>(str);
1974 basic_string& operator =(std::basic_string<char>&& str)
noexcept {
1975 if constexpr(std::is_same<char_t, char>::value) chars_ = std::move(str);
1976 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
1982 basic_string& operator =(std::basic_string<xtd::char16>&& str)
noexcept {
1983 if constexpr(std::is_same<char_t, xtd::char16>::value) chars_ = std::move(str);
1984 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
1990 basic_string& operator =(std::basic_string<xtd::char32>&& str)
noexcept {
1991 if constexpr(std::is_same<char_t, xtd::char32>::value) chars_ = std::move(str);
1992 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
1998 basic_string& operator =(std::basic_string<xtd::char8>&& str)
noexcept {
1999 if constexpr(std::is_same<char_t, xtd::char8>::value) chars_ = std::move(str);
2000 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2006 basic_string& operator =(std::basic_string<xtd::wchar>&& str)
noexcept {
2007 if constexpr(std::is_same<char_t, xtd::wchar>::value) chars_ = std::move(str);
2008 else chars_ = std::move(__xtd_convert_to_string<value_type>(std::move(str)));
2018 if constexpr(std::is_same_v<char, char_t>) chars_ = std::basic_string<char>(str);
2019 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<char>(str));
2028 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ = std::basic_string<xtd::char16>(str);
2029 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char16>(str));
2038 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ = std::basic_string<xtd::char32>(str);
2039 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char32>(str));
2048 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ = std::basic_string<xtd::char8>(str);
2049 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::char8>(str));
2058 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ = std::basic_string<xtd::wchar>(str);
2059 else chars_ = __xtd_convert_to_string<value_type>(std::basic_string<xtd::wchar>(str));
2102 basic_string& operator =(
const std::initializer_list<char>& il) {
2109 basic_string& operator =(
const std::initializer_list<xtd::char16>& il) {
2116 basic_string& operator =(
const std::initializer_list<xtd::char32>& il) {
2123 basic_string& operator =(
const std::initializer_list<xtd::char8>& il) {
2130 basic_string& operator =(
const std::initializer_list<xtd::wchar>& il) {
2139 if constexpr(std::is_same_v<char, char_t>) chars_ += str.chars_;
2140 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2147 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str.chars_;
2148 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2155 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str.chars_;
2156 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2163 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str.chars_;
2164 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2171 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str.chars_;
2172 else chars_ += __xtd_convert_to_string<value_type>(str.chars_);
2180 if constexpr(std::is_same_v<char, char_t>) chars_ += std::move(str.chars_);
2181 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2188 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += std::move(str.chars_);
2189 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2196 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += std::move(str.chars_);
2197 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2204 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += std::move(str.chars_);
2205 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2212 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += std::move(str.chars_);
2213 else chars_ += __xtd_convert_to_string<value_type>(std::move(str.chars_));
2220 basic_string& operator +=(
const std::basic_string<char>& str) {
2221 if constexpr(std::is_same_v<char, char_t>) chars_ += str;
2222 else chars_ += __xtd_convert_to_string<value_type>(str);
2228 basic_string& operator +=(
const std::basic_string<xtd::char16>& str) {
2229 if constexpr(std::is_same_v<xtd::char16, char_t>) chars_ += str;
2230 else chars_ += __xtd_convert_to_string<value_type>(str);
2236 basic_string& operator +=(
const std::basic_string<xtd::char32>& str) {
2237 if constexpr(std::is_same_v<xtd::char32, char_t>) chars_ += str;
2238 else chars_ += __xtd_convert_to_string<value_type>(str);
2244 basic_string& operator +=(
const std::basic_string<xtd::char8>& str) {
2245 if constexpr(std::is_same_v<xtd::char8, char_t>) chars_ += str;
2246 else chars_ += __xtd_convert_to_string<value_type>(str);
2252 basic_string& operator +=(
const std::basic_string<xtd::wchar>& str) {
2253 if constexpr(std::is_same_v<xtd::wchar, char_t>) chars_ += str;
2254 else chars_ += __xtd_convert_to_string<value_type>(str);
2379 auto result = std::move(lhs);
2380 result += std::move(rhs);
2388 auto result = std::move(lhs);
2389 result += std::move(rhs);
2397 auto result = std::move(lhs);
2398 result += std::move(rhs);
2406 auto result = std::move(lhs);
2407 result += std::move(rhs);
2415 auto result = std::move(lhs);
2416 result += std::move(rhs);
2425 auto result = std::move(lhs);
2434 auto result = std::move(lhs);
2443 auto result = std::move(lhs);
2452 auto result = std::move(lhs);
2461 auto result = std::move(lhs);
2472 result += std::move(rhs);
2481 result += std::move(rhs);
2490 result += std::move(rhs);
2499 result += std::move(rhs);
2508 result += std::move(rhs);
2564 if constexpr(std::is_same_v<char, char_t>) result += rhs.chars();
2565 else result += __xtd_convert_to_string<char>(rhs.chars());
2574 if constexpr(std::is_same_v<xtd::char16, char_t>) result += rhs.chars();
2575 else result += __xtd_convert_to_string<xtd::char16>(rhs.chars());
2584 if constexpr(std::is_same_v<xtd::char32, char_t>) result += rhs.chars();
2585 else result += __xtd_convert_to_string<xtd::char32>(rhs.chars());
2594 if constexpr(std::is_same_v<xtd::char8, char_t>) result += rhs.chars();
2595 else result += __xtd_convert_to_string<xtd::char8>(rhs.chars());
2604 if constexpr(std::is_same_v<xtd::wchar, char_t>) result += rhs.chars();
2605 else result += __xtd_convert_to_string<xtd::wchar>(rhs.chars());
2660 auto result = std::move(lhs);
2669 auto result = std::move(lhs);
2678 auto result = std::move(lhs);
2687 auto result = std::move(lhs);
2696 auto result = std::move(lhs);
2753 result += std::move(rhs);
2762 result += std::move(rhs);
2771 result += std::move(rhs);
2780 result += std::move(rhs);
2789 result += std::move(rhs);
2844 auto result = std::move(lhs);
2853 auto result = std::move(lhs);
2862 auto result = std::move(lhs);
2871 auto result = std::move(lhs);
2880 auto result = std::move(lhs);
2937 result += std::move(rhs);
2946 result += std::move(rhs);
2955 result += std::move(rhs);
2964 result += std::move(rhs);
2973 result += std::move(rhs);
2986 friend std::basic_ostream<char>& operator <<(std::basic_ostream<char>& stream,
const basic_string & str) {
2987 if constexpr(std::is_same_v<char, char_t>)
return stream << str.chars();
2988 else return stream << __xtd_convert_to_string<char>(str.chars());
2996 friend std::basic_ostream<xtd::wchar>& operator <<(std::basic_ostream<xtd::wchar>& stream,
const basic_string & str) {
return stream << str.to_wstring().chars();}
3006 friend std::basic_istream<char>& operator >>(std::basic_istream<char>& stream,
basic_string & str) {
3007 auto s = std::basic_string<char> {};
3020 friend std::basic_istream<xtd::wchar>& operator >>(std::basic_istream<xtd::wchar>& stream,
basic_string & str) {
3021 auto s = std::basic_string<xtd::wchar> {};
3033 [[deprecated(
"Replaced by xtd::basic_string::is_empty(const xtd::basic_string&) - Will be removed in version 0.4.0.")]]
3043 template<
class object_t>
3044 [[deprecated(
"Replaced by typeof_<object_t>().name() - Will be removed in version 0.4.0.")]]
3050 template<
class object_t>
3051 [[deprecated(
"Replaced by typeof_(object).name() - Will be removed in version 0.4.0.")]]
3057 [[deprecated(
"Replaced by typeof_(info).name() - Will be removed in version 0.4.0.")]]
3063 template<
class object_t>
3064 [[deprecated(
"Replaced by typeof_<object_t>().full_name() - Will be removed in version 0.4.0.")]]
3070 template<
class object_t>
3071 [[deprecated(
"Replaced by typeof_(object).full_name() - Will be removed in version 0.4.0.")]]
3077 [[deprecated(
"Replaced by typeof_(info).full_name() - Will be removed in version 0.4.0.")]]
3088 static const
xtd::array<value_type> default_split_separators;
3089 static const
xtd::array<value_type> default_trim_chars;
3091 template<class arg_t>
3092 static auto convert_param(arg_t&& arg) noexcept {
3093 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();
3094 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();
3095 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();
3096 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();
3097 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();
3098 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();
3099 else return std::forward<arg_t>(arg);
3103 auto length = full_name.last_index_of(
"<");
3105 if (full_name.last_index_of(
"::", 0,
length) ==
npos)
return full_name;
3106 return full_name.substring(full_name.last_index_of(
"::", 0,
length) + 2);