28#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
29#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
73 template <
typename octet_iterator>
84 append(cp, std::back_inserter(s));
87 template <
typename word_iterator>
96 template <
typename octet_iterator,
typename output_iterator>
99 while (start != end) {
100 octet_iterator sequence_start = start;
104 for (octet_iterator it = sequence_start; it != start; ++it)
129 template <
typename octet_iterator,
typename output_iterator>
130 inline output_iterator
replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
139 replace_invalid(s.begin(), s.end(), std::back_inserter(result), replacement);
150 template <
typename octet_iterator>
170 template <
typename word_iterator>
180 template <
typename octet_iterator>
186 template <
typename octet_iterator>
193 octet_iterator end = it;
201 template <
typename octet_iterator,
typename distance_type>
202 void advance (octet_iterator& it, distance_type n, octet_iterator end)
204 const distance_type zero(0);
207 for (distance_type i = n; i < zero; ++i)
211 for (distance_type i = zero; i < n; ++i)
216 template <
typename octet_iterator>
217 typename std::iterator_traits<octet_iterator>::difference_type
218 distance (octet_iterator first, octet_iterator last)
220 typename std::iterator_traits<octet_iterator>::difference_type dist;
221 for (dist = 0; first < last; ++dist)
226 template <
typename u16bit_iterator,
typename octet_iterator>
227 octet_iterator
utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
229 while (start != end) {
253 template <
typename u16bit_iterator,
typename octet_iterator>
254 u16bit_iterator
utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
256 while (start < end) {
268 template <
typename octet_iterator,
typename u32bit_iterator>
269 octet_iterator
utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
277 template <
typename octet_iterator,
typename u32bit_iterator>
278 u32bit_iterator
utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
287 template <
typename octet_iterator>
290 octet_iterator range_start;
291 octet_iterator range_end;
300 const octet_iterator& rangestart,
301 const octet_iterator& rangeend) :
302 it(octet_it), range_start(rangestart), range_end(rangeend)
304 if (it < range_start || it > range_end)
305 throw std::out_of_range(
"Invalid utf-8 iterator position");
308 octet_iterator
base ()
const {
return it; }
311 octet_iterator temp = it;
316 if (range_start != rhs.range_start || range_end != rhs.range_end)
317 throw std::logic_error(
"Comparing utf-8 iterators defined with different ranges");
318 return (it == rhs.it);
350#if UTF_CPP_CPLUSPLUS >= 202002L
352#elif UTF_CPP_CPLUSPLUS >= 201703L
354#elif UTF_CPP_CPLUSPLUS >= 201103L
virtual const char * what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE
invalid_code_point(utfchar32_t codepoint)
utfchar32_t code_point() const
utfchar16_t utf16_word() const
virtual const char * what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE
invalid_utf16(utfchar16_t u)
utfchar8_t utf8_octet() const
invalid_utf8(utfchar8_t u)
virtual const char * what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE
bool operator==(const iterator &rhs) const
octet_iterator base() const
utfchar32_t operator*() const
std::ptrdiff_t difference_type
std::bidirectional_iterator_tag iterator_category
bool operator!=(const iterator &rhs) const
iterator(const octet_iterator &octet_it, const octet_iterator &rangestart, const octet_iterator &rangeend)
virtual const char * what() const UTF_CPP_NOEXCEPT UTF_CPP_OVERRIDE
bool is_lead_surrogate(utfchar32_t cp)
octet_iterator append(utfchar32_t cp, octet_iterator result)
const utfchar32_t SURROGATE_OFFSET
bool is_trail_surrogate(utfchar32_t cp)
utfchar16_t mask16(u16_type oc)
word_iterator append16(utfchar32_t cp, word_iterator result)
utf_error validate_next16(word_iterator &it, word_iterator end, utfchar32_t &code_point)
bool is_code_point_valid(utfchar32_t cp)
bool is_trail(octet_type oc)
utf_error validate_next(octet_iterator &it, octet_iterator end, utfchar32_t &code_point)
const utfchar16_t TRAIL_SURROGATE_MIN
const utfchar16_t LEAD_OFFSET
utfchar32_t peek_next(octet_iterator it, octet_iterator end)
word_iterator append16(utfchar32_t cp, word_iterator result)
void advance(octet_iterator &it, distance_type n, octet_iterator end)
unsigned short utfchar16_t
octet_iterator utf32to8(u32bit_iterator start, u32bit_iterator end, octet_iterator result)
utfchar32_t next16(word_iterator &it, word_iterator end)
u16bit_iterator utf8to16(octet_iterator start, octet_iterator end, u16bit_iterator result)
utfchar32_t next(octet_iterator &it, octet_iterator end)
u32bit_iterator utf8to32(octet_iterator start, octet_iterator end, u32bit_iterator result)
octet_iterator append(utfchar32_t cp, octet_iterator result)
The library API - functions intended to be called by the users.
octet_iterator utf16to8(u16bit_iterator start, u16bit_iterator end, octet_iterator result)
utfchar32_t prior(octet_iterator &it, octet_iterator start)
output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, utfchar32_t replacement)