YSTest: string.hpp 源文件

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>
47 struct string_traits
48 {
49 using string_type = decay_t<_tString>;
50 using value_type = remove_rcv_t<decltype(std::declval<string_type>()[0])>;
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]))>
66 using enable_for_string_class_t
67 = enable_if_t<is_class<decay_t<_tParam>>::value, int>;
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&&
222 ltrim(_tString&& str, typename string_traits<_tString>::const_pointer t
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&&
231 rtrim(_tString&& str, typename string_traits<_tString>::const_pointer t
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&&
240 trim(_tString&& str, typename string_traits<_tString>::const_pointer t
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
ystdex::remove_reference_t
typename remove_reference< _type >::type remove_reference_t
Definition: type_op.hpp:234
YSLib::UI::args
yconstfn const string _tParams && args
Definition: Loader.h:111
ystdex::get_mid
_tString get_mid(const _tString &str, typename _tString::size_type l=1)
取删除前缀和后缀的子字符串。
Definition: string.hpp:256
platform_ex::Windows::l
l
Definition: MinGW32.cpp:50
ystdex::trim
_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
ystdex::to_array
std::array< _type, _vN > to_array(const _tSrc &src)
取指定参数转换为 std::array 对象。
Definition: container.hpp:514
ystdex::underlying_type_t
typename underlying_type< _type >::type underlying_type_t
Definition: type_op.hpp:283
ystdex::string_traits
字符串特征。
Definition: string.hpp:47
ystdex::alph
_tString alph(_tString &str)
取字母表：有序的字符串的不重复序列。
Definition: string.hpp:183
ystdex::starts_width
bool starts_width(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数起始。
Definition: string.hpp:132
ystdex::enable_for_string_class_t
enable_if_t< is_class< decay_t< _tParam >>::value, int > enable_for_string_class_t
选择字符串类类型的特定重载避免和其它非字符串类型冲突。
Definition: string.hpp:67
ystdex::split
void split(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
Definition: string.hpp:279
ystdex::decay_t
typename decay< _type >::type decay_t
Definition: type_op.hpp:271
ystdex::is_equal
相等关系仿函数。
Definition: functional.hpp:597
ystdex::details::ends_with_iter_dispatch
bool ends_with_iter_dispatch(_tFwd1 b, _tFwd1 e, _tFwd2 bt, _tFwd2 et, _fPred comp, std::bidirectional_iterator_tag)
Definition: string.hpp:107
yimpl
#define yimpl(...)
实现标签。
Definition: ydef.h:177
string.h
标准库实现 修正。
ystdex::string_traits::traits_type
typename std::char_traits< value_type > traits_type
Definition: string.hpp:51
ystdex::vsfmt
std::basic_string< _tChar > vsfmt(const _tChar *fmt, std::va_list args)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
Definition: string.hpp:382
ystdex::string_traits::value_type
remove_rcv_t< decltype(std::declval< string_type >()[0])> value_type
Definition: string.hpp:50
ystdex::concat
void concat(_tString &str, size_t n)
重复串接。
Definition: string.hpp:200
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:748
ystdex::remove_rcv_t
typename remove_rcv< _type >::type remove_rcv_t
Definition: type_op.hpp:664
ystdex::string_traits::const_pointer
const value_type * const_pointer
Definition: string.hpp:53
yassume
#define yassume
假定：环境语义。
Definition: cassert.h:58
container.hpp
通用容器操作。
YSLib::string
GSStringTemplate< char >::basic_string string
Definition: ycont.h:164
yconstraint
#define yconstraint
约束：接口语义。
Definition: cassert.h:47
ystdex::ltrim
_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
ystdex::to_string
std::string to_string(unsigned char val)
转换为字符串。
Definition: string.hpp:353
ystdex::split_l
_tIn split_l(_tIn b, _tIn e, _fPred is_delim, _fInsert insert)
以指定字符分割字符序列。
Definition: string.hpp:314
ystdex::sort_unique
_tRandom sort_unique(_tRandom first, _tRandom last)
排序指定序列范围，保留不重复元素的区间。
Definition: container.hpp:445
YB_ATTR
#define YB_ATTR(...)
属性。
Definition: ydef.h:265
ystdex::string_length
size_t string_length(const _tChar *str)
计算字符串长度。
Definition: string.hpp:86
ystdex::to_string
std::string to_string(_type val, enable_if_t< is_enum< _type >::value, int >=0)
Definition: string.hpp:365
YSLib::Drawing::r
bounds & r
Definition: ydraw.h:220
ystdex::ends_with
bool ends_with(const _tRange1 &input, const _tRange2 &test, _fPred comp)
判断第一个参数指定的串是否以第二个参数结束。
Definition: string.hpp:158
ystdex::string_traits::pointer
value_type * pointer
Definition: string.hpp:52
ystdex::sfmt
std::basic_string< _tChar > sfmt(const _tChar *fmt,...)
以 C 标准输出格式的输出 std::basic_string 实例的对象。
Definition: string.hpp:399
CHRLib::c
c
Definition: chrproc.h:76
YSLib::Drawing::format
format(fmt)
Definition: Image.cpp:242
ystdex::enable_if_t
typename enable_if< _bCond, _type >::type enable_if_t
Definition: type_op.hpp:274
ystdex::string_traits::string_type
decay_t< _tString > string_type
Definition: string.hpp:49
ystdex::string_traits::initializer
std::initializer_list< value_type > initializer
Definition: string.hpp:54
ystdex::rtrim
_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