28 #ifndef INC_CHRLib_smap_hpp_
29 #define INC_CHRLib_smap_hpp_ 1
32 #include YFM_CHRLib_CharacterMapping
43 template<
typename _tIn,
typename _tState>
47 static_assert(std::is_constructible<
const byte, decltype(*i)>::value,
48 "Invalid mapping source type found.");
50 "Volatile state is not supported.");
57 yunseq(++i, GetSequenceOf(st)[GetCountOf(st)++] = r);
81 return b == 0xC0 || b == 0xC1 || b > 0xF4;
92 template<
typename _tObj,
typename _tIn,
typename _tState>
94 Map(_tObj& uc, _tIn&& i, _tState&& st)
96 const auto seq(GetSequenceOf(st));
98 switch(GetCountOf(st))
108 if(
YB_UNLIKELY(IsInvalid(seq[0]) || ((seq[0] & 0xC0) != 0xC0)))
113 if(
YB_UNLIKELY(IsInvalid(seq[1]) || ((seq[1] & 0xC0) != 0x80)))
115 if(((seq[0] ^ 0xC0) & 0xE0) == 0)
117 uc = ((seq[0] & 0x1C) >> 2 << 8)
118 | ((seq[0] & 0x03) << 6)
125 if(
YB_UNLIKELY(IsInvalid(seq[2]) || ((seq[2] & 0xC0) != 0x80)))
127 if(((seq[0] ^ 0xE0) & 0xF0) == 0)
129 uc = (((seq[0] & 0x0F) << 4 | (seq[1] & 0x3C) >> 2) << 8)
130 | ((seq[1] & 0x3) << 6) | (seq[2] & 0x3F);
136 if(
YB_UNLIKELY(IsInvalid(seq[3]) || ((seq[3] & 0xC0) != 0x80)))
138 if(
YB_LIKELY(((seq[0] ^ 0xF0) & 0xF8) == 0))
140 uc = (((seq[0] & 0x0F) << 4 | (seq[1] & 0x3C) >> 2) << 8)
141 | ((seq[1] & 0x3) << 6) | (seq[2] & 0x3F);
151 template<
typename _tOut>
170 *d = 0x80 | (s >> 6 & 0x3F);
171 *++d = 0x80 | (s & 0x3F);
179 template<
typename _tObj,
typename _tIn,
typename _tState>
181 Map(_tObj& uc, _tIn&& i, _tState&& st)
183 const auto seq(GetSequenceOf(st));
185 switch(GetCountOf(st))
193 uc = seq[0] << 8 | seq[1];
205 template<
typename _tObj,
typename _tIn,
typename _tState>
207 Map(_tObj& uc, _tIn&& i, _tState&& st)
209 const auto seq(GetSequenceOf(st));
211 switch(GetCountOf(st))
219 uc = seq[0] | seq[1] << 8;
235 template<
Encoding,
typename... _tParams>
241 template<Encoding _vEnc,
typename _tDst,
typename _tSrc,
typename _tState>
246 return GUCS2Mapper<_vEnc>::Map(d,
s, st);
249 template<Encoding _vEnc,
typename _tDst,
typename _tSrc>
255 template<Encoding _vEnc,
typename _tDst>
260 return GUCS2Mapper<_vEnc>::InverseMap(d, s);
264 template<Encoding _vEnc,
typename _tIn,
typename _tState>
268 return UCS2Mapper_Map<_vEnc>(uc, i, std::move(st));
270 template<Encoding _vEnc,
typename _tIn,
typename _tState>
276 template<Encoding _vEnc>
281 return UCS2Mapper_InverseMap<_vEnc>(d,
s);
yconstfn ConversionResult UCS2Mapper_Map(_tParams &&...)
取映射函数。
static ConversionResult Map(_tObj &uc, _tIn &&i, _tState &&st)
yconstexpr Encoding UTF_16LE(csUTF16LE)
bool FillByte(_tIn &i, _tState &st)
以输入迭代器指向内容填充有效输入迭代器指定的字节。
yconstexpr Encoding UTF_16BE(csUTF16BE)
static yconstfn bool IsInvalid(byte b)
检查 UTF-8 文本序列中非法字节。
typename remove_reference< _type >::type remove_reference_t
static ConversionResult Map(_tObj &uc, _tIn &&i, _tState &&st)
映射: UTF-8 。
static ConversionResult Map(_tObj &uc, _tIn &&i, _tState &&st)
#define YB_UNLIKELY(expr)
分支预测提示。
#define yunseq
无序列依赖表达式组求值。
#define yconstraint
约束:接口语义。
#define yconstfn
指定编译时常量函数。
static byte InverseMap(_tOut d, const ucs2_t &s)
char16_t ucs2_t
UCS-2 字符类型。
#define yconstexpr
指定编译时常量表达式。
bool is_undereferenceable(const any_input_iterator< _type, _tDifference, _tPointer, _tReference > &i)
yconstexpr ConversionResult UCS2Mapper(ucs2_t &uc, _tIn &&i, _tState &&st)
yconstexpr Encoding UTF_8(csUTF8)
yconstfn byte UCS2Mapper_InverseMap(_tDst, _tSrc)