28 #ifndef CHRLIB_INC_smap_hpp_
29 #define CHRLIB_INC_smap_hpp_ 1
41 template<
typename _tIn,
typename _tState>
45 static_assert(std::is_constructible<
const byte, decltype(*i)>::value,
46 "Invalid mapping source type found.");
47 static_assert(!std::is_volatile<
typename std::remove_reference<
48 _tState>::type>::value,
"Volatile state is not supported.");
79 return b == 0xC0 || b == 0xC1 || b > 0xF4;
90 template<
typename _tObj,
typename _tIn,
typename _tState>
92 Map(_tObj& uc, _tIn&& i, _tState&& st)
100 return ConversionResult::BadSource;
106 if(
YB_UNLIKELY(IsInvalid(seq[0]) || ((seq[0] & 0xC0) != 0xC0)))
107 return ConversionResult::Invalid;
110 return ConversionResult::BadSource;
111 if(
YB_UNLIKELY(IsInvalid(seq[1]) || ((seq[1] & 0xC0) != 0x80)))
112 return ConversionResult::Invalid;
113 if(((seq[0] ^ 0xC0) & 0xE0) == 0)
115 uc = ((seq[0] & 0x1C) >> 2 << 8)
116 | ((seq[0] & 0x03) << 6)
122 return ConversionResult::BadSource;
123 if(
YB_UNLIKELY(IsInvalid(seq[2]) || ((seq[2] & 0xC0) != 0x80)))
124 return ConversionResult::Invalid;
125 if(((seq[0] ^ 0xE0) & 0xF0) == 0)
127 uc = (((seq[0] & 0x0F) << 4 | (seq[1] & 0x3C) >> 2) << 8)
128 | ((seq[1] & 0x3) << 6) | (seq[2] & 0x3F);
133 return ConversionResult::BadSource;
134 if(
YB_UNLIKELY(IsInvalid(seq[3]) || ((seq[3] & 0xC0) != 0x80)))
135 return ConversionResult::Invalid;
136 if(
YB_LIKELY(((seq[0] ^ 0xF0) & 0xF8) == 0))
138 uc = (((seq[0] & 0x0F) << 4 | (seq[1] & 0x3C) >> 2) << 8)
139 | ((seq[1] & 0x3) << 6) | (seq[2] & 0x3F);
142 return ConversionResult::Unhandled;
144 return ConversionResult::BadState;
146 return ConversionResult::OK;
149 template<
typename _tOut>
168 *d = 0x80 | (s >> 6 & 0x3F);
169 *++d = 0x80 | (s & 0x3F);
177 template<
typename _tObj,
typename _tIn,
typename _tState>
179 Map(_tObj& uc, _tIn&& i, _tState&& st)
187 return ConversionResult::BadSource;
190 return ConversionResult::BadSource;
191 uc = seq[0] << 8 | seq[1];
194 return ConversionResult::BadState;
196 return ConversionResult::OK;
203 template<
typename _tObj,
typename _tIn,
typename _tState>
205 Map(_tObj& uc, _tIn&& i, _tState&& st)
213 return ConversionResult::BadSource;
216 return ConversionResult::BadSource;
217 uc = seq[0] | seq[1] << 8;
220 return ConversionResult::BadState;
222 return ConversionResult::OK;
233 template<
Encoding,
typename... _tParams>
237 return ConversionResult::Unhandled;
239 template<Encoding _vEnc,
typename _tDst,
typename _tSrc,
typename _tState>
244 return GUCS2Mapper<_vEnc>::Map(d, s, st);
247 template<Encoding _vEnc,
typename _tDst,
typename _tSrc>
253 template<Encoding _vEnc,
typename _tDst>
258 return GUCS2Mapper<_vEnc>::InverseMap(d, s);
262 template<Encoding _vEnc,
typename _tIn,
typename _tState>
266 return UCS2Mapper_Map<_vEnc>(uc, i, std::move(st));
268 template<Encoding _vEnc,
typename _tIn,
typename _tState>
274 template<Encoding _vEnc>
280 return UCS2Mapper_InverseMap<_vEnc>(d, s);