38 int32_t codepoint_ = 0;
41 for (
const char* s = input; *s != 0; ++s)
43 codepoint_ = (codepoint_ << shift) | details::ASCIIHexToInt[static_cast<std::size_t>(*s)];
50 if (codepoint_ >= 0x0000 && codepoint_ <= 0x007f)
52 if (codepoint_ > 0x007f && codepoint_ <= 0x07ff)
54 if (codepoint_ > 0x07ff && codepoint_ <= 0xffff)
56 if (codepoint_ > 0xffff && codepoint_ <= 0x10ffff)
67 inline void decode(
const char* input,
char* dest)
80 dest[0] =
static_cast<char>(cdp);
87 dest[0] =
static_cast<char>((0xc0 | ((c1 & 0x7) << 2)) | ((c2 & 0xc) >> 2));
88 dest[1] =
static_cast<char>((0x80 | ((c2 & 0x3) << 4)) | c3);
95 dest[0] =
static_cast<char>(0xe0 | c0);
96 dest[1] =
static_cast<char>((0x80 | (c1 << 2)) | ((c2 & 0xc) >> 2));
97 dest[2] =
static_cast<char>((0x80 | ((c2 & 0x3) << 4)) | c3);
108 dest[0] =
static_cast<char>(0xf0 | ((c0 & 0xc) >> 2));
109 dest[1] =
static_cast<char>((0x80 | ((c0 & 0x3) << 4)) | c1);
110 dest[2] =
static_cast<char>((0x80 | (c2 << 2)) | ((c3 & 0xc) >> 2));
111 dest[3] =
static_cast<char>((0x80 | ((c3 & 0x3) << 4)) | c4);
118 dest[0] =
static_cast<char>((0xf0 | ((c0 & 0x1) << 2)) | ((c1 & 0xc) >> 2));
119 dest[1] =
static_cast<char>(((0x80 | ((c1 & 0x3) << 4)) | ((c1 & 0xc) >> 2)) | c2);
120 dest[2] =
static_cast<char>((0x80 | (c3 << 2)) | ((c4 & 0xc) >> 2));
121 dest[3] =
static_cast<char>((0x80 | ((c4 & 0x3) << 4)) | c5);
147 if (0xf0 == (0xf8 & *s))
149 if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2])) || (0x80 != (0xc0 & s[3])))
151 if (0x80 == (0xc0 & s[4]))
153 if ((0 == (0x07 & s[0])) && (0 == (0x30 & s[1])))
157 else if (0xe0 == (0xf0 & *s))
159 if ((0x80 != (0xc0 & s[1])) || (0x80 != (0xc0 & s[2])))
161 if (0x80 == (0xc0 & s[3]))
163 if ((0 == (0x0f & s[0])) && (0 == (0x20 & s[1])))
167 else if (0xc0 == (0xe0 & *s))
169 if (0x80 != (0xc0 & s[1]))
171 if (0x80 == (0xc0 & s[2]))
173 if (0 == (0x1e & s[0]))
177 else if (0x00 == (0x80 & *s))