YSTest  PreAlpha_b500_20140530
The YSLib Test Project
 全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 宏定义  
string.hpp
浏览该文件的文档.
1 /*
2  © 2012-2014 FrankHB.
3 
4  This file is part of the YSLib project, and may only be used,
5  modified, and distributed under the terms of the YSLib project
6  license, LICENSE.TXT. By continuing to use, modify, or distribute
7  this file you indicate that you have read the license and
8  understand and accept it fully.
9 */
10 
28 #ifndef YB_INC_ystdex_string_hpp_
29 #define YB_INC_ystdex_string_hpp_ 1
30 
31 #include "container.hpp" // for ../ydef.h, std::underlying_type,
32 // ystdex::sort_unique, ystdex::to_array;
33 #include <libdefect/string.h> // for std::char_traits, std::initializer_list,
34 // and std::to_string;
35 #include <cstdio> // for std::vsnprintf
36 #include <cstdarg>
37 
38 namespace ystdex
39 {
40 
46 template<typename _tString>
48 {
51  using traits_type = typename std::char_traits<value_type>;
52  using pointer = value_type*;
53  using const_pointer = const value_type*;
54  using initializer = std::initializer_list<value_type>;
55 };
56 
57 
64 template<typename _tParam,
65  typename = yimpl(decltype(std::declval<_tParam>()[0]))>
68 
69 
84 template<typename _tChar>
85 size_t
86 string_length(const _tChar* str)
87 {
88  return std::char_traits<_tChar>::length(str);
89 }
91 template<class _tString, typename = enable_if_t<is_class<_tString>::value, int>>
92 size_t
93 string_length(const _tString& str)
94 {
95  return str.size();
96 }
98 
99 
101 namespace details
102 {
103 
105 template<typename _tFwd1, typename _tFwd2, typename _fPred>
106 bool
107 ends_with_iter_dispatch(_tFwd1 b, _tFwd1 e, _tFwd2 bt, _tFwd2 et,
108  _fPred comp, std::bidirectional_iterator_tag)
109 {
110  auto i(e);
111  auto it(et);
112 
113  while(i != b && it != bt)
114  if(!comp(*--i, *--it))
115  return false;
116  return it == bt;
117 }
118 
119 } // namespace details;
120 
128 
130 template<typename _tRange1, typename _tRange2, typename _fPred>
131 bool
132 starts_width(const _tRange1& input, const _tRange2& test, _fPred comp)
133 {
134  using std::begin;
135  using std::end;
136  const auto e(end(input));
137  const auto et(end(test));
138  auto i(begin(input));
139  auto it(begin(test));
140 
141  for(; i != e && it != et; yunseq(++i, ++it))
142  if(!comp(*i, *it))
143  return false;
144  return it == et;
145 }
146 template<typename _tRange1, typename _tRange2>
147 inline bool
148 starts_width(const _tRange1& input, const _tRange2& test)
149 {
150  return ystdex::starts_width(input, test, is_equal());
151 }
153 
155 
156 template<typename _tRange1, typename _tRange2, typename _fPred>
157 inline bool
158 ends_with(const _tRange1& input, const _tRange2& test, _fPred comp)
159 {
160  using std::begin;
161  using std::end;
162 
163  return details::ends_with_iter_dispatch(begin(input), end(input),
164  begin(test), end(test), comp, typename std::iterator_traits<
165  remove_reference_t<decltype(begin(input))>>::iterator_category());
166 }
167 template<typename _tRange1, typename _tRange2>
168 inline bool
169 ends_with(const _tRange1& input, const _tRange2& test)
170 {
171  return ystdex::ends_with(input, test, is_equal());
172 }
174 
175 
176 
181 template<class _tString>
182 _tString
183 alph(_tString& str)
184 {
185  _tString res(str);
186 
187  ystdex::sort_unique(res);
188  return res;
189 }
190 
198 template<class _tString>
199 void
200 concat(_tString& str, size_t n)
201 {
202  yconstraint(n != 0);
203  if(1 < n)
204  {
205  const auto len(str.length());
206 
207  ystdex::concat(str, n / 2);
208  str.append(&str[0], str.length());
209  if(n % 2 != 0)
210  str.append(&str[0], len);
211  }
212 }
213 
219 template<class _tString>
221 inline _tString&&
223  = &to_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
224 {
225  return static_cast<_tString&&>(str.erase(0, str.find_first_not_of(t)));
226 }
227 
229 template<class _tString>
230 inline _tString&&
232  = &to_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
233 {
234  return static_cast<_tString&&>(str.erase(str.find_last_not_of(t) + 1));
235 }
236 
238 template<class _tString>
239 inline _tString&&
241  = &to_array<typename string_traits<_tString>::value_type>("\n\r\t\v ")[0])
242 {
243  return static_cast<_tString&&>(ystdex::ltrim(ystdex::rtrim(str, t)));
244 }
246 
254 template<typename _tString>
255 inline _tString
256 get_mid(const _tString& str, typename _tString::size_type l = 1)
257 {
258  yassume(!(str.size() < l * 2));
259  return str.substr(l, str.size() - l * 2);
260 }
261 template<typename _tString>
262 inline _tString
263 get_mid(const _tString& str, typename _tString::size_type l,
264  typename _tString::size_type r)
265 {
266  yassume(!(str.size() < l + r));
267  return str.substr(l, str.size() - l - r);
268 }
270 
277 template<typename _fPred, typename _fInsert, typename _tIn>
278 void
279 split(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
280 {
281  while(b != e)
282  {
283  _tIn i(std::find_if_not(b, e, is_delim));
284 
285  b = std::find_if(i, e, is_delim);
286  if(i != b)
287  insert(i, b);
288  else
289  break;
290  }
291 }
298 template<typename _fPred, typename _fInsert, typename _tRange>
299 inline void
300 split(_tRange&& c, _fPred is_delim, _fInsert insert)
301 {
302  split(begin(c), end(c), is_delim, insert);
303 }
304 
312 template<typename _fPred, typename _fInsert, typename _tIn>
313 _tIn
314 split_l(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
315 {
316  _tIn i(b);
317 
318  while(b != e)
319  {
320  if(is_delim(*b) && i != b)
321  {
322  insert(i, b);
323  i = b;
324  }
325  ++b;
326  }
327  if(i != b)
328  insert(i, b);
329  return i;
330 }
338 template<typename _fPred, typename _fInsert, typename _tRange>
339 inline void
340 split_l(_tRange&& c, _fPred is_delim, _fInsert insert)
341 {
342  split_l(begin(c), end(c), is_delim, insert);
343 }
344 
352 inline std::string
353 to_string(unsigned char val)
354 {
355  return std::to_string(unsigned(val));
356 }
357 inline std::string
358 to_string(unsigned short val)
359 {
360  return std::to_string(unsigned(val));
361 }
363 template<typename _type>
364 inline std::string
365 to_string(_type val, enable_if_t<is_enum<_type>::value, int> = 0)
366 {
367  using std::to_string;
368  using ystdex::to_string;
369 
370  return to_string(underlying_type_t<_type>(val));
371 }
373 
374 
380 template<typename _tChar>
381 std::basic_string<_tChar>
382 vsfmt(const _tChar* fmt, std::va_list args)
383 {
384  std::string str(size_t(std::vsnprintf({}, 0, fmt, args)), _tChar());
385 
386  std::vsprintf(&str[0], fmt, args);
387  va_end(args);
388  return str;
389 }
390 
397 template<typename _tChar>
398 std::basic_string<_tChar>
399 sfmt(const _tChar* fmt, ...)
400 {
401  std::va_list args;
402 
403  va_start(args, fmt);
404 
405  std::string str(vsfmt(fmt, args));
406 
407  va_end(args);
408  return str;
409 }
410 
416 template YB_ATTR(format (printf, 1, 2)) std::string
417 sfmt<char>(const char*, ...);
418 
419 } // namespace ystdex;
420 
421 #endif
422 
typename remove_reference< _type >::type remove_reference_t
Definition: type_op.hpp:234
yconstfn const string _tParams && args
Definition: Loader.h:111
_tString get_mid(const _tString &str, typename _tString::size_type l=1)
取删除前缀和后缀的子字符串。
Definition: string.hpp:256
_tString && trim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续前缀与后缀字符。
Definition: string.hpp:240
std::array< _type, _vN > to_array(const _tSrc &src)
取指定参数转换为 std::array 对象。
Definition: container.hpp:514
typename underlying_type< _type >::type underlying_type_t
Definition: type_op.hpp:283
字符串特征。
Definition: string.hpp:47
_tString alph(_tString &str)
取字母表:有序的字符串的不重复序列。
Definition: string.hpp:183
bool starts_width(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数起始。
Definition: string.hpp:132
enable_if_t< is_class< decay_t< _tParam >>::value, int > enable_for_string_class_t
选择字符串类类型的特定重载避免和其它非字符串类型冲突。
Definition: string.hpp:67
void split(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
Definition: string.hpp:279
typename decay< _type >::type decay_t
Definition: type_op.hpp:271
相等关系仿函数。
Definition: functional.hpp:597
bool ends_with_iter_dispatch(_tFwd1 b, _tFwd1 e, _tFwd2 bt, _tFwd2 et, _fPred comp, std::bidirectional_iterator_tag)
Definition: string.hpp:107
#define yimpl(...)
实现标签。
Definition: ydef.h:177
标准库实现 修正。
typename std::char_traits< value_type > traits_type
Definition: string.hpp:51
std::basic_string< _tChar > vsfmt(const _tChar *fmt, std::va_list args)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
Definition: string.hpp:382
remove_rcv_t< decltype(std::declval< string_type >()[0])> value_type
Definition: string.hpp:50
void concat(_tString &str, size_t n)
重复串接。
Definition: string.hpp:200
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:748
typename remove_rcv< _type >::type remove_rcv_t
Definition: type_op.hpp:664
const value_type * const_pointer
Definition: string.hpp:53
#define yassume
假定:环境语义。
Definition: cassert.h:58
通用容器操作。
GSStringTemplate< char >::basic_string string
Definition: ycont.h:164
#define yconstraint
约束:接口语义。
Definition: cassert.h:47
_tString && ltrim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续前缀字符。
Definition: string.hpp:222
std::string to_string(unsigned char val)
转换为字符串。
Definition: string.hpp:353
_tIn split_l(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
Definition: string.hpp:314
_tRandom sort_unique(_tRandom first, _tRandom last)
排序指定序列范围,保留不重复元素的区间。
Definition: container.hpp:445
#define YB_ATTR(...)
属性。
Definition: ydef.h:265
size_t string_length(const _tChar *str)
计算字符串长度。
Definition: string.hpp:86
std::string to_string(_type val, enable_if_t< is_enum< _type >::value, int >=0)
Definition: string.hpp:365
bounds & r
Definition: ydraw.h:220
bool ends_with(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数结束。
Definition: string.hpp:158
value_type * pointer
Definition: string.hpp:52
std::basic_string< _tChar > sfmt(const _tChar *fmt,...)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
Definition: string.hpp:399
typename enable_if< _bCond, _type >::type enable_if_t
Definition: type_op.hpp:274
decay_t< _tString > string_type
Definition: string.hpp:49
std::initializer_list< value_type > initializer
Definition: string.hpp:54
_tString && rtrim(_tString &&str, typename string_traits< _tString >::const_pointer t=&to_array< typename string_traits< _tString >::value_type >("\n\r\t\v ")[0])
删除字符串中指定的连续后缀字符。
Definition: string.hpp:231