YSTest  PreAlpha_b500_20140530
The YSLib Test Project
 全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 宏定义  
chrproc.h
浏览该文件的文档.
1 /*
2  © 2009-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 INC_CHRLib_chrproc_h_
29 #define INC_CHRLib_chrproc_h_ 1
30 
31 #include "YModules.h"
32 #include YFM_CHRLib_CharacterMapping
33 #include YFM_YBaseMacro
34 #include <cstdio> // for std::FILE;
35 #include <memory> // for std::move;
36 #include <ystdex/string.hpp> // for ystdex::string_traits;
37 #include <algorithm> // for std::copy_n;
38 
39 namespace CHRLib
40 {
41 
46 template<typename _tChar>
47 yconstfn bool
48 IsASCII(_tChar c)
49 {
50  return !(c & ~0x7F);
51 }
52 
57 template<typename _tChar>
58 yconstfn char
59 ToASCII(_tChar c)
60 {
61  static_assert(std::is_integral<_tChar>::value, "Invalid type found.");
62 
63  return c & 0x7F;
64 }
65 
66 
73 MBCToUC(ucs2_t&, const char*&, Encoding, ConversionState&& = {});
74 inline PDefH(ConversionResult, MBCToUC, ucs2_t& uc, const char*& c,
75  Encoding enc, ConversionState& st)
76  ImplRet(MBCToUC(uc, c, enc, std::move(st)))
78 
85 MBCToUC(ucs2_t&, std::FILE*, Encoding, ConversionState&& = {});
86 inline PDefH(ConversionResult, MBCToUC, ucs2_t& uc, std::FILE* fp, Encoding enc,
87  ConversionState& st)
88  ImplRet(MBCToUC(uc, fp, enc, std::move(st)))
90 
96 MBCToUC(const char*&, Encoding, ConversionState&& = {});
97 inline PDefH(ConversionResult, MBCToUC, const char*& c, Encoding enc,
98  ConversionState& st)
99  ImplRet(MBCToUC(c, enc, std::move(st)))
101 
103 MBCToUC(std::FILE*, Encoding, ConversionState&& = {});
104 inline PDefH(ConversionResult, MBCToUC, std::FILE* fp, Encoding enc,
105  ConversionState& st)
106  ImplRet(MBCToUC(fp, enc, std::move(st)))
108 
109 
115 YF_API size_t
116 UCToMBC(char*, const ucs2_t&, Encoding);
117 
118 
120 
121 
126 YF_API size_t
127 MBCSToUCS2(ucs2_t*, const char*, Encoding = CS_Default);
128 
134 YF_API size_t
135 UCS2ToMBCS(char*, const ucs2_t*, Encoding = CS_Default);
136 
141 YF_API size_t
142 UCS4ToUCS2(ucs2_t*, const ucs4_t*);
143 
148 template<class _tDst, class _tSrc>
149 _tDst
150 GetMBCSOf(const _tSrc& src, Encoding enc = CS_Default)
151 {
152  // FIXME: size for max MBC sequence length > 4;
153  _tDst str(src.length() << 2,
155 
156  str.resize(UCS2ToMBCS(&str[0], src.c_str(), enc));
157  return str;
158 }
159 
160 
166 
170 strdup(const ucs2_t*, Encoding = CS_Default);
171 template<class _tString>
173 strdup(const _tString& str)
174 {
175  return CHRLib::strdup(str.c_str());
176 }
178 
180 
181 
183 YF_API std::basic_string<ucs2_t>
185 ucsdup(const char*, Encoding = CS_Default);
187 YF_API std::basic_string<ucs2_t>
188 ucsdup(const ucs2_t*);
190 YF_API std::basic_string<ucs2_t>
191 ucsdup(const ucs4_t*);
193 template<class _tString>
194 std::basic_string<ucs2_t>
195 ucsdup(const _tString& str)
196 {
197  return CHRLib::ucsdup(str.c_str());
198 }
200 
201 
202 
204 
205 template<class _tDst>
207 _tDst
209 {
210  yconstraint(s);
211 
212  _tDst str(std::char_traits<char>::length(s),
214 
215  str.resize(MBCSToUCS2(&str[0], s, enc));
216  return str;
217 }
219 template<class _tDst>
220 _tDst
222 {
223  yconstraint(s);
224 
225  _tDst str(std::char_traits<ucs2_t>::length(s),
227  using std::begin;
228 
229  std::copy_n(s, str.size(), begin(str));
230  return str;
231 }
233 template<class _tDst>
234 _tDst
236 {
237  yconstraint(s);
238 
239  _tDst str(std::char_traits<ucs4_t>::length(s),
241 
242  str.resize(UCS4ToUCS2(&str[0], s));
243  return str;
244 }
246 
247 
248 } // namespace CHRLib;
249 
250 #endif
251 
std::FILE ConversionState fp
Definition: chrproc.h:88
ISO C++ 标准字符串扩展。
YF_API std::string strdup(const ucs2_t *, Encoding=CS_Default)
复制 UCS-2 字符串为多字节字符串。
Definition: chrproc.cpp:162
ConversionResult
编码转换结果。
Definition: chrmap.h:75
#define ImplRet(...)
Definition: YBaseMacro.h:97
yconstexpr Encoding CS_Default
默认字符编码。
Definition: chrmap.h:45
PDefH(ConversionResult, MBCToUC, ucs2_t &uc, const char *&c, Encoding enc, ConversionState &st) ImplRet(MBCToUC(uc
yconstfn char ToASCII(_tChar c)
任意整数类型字符转换为 ASCII 取值范围兼容的字符。
Definition: chrproc.h:59
编码转换状态。
Definition: chrmap.h:89
YF_API size_t MBCSToUCS2(ucs2_t *, const char *, Encoding=CS_Default)
按指定编码转换 MBCS 字符串为 UCS-2 字符串,返回转换的串长。
Definition: chrproc.cpp:112
#define YF_API
Definition: Platform.h:64
YF_API size_t UCS2ToMBCS(char *, const ucs2_t *, Encoding=CS_Default)
按指定编码转换 UCS-2 字符串为 MBCS 字符串,返回转换的串长。
Definition: chrproc.cpp:132
yconstexpr Encoding ISO_10646_UCS_2(csUnicode)
YF_API ConversionResult MBCToUC(ucs2_t &, const char *&, Encoding, ConversionState &&={})
按指定编码和转换状态转换字符串中字符为 UCS-2 字符,返回转换的字节数。
Definition: chrproc.cpp:52
YF_API std::basic_string< ucs2_t > ucsdup(const char *, Encoding=CS_Default)
复制多字节字符串为 UCS-2 字符串。
Definition: chrproc.cpp:174
yconstfn bool IsASCII(_tChar c)
判断整数类型字符在 ASCII 字符取值范围内。
Definition: chrproc.h:48
remove_rcv_t< decltype(std::declval< string_type >()[0])> value_type
Definition: string.hpp:50
GSStringTemplate< char >::basic_string string
Definition: ycont.h:164
#define yconstraint
约束:接口语义。
Definition: cassert.h:47
#define yconstfn
指定编译时常量函数。
Definition: ydef.h:463
char16_t ucs2_t
UCS-2 字符类型。
Definition: chrdef.h:44
_tDst MakeUCS2LEString(const char *s, Encoding enc=CS_Default)
复制指定编码的多字节字符串为指定类型的 UCS-2 字符串。
Definition: chrproc.h:208
std::FILE Encoding
Definition: chrproc.h:85
char32_t ucs4_t
UCS-4 字符类型。
Definition: chrdef.h:45
_tDst GetMBCSOf(const _tSrc &src, Encoding enc=CS_Default)
取 UCS-2 字符串转换的指定编码的多字节字符串。
Definition: chrproc.h:150
size_t UCToMBC(char *d, const ucs2_t &s, Encoding enc)
Definition: chrproc.cpp:99
YF_API size_t UCS4ToUCS2(ucs2_t *, const ucs4_t *)
转换 UCS-4 字符串为 UCS-2 字符串,返回转换的串长。
Definition: chrproc.cpp:147
yconstexpr Encoding ISO_10646_UCS_4(csUCS4)