30 #ifndef UTF8_UNCHECKED_HH
31 #define UTF8_UNCHECKED_HH
39 template <
typename octet_iterator>
40 octet_iterator
append(uint32_t cp, octet_iterator result)
45 }
else if (cp < 0x800) {
47 *result++ = ((cp >> 6) ) | 0xc0;
48 *result++ = ((cp >> 0) & 0x3f) | 0x80;
49 }
else if (cp < 0x10000) {
51 *result++ = ((cp >> 12) ) | 0xe0;
52 *result++ = ((cp >> 6) & 0x3f) | 0x80;
53 *result++ = ((cp >> 0) & 0x3f) | 0x80;
56 *result++ = ((cp >> 18) ) | 0xf0;
57 *result++ = ((cp >> 12) & 0x3f) | 0x80;
58 *result++ = ((cp >> 6) & 0x3f) | 0x80;
59 *result++ = ((cp >> 0) & 0x3f) | 0x80;
64 template <
typename octet_iterator>
65 uint32_t
next(octet_iterator& it)
73 cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
77 cp = ((cp << 12) & 0xffff) + ((*it << 6) & 0xfff);
83 cp = ((cp << 18) & 0x1fffff) + ((*it << 12) & 0x3ffff);
85 cp += (*it << 6) & 0xfff;
94 template <
typename octet_iterator>
100 template <
typename octet_iterator>
108 template <
typename octet_iterator,
typename distance_type>
109 void advance(octet_iterator& it, distance_type n)
111 for (distance_type i = 0; i < n; ++i) {
116 template <
typename octet_iterator>
117 typename std::iterator_traits<octet_iterator>::difference_type
118 distance(octet_iterator first, octet_iterator last)
120 typename std::iterator_traits<octet_iterator>::difference_type dist;
121 for (dist = 0; first < last; ++dist) {
127 template <
typename u16bit_iterator,
typename octet_iterator>
128 octet_iterator
utf16to8(u16bit_iterator start, u16bit_iterator end,
129 octet_iterator result)
131 while (start != end) {
132 uint32_t cp = *start++;
135 uint32_t trail_surrogate = *start++;
138 result =
append(cp, result);
143 template <
typename u16bit_iterator,
typename octet_iterator>
144 u16bit_iterator
utf8to16(octet_iterator start, octet_iterator end,
145 u16bit_iterator result)
147 while (start != end) {
148 uint32_t cp =
next(start);
160 template <
typename octet_iterator,
typename u32bit_iterator>
161 octet_iterator
utf32to8(u32bit_iterator start, u32bit_iterator end,
162 octet_iterator result)
164 while (start != end) {
165 result =
append(*start++, result);
170 template <
typename octet_iterator,
typename u32bit_iterator>
171 u32bit_iterator
utf8to32(octet_iterator start, octet_iterator end,
172 u32bit_iterator result)
174 while (start < end) {
175 *result++ =
next(start);
181 template <
typename octet_iterator>
182 class iterator :
public std::iterator<std::bidirectional_iterator_tag, uint32_t>
190 octet_iterator
base()
const {
return it; }
193 octet_iterator temp = it;
236 auto begin = utf8.
begin();
241 while (len && (end != utf8.
end())) {