28 #ifndef YB_INC_ystdex_string_hpp_
29 #define YB_INC_ystdex_string_hpp_ 1
46 template<
typename _tString>
64 template<
typename _tParam,
65 typename =
yimpl(decltype(std::declval<_tParam>()[0]))>
84 template<
typename _tChar>
88 return std::char_traits<_tChar>::length(str);
91 template<class _tString, typename = enable_if_t<is_class<_tString>::value,
int>>
105 template<
typename _tFwd1,
typename _tFwd2,
typename _fPred>
108 _fPred comp, std::bidirectional_iterator_tag)
113 while(i != b && it != bt)
114 if(!comp(*--i, *--it))
130 template<
typename _tRange1,
typename _tRange2,
typename _fPred>
136 const auto e(end(input));
137 const auto et(end(test));
138 auto i(begin(input));
139 auto it(begin(test));
141 for(; i != e && it != et;
yunseq(++i, ++it))
146 template<
typename _tRange1,
typename _tRange2>
156 template<
typename _tRange1,
typename _tRange2,
typename _fPred>
158 ends_with(
const _tRange1& input,
const _tRange2& test, _fPred comp)
164 begin(test), end(test), comp,
typename std::iterator_traits<
167 template<
typename _tRange1,
typename _tRange2>
181 template<
class _tString>
198 template<
class _tString>
205 const auto len(str.length());
208 str.append(&str[0], str.length());
210 str.append(&str[0], len);
219 template<
class _tString>
225 return static_cast<_tString&&
>(str.erase(0, str.find_first_not_of(t)));
229 template<
class _tString>
234 return static_cast<_tString&&
>(str.erase(str.find_last_not_of(t) + 1));
238 template<
class _tString>
254 template<
typename _tString>
256 get_mid(
const _tString& str,
typename _tString::size_type
l = 1)
259 return str.substr(
l, str.size() -
l * 2);
261 template<
typename _tString>
263 get_mid(
const _tString& str,
typename _tString::size_type
l,
264 typename _tString::size_type
r)
267 return str.substr(l, str.size() - l -
r);
277 template<
typename _fPred,
typename _fInsert,
typename _tIn>
279 split(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
283 _tIn i(std::find_if_not(b, e, is_delim));
285 b = std::find_if(i, e, is_delim);
298 template<
typename _fPred,
typename _fInsert,
typename _tRange>
300 split(_tRange&&
c, _fPred is_delim, _fInsert insert)
302 split(begin(
c), end(
c), is_delim, insert);
312 template<
typename _fPred,
typename _fInsert,
typename _tIn>
314 split_l(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
320 if(is_delim(*b) && i != b)
338 template<
typename _fPred,
typename _fInsert,
typename _tRange>
340 split_l(_tRange&&
c, _fPred is_delim, _fInsert insert)
342 split_l(begin(
c), end(
c), is_delim, insert);
363 template<
typename _type>
380 template<
typename _tChar>
381 std::basic_string<_tChar>
386 std::vsprintf(&str[0], fmt, args);
397 template<
typename _tChar>
398 std::basic_string<_tChar>
417 sfmt<
char>(const
char*, ...);
typename remove_reference< _type >::type remove_reference_t
yconstfn const string _tParams && args
_tString get_mid(const _tString &str, typename _tString::size_type l=1)
取删除前缀和后缀的子字符串。
_tString && trim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续前缀与后缀字符。
std::array< _type, _vN > to_array(const _tSrc &src)
取指定参数转换为 std::array 对象。
typename underlying_type< _type >::type underlying_type_t
_tString alph(_tString &str)
取字母表:有序的字符串的不重复序列。
bool starts_width(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数起始。
enable_if_t< is_class< decay_t< _tParam >>::value, int > enable_for_string_class_t
选择字符串类类型的特定重载避免和其它非字符串类型冲突。
void split(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
typename decay< _type >::type decay_t
bool ends_with_iter_dispatch(_tFwd1 b, _tFwd1 e, _tFwd2 bt, _tFwd2 et, _fPred comp, std::bidirectional_iterator_tag)
typename std::char_traits< value_type > traits_type
std::basic_string< _tChar > vsfmt(const _tChar *fmt, std::va_list args)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
remove_rcv_t< decltype(std::declval< string_type >()[0])> value_type
void concat(_tString &str, size_t n)
重复串接。
#define yunseq
无序列依赖表达式组求值。
typename remove_rcv< _type >::type remove_rcv_t
const value_type * const_pointer
GSStringTemplate< char >::basic_string string
#define yconstraint
约束:接口语义。
_tString && ltrim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续前缀字符。
std::string to_string(unsigned char val)
转换为字符串。
_tIn split_l(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
_tRandom sort_unique(_tRandom first, _tRandom last)
排序指定序列范围,保留不重复元素的区间。
size_t string_length(const _tChar *str)
计算字符串长度。
std::string to_string(_type val, enable_if_t< is_enum< _type >::value, int >=0)
bool ends_with(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数结束。
std::basic_string< _tChar > sfmt(const _tChar *fmt,...)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
typename enable_if< _bCond, _type >::type enable_if_t
decay_t< _tString > string_type
std::initializer_list< value_type > initializer
_tString && rtrim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续后缀字符。