git repos / blockattack-game

blame: source/code/Libs/include/utf8/unchecked.h

normal view · raw

9f5ec0cc sago007 2015-12-05 08:01 1
// Copyright 2006 Nemanja Trifunovic
9f5ec0cc sago007 2015-12-05 08:01 2
9f5ec0cc sago007 2015-12-05 08:01 3
/*
9f5ec0cc sago007 2015-12-05 08:01 4
Permission is hereby granted, free of charge, to any person or organization
9f5ec0cc sago007 2015-12-05 08:01 5
obtaining a copy of the software and accompanying documentation covered by
9f5ec0cc sago007 2015-12-05 08:01 6
this license (the "Software") to use, reproduce, display, distribute,
9f5ec0cc sago007 2015-12-05 08:01 7
execute, and transmit the Software, and to prepare derivative works of the
9f5ec0cc sago007 2015-12-05 08:01 8
Software, and to permit third-parties to whom the Software is furnished to
9f5ec0cc sago007 2015-12-05 08:01 9
do so, all subject to the following:
9f5ec0cc sago007 2015-12-05 08:01 10
9f5ec0cc sago007 2015-12-05 08:01 11
The copyright notices in the Software and this entire statement, including
9f5ec0cc sago007 2015-12-05 08:01 12
the above license grant, this restriction and the following disclaimer,
9f5ec0cc sago007 2015-12-05 08:01 13
must be included in all copies of the Software, in whole or in part, and
9f5ec0cc sago007 2015-12-05 08:01 14
all derivative works of the Software, unless such copies or derivative
9f5ec0cc sago007 2015-12-05 08:01 15
works are solely in the form of machine-executable object code generated by
9f5ec0cc sago007 2015-12-05 08:01 16
a source language processor.
9f5ec0cc sago007 2015-12-05 08:01 17
9f5ec0cc sago007 2015-12-05 08:01 18
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
9f5ec0cc sago007 2015-12-05 08:01 19
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9f5ec0cc sago007 2015-12-05 08:01 20
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
9f5ec0cc sago007 2015-12-05 08:01 21
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
9f5ec0cc sago007 2015-12-05 08:01 22
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
9f5ec0cc sago007 2015-12-05 08:01 23
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
9f5ec0cc sago007 2015-12-05 08:01 24
DEALINGS IN THE SOFTWARE.
9f5ec0cc sago007 2015-12-05 08:01 25
*/
9f5ec0cc sago007 2015-12-05 08:01 26
9f5ec0cc sago007 2015-12-05 08:01 27
9f5ec0cc sago007 2015-12-05 08:01 28
#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
9f5ec0cc sago007 2015-12-05 08:01 29
#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
9f5ec0cc sago007 2015-12-05 08:01 30
9f5ec0cc sago007 2015-12-05 08:01 31
#include "core.h"
9f5ec0cc sago007 2015-12-05 08:01 32
9f5ec0cc sago007 2015-12-05 08:01 33
namespace utf8
9f5ec0cc sago007 2015-12-05 08:01 34
{
dbf0fff9 Poul Sander 2025-09-18 18:25 35
    namespace unchecked
9f5ec0cc sago007 2015-12-05 08:01 36
    {
9f5ec0cc sago007 2015-12-05 08:01 37
        template <typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 38
        octet_iterator append(utfchar32_t cp, octet_iterator result)
9f5ec0cc sago007 2015-12-05 08:01 39
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 40
            return internal::append(cp, result);
dbf0fff9 Poul Sander 2025-09-18 18:25 41
        }
dbf0fff9 Poul Sander 2025-09-18 18:25 42
dbf0fff9 Poul Sander 2025-09-18 18:25 43
        template <typename word_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 44
        word_iterator append16(utfchar32_t cp, word_iterator result)
dbf0fff9 Poul Sander 2025-09-18 18:25 45
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 46
            return internal::append16(cp, result);
dbf0fff9 Poul Sander 2025-09-18 18:25 47
        }
dbf0fff9 Poul Sander 2025-09-18 18:25 48
dbf0fff9 Poul Sander 2025-09-18 18:25 49
        template <typename octet_iterator, typename output_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 50
        output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, utfchar32_t replacement)
dbf0fff9 Poul Sander 2025-09-18 18:25 51
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 52
            while (start != end) {
dbf0fff9 Poul Sander 2025-09-18 18:25 53
                octet_iterator sequence_start = start;
dbf0fff9 Poul Sander 2025-09-18 18:25 54
                internal::utf_error err_code = utf8::internal::validate_next(start, end);
dbf0fff9 Poul Sander 2025-09-18 18:25 55
                switch (err_code) {
dbf0fff9 Poul Sander 2025-09-18 18:25 56
                    case internal::UTF8_OK :
dbf0fff9 Poul Sander 2025-09-18 18:25 57
                        for (octet_iterator it = sequence_start; it != start; ++it)
dbf0fff9 Poul Sander 2025-09-18 18:25 58
                            *out++ = *it;
dbf0fff9 Poul Sander 2025-09-18 18:25 59
                        break;
dbf0fff9 Poul Sander 2025-09-18 18:25 60
                    case internal::NOT_ENOUGH_ROOM:
dbf0fff9 Poul Sander 2025-09-18 18:25 61
                        out = utf8::unchecked::append(replacement, out);
dbf0fff9 Poul Sander 2025-09-18 18:25 62
                        start = end;
dbf0fff9 Poul Sander 2025-09-18 18:25 63
                        break;
dbf0fff9 Poul Sander 2025-09-18 18:25 64
                    case internal::INVALID_LEAD:
dbf0fff9 Poul Sander 2025-09-18 18:25 65
                        out = utf8::unchecked::append(replacement, out);
dbf0fff9 Poul Sander 2025-09-18 18:25 66
                        ++start;
dbf0fff9 Poul Sander 2025-09-18 18:25 67
                        break;
dbf0fff9 Poul Sander 2025-09-18 18:25 68
                    case internal::INCOMPLETE_SEQUENCE:
dbf0fff9 Poul Sander 2025-09-18 18:25 69
                    case internal::OVERLONG_SEQUENCE:
dbf0fff9 Poul Sander 2025-09-18 18:25 70
                    case internal::INVALID_CODE_POINT:
dbf0fff9 Poul Sander 2025-09-18 18:25 71
                        out = utf8::unchecked::append(replacement, out);
dbf0fff9 Poul Sander 2025-09-18 18:25 72
                        ++start;
dbf0fff9 Poul Sander 2025-09-18 18:25 73
                        // just one replacement mark for the sequence
dbf0fff9 Poul Sander 2025-09-18 18:25 74
                        while (start != end && utf8::internal::is_trail(*start))
dbf0fff9 Poul Sander 2025-09-18 18:25 75
                            ++start;
dbf0fff9 Poul Sander 2025-09-18 18:25 76
                        break;
dbf0fff9 Poul Sander 2025-09-18 18:25 77
                }
9f5ec0cc sago007 2015-12-05 08:01 78
            }
dbf0fff9 Poul Sander 2025-09-18 18:25 79
            return out;
dbf0fff9 Poul Sander 2025-09-18 18:25 80
        }
dbf0fff9 Poul Sander 2025-09-18 18:25 81
dbf0fff9 Poul Sander 2025-09-18 18:25 82
        template <typename octet_iterator, typename output_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 83
        inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
dbf0fff9 Poul Sander 2025-09-18 18:25 84
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 85
            static const utfchar32_t replacement_marker = static_cast<utfchar32_t>(utf8::internal::mask16(0xfffd));
dbf0fff9 Poul Sander 2025-09-18 18:25 86
            return utf8::unchecked::replace_invalid(start, end, out, replacement_marker);
dbf0fff9 Poul Sander 2025-09-18 18:25 87
        }
dbf0fff9 Poul Sander 2025-09-18 18:25 88
dbf0fff9 Poul Sander 2025-09-18 18:25 89
        inline std::string replace_invalid(const std::string& s, utfchar32_t replacement)
dbf0fff9 Poul Sander 2025-09-18 18:25 90
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 91
            std::string result;
dbf0fff9 Poul Sander 2025-09-18 18:25 92
            replace_invalid(s.begin(), s.end(), std::back_inserter(result), replacement);
dbf0fff9 Poul Sander 2025-09-18 18:25 93
            return result;
dbf0fff9 Poul Sander 2025-09-18 18:25 94
        }
dbf0fff9 Poul Sander 2025-09-18 18:25 95
dbf0fff9 Poul Sander 2025-09-18 18:25 96
        inline std::string replace_invalid(const std::string& s)
dbf0fff9 Poul Sander 2025-09-18 18:25 97
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 98
            std::string result;
dbf0fff9 Poul Sander 2025-09-18 18:25 99
            replace_invalid(s.begin(), s.end(), std::back_inserter(result));
9f5ec0cc sago007 2015-12-05 08:01 100
            return result;
9f5ec0cc sago007 2015-12-05 08:01 101
        }
9f5ec0cc sago007 2015-12-05 08:01 102
9f5ec0cc sago007 2015-12-05 08:01 103
        template <typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 104
        utfchar32_t next(octet_iterator& it)
9f5ec0cc sago007 2015-12-05 08:01 105
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 106
            utfchar32_t cp = utf8::internal::mask8(*it);
dbf0fff9 Poul Sander 2025-09-18 18:25 107
            switch (utf8::internal::sequence_length(it)) {
9f5ec0cc sago007 2015-12-05 08:01 108
                case 1:
9f5ec0cc sago007 2015-12-05 08:01 109
                    break;
9f5ec0cc sago007 2015-12-05 08:01 110
                case 2:
dbf0fff9 Poul Sander 2025-09-18 18:25 111
                    ++it;
9f5ec0cc sago007 2015-12-05 08:01 112
                    cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
9f5ec0cc sago007 2015-12-05 08:01 113
                    break;
9f5ec0cc sago007 2015-12-05 08:01 114
                case 3:
dbf0fff9 Poul Sander 2025-09-18 18:25 115
                    ++it;
9f5ec0cc sago007 2015-12-05 08:01 116
                    cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
9f5ec0cc sago007 2015-12-05 08:01 117
                    ++it;
dbf0fff9 Poul Sander 2025-09-18 18:25 118
                    cp = static_cast<utfchar32_t>(cp + ((*it) & 0x3f));
9f5ec0cc sago007 2015-12-05 08:01 119
                    break;
9f5ec0cc sago007 2015-12-05 08:01 120
                case 4:
9f5ec0cc sago007 2015-12-05 08:01 121
                    ++it;
dbf0fff9 Poul Sander 2025-09-18 18:25 122
                    cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
9f5ec0cc sago007 2015-12-05 08:01 123
                    ++it;
dbf0fff9 Poul Sander 2025-09-18 18:25 124
                    cp = static_cast<utfchar32_t>(cp + ((utf8::internal::mask8(*it) << 6) & 0xfff));
9f5ec0cc sago007 2015-12-05 08:01 125
                    ++it;
dbf0fff9 Poul Sander 2025-09-18 18:25 126
                    cp = static_cast<utfchar32_t>(cp + ((*it) & 0x3f));
9f5ec0cc sago007 2015-12-05 08:01 127
                    break;
9f5ec0cc sago007 2015-12-05 08:01 128
            }
9f5ec0cc sago007 2015-12-05 08:01 129
            ++it;
dbf0fff9 Poul Sander 2025-09-18 18:25 130
            return cp;
9f5ec0cc sago007 2015-12-05 08:01 131
        }
9f5ec0cc sago007 2015-12-05 08:01 132
9f5ec0cc sago007 2015-12-05 08:01 133
        template <typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 134
        utfchar32_t peek_next(octet_iterator it)
9f5ec0cc sago007 2015-12-05 08:01 135
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 136
            return utf8::unchecked::next(it);
9f5ec0cc sago007 2015-12-05 08:01 137
        }
9f5ec0cc sago007 2015-12-05 08:01 138
dbf0fff9 Poul Sander 2025-09-18 18:25 139
        template <typename word_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 140
        utfchar32_t next16(word_iterator& it)
9f5ec0cc sago007 2015-12-05 08:01 141
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 142
            utfchar32_t cp = utf8::internal::mask16(*it++);
dbf0fff9 Poul Sander 2025-09-18 18:25 143
            if (utf8::internal::is_lead_surrogate(cp))
dbf0fff9 Poul Sander 2025-09-18 18:25 144
                return (cp << 10) + *it++ + utf8::internal::SURROGATE_OFFSET;
dbf0fff9 Poul Sander 2025-09-18 18:25 145
            return cp;
9f5ec0cc sago007 2015-12-05 08:01 146
        }
9f5ec0cc sago007 2015-12-05 08:01 147
9f5ec0cc sago007 2015-12-05 08:01 148
        template <typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 149
        utfchar32_t prior(octet_iterator& it)
9f5ec0cc sago007 2015-12-05 08:01 150
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 151
            while (utf8::internal::is_trail(*(--it))) ;
dbf0fff9 Poul Sander 2025-09-18 18:25 152
            octet_iterator temp = it;
dbf0fff9 Poul Sander 2025-09-18 18:25 153
            return utf8::unchecked::next(temp);
9f5ec0cc sago007 2015-12-05 08:01 154
        }
9f5ec0cc sago007 2015-12-05 08:01 155
9f5ec0cc sago007 2015-12-05 08:01 156
        template <typename octet_iterator, typename distance_type>
dbf0fff9 Poul Sander 2025-09-18 18:25 157
        void advance(octet_iterator& it, distance_type n)
9f5ec0cc sago007 2015-12-05 08:01 158
        {
dbf0fff9 Poul Sander 2025-09-18 18:25 159
            const distance_type zero(0);
dbf0fff9 Poul Sander 2025-09-18 18:25 160
            if (n < zero) {
dbf0fff9 Poul Sander 2025-09-18 18:25 161
                // backward
dbf0fff9 Poul Sander 2025-09-18 18:25 162
                for (distance_type i = n; i < zero; ++i)
dbf0fff9 Poul Sander 2025-09-18 18:25 163
                    utf8::unchecked::prior(it);
dbf0fff9 Poul Sander 2025-09-18 18:25 164
            } else {
dbf0fff9 Poul Sander 2025-09-18 18:25 165
                // forward
dbf0fff9 Poul Sander 2025-09-18 18:25 166
                for (distance_type i = zero; i < n; ++i)
dbf0fff9 Poul Sander 2025-09-18 18:25 167
                    utf8::unchecked::next(it);
dbf0fff9 Poul Sander 2025-09-18 18:25 168
            }
9f5ec0cc sago007 2015-12-05 08:01 169
        }
9f5ec0cc sago007 2015-12-05 08:01 170
9f5ec0cc sago007 2015-12-05 08:01 171
        template <typename octet_iterator>
9f5ec0cc sago007 2015-12-05 08:01 172
        typename std::iterator_traits<octet_iterator>::difference_type
dbf0fff9 Poul Sander 2025-09-18 18:25 173
        distance(octet_iterator first, octet_iterator last)
9f5ec0cc sago007 2015-12-05 08:01 174
        {
9f5ec0cc sago007 2015-12-05 08:01 175
            typename std::iterator_traits<octet_iterator>::difference_type dist;
dbf0fff9 Poul Sander 2025-09-18 18:25 176
            for (dist = 0; first < last; ++dist)
9f5ec0cc sago007 2015-12-05 08:01 177
                utf8::unchecked::next(first);
9f5ec0cc sago007 2015-12-05 08:01 178
            return dist;
9f5ec0cc sago007 2015-12-05 08:01 179
        }
9f5ec0cc sago007 2015-12-05 08:01 180
9f5ec0cc sago007 2015-12-05 08:01 181
        template <typename u16bit_iterator, typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 182
        octet_iterator utf16to8(u16bit_iterator start, u16bit_iterator end, octet_iterator result)
dbf0fff9 Poul Sander 2025-09-18 18:25 183
        {
9f5ec0cc sago007 2015-12-05 08:01 184
            while (start != end) {
dbf0fff9 Poul Sander 2025-09-18 18:25 185
                utfchar32_t cp = utf8::internal::mask16(*start++);
dbf0fff9 Poul Sander 2025-09-18 18:25 186
                // Take care of surrogate pairs first
9f5ec0cc sago007 2015-12-05 08:01 187
                if (utf8::internal::is_lead_surrogate(cp)) {
dbf0fff9 Poul Sander 2025-09-18 18:25 188
                    if (start == end)
dbf0fff9 Poul Sander 2025-09-18 18:25 189
                        return result;
dbf0fff9 Poul Sander 2025-09-18 18:25 190
                    utfchar32_t trail_surrogate = utf8::internal::mask16(*start++);
9f5ec0cc sago007 2015-12-05 08:01 191
                    cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
9f5ec0cc sago007 2015-12-05 08:01 192
                }
9f5ec0cc sago007 2015-12-05 08:01 193
                result = utf8::unchecked::append(cp, result);
9f5ec0cc sago007 2015-12-05 08:01 194
            }
dbf0fff9 Poul Sander 2025-09-18 18:25 195
            return result;
9f5ec0cc sago007 2015-12-05 08:01 196
        }
9f5ec0cc sago007 2015-12-05 08:01 197
9f5ec0cc sago007 2015-12-05 08:01 198
        template <typename u16bit_iterator, typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 199
        u16bit_iterator utf8to16(octet_iterator start, octet_iterator end, u16bit_iterator result)
9f5ec0cc sago007 2015-12-05 08:01 200
        {
9f5ec0cc sago007 2015-12-05 08:01 201
            while (start < end) {
dbf0fff9 Poul Sander 2025-09-18 18:25 202
                utfchar32_t cp = utf8::unchecked::next(start);
9f5ec0cc sago007 2015-12-05 08:01 203
                if (cp > 0xffff) { //make a surrogate pair
dbf0fff9 Poul Sander 2025-09-18 18:25 204
                    *result++ = static_cast<utfchar16_t>((cp >> 10)   + internal::LEAD_OFFSET);
dbf0fff9 Poul Sander 2025-09-18 18:25 205
                    *result++ = static_cast<utfchar16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
9f5ec0cc sago007 2015-12-05 08:01 206
                }
9f5ec0cc sago007 2015-12-05 08:01 207
                else
dbf0fff9 Poul Sander 2025-09-18 18:25 208
                    *result++ = static_cast<utfchar16_t>(cp);
9f5ec0cc sago007 2015-12-05 08:01 209
            }
9f5ec0cc sago007 2015-12-05 08:01 210
            return result;
9f5ec0cc sago007 2015-12-05 08:01 211
        }
9f5ec0cc sago007 2015-12-05 08:01 212
9f5ec0cc sago007 2015-12-05 08:01 213
        template <typename octet_iterator, typename u32bit_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 214
        octet_iterator utf32to8(u32bit_iterator start, u32bit_iterator end, octet_iterator result)
9f5ec0cc sago007 2015-12-05 08:01 215
        {
9f5ec0cc sago007 2015-12-05 08:01 216
            while (start != end)
9f5ec0cc sago007 2015-12-05 08:01 217
                result = utf8::unchecked::append(*(start++), result);
9f5ec0cc sago007 2015-12-05 08:01 218
9f5ec0cc sago007 2015-12-05 08:01 219
            return result;
9f5ec0cc sago007 2015-12-05 08:01 220
        }
9f5ec0cc sago007 2015-12-05 08:01 221
9f5ec0cc sago007 2015-12-05 08:01 222
        template <typename octet_iterator, typename u32bit_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 223
        u32bit_iterator utf8to32(octet_iterator start, octet_iterator end, u32bit_iterator result)
9f5ec0cc sago007 2015-12-05 08:01 224
        {
9f5ec0cc sago007 2015-12-05 08:01 225
            while (start < end)
9f5ec0cc sago007 2015-12-05 08:01 226
                (*result++) = utf8::unchecked::next(start);
9f5ec0cc sago007 2015-12-05 08:01 227
9f5ec0cc sago007 2015-12-05 08:01 228
            return result;
9f5ec0cc sago007 2015-12-05 08:01 229
        }
9f5ec0cc sago007 2015-12-05 08:01 230
9f5ec0cc sago007 2015-12-05 08:01 231
        // The iterator class
9f5ec0cc sago007 2015-12-05 08:01 232
        template <typename octet_iterator>
dbf0fff9 Poul Sander 2025-09-18 18:25 233
          class iterator {
9f5ec0cc sago007 2015-12-05 08:01 234
            octet_iterator it;
9f5ec0cc sago007 2015-12-05 08:01 235
            public:
dbf0fff9 Poul Sander 2025-09-18 18:25 236
            typedef utfchar32_t value_type;
dbf0fff9 Poul Sander 2025-09-18 18:25 237
            typedef utfchar32_t* pointer;
dbf0fff9 Poul Sander 2025-09-18 18:25 238
            typedef utfchar32_t& reference;
dbf0fff9 Poul Sander 2025-09-18 18:25 239
            typedef std::ptrdiff_t difference_type;
dbf0fff9 Poul Sander 2025-09-18 18:25 240
            typedef std::bidirectional_iterator_tag iterator_category;
9f5ec0cc sago007 2015-12-05 08:01 241
            iterator () {}
9f5ec0cc sago007 2015-12-05 08:01 242
            explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
9f5ec0cc sago007 2015-12-05 08:01 243
            // the default "big three" are OK
9f5ec0cc sago007 2015-12-05 08:01 244
            octet_iterator base () const { return it; }
dbf0fff9 Poul Sander 2025-09-18 18:25 245
            utfchar32_t operator * () const
9f5ec0cc sago007 2015-12-05 08:01 246
            {
9f5ec0cc sago007 2015-12-05 08:01 247
                octet_iterator temp = it;
9f5ec0cc sago007 2015-12-05 08:01 248
                return utf8::unchecked::next(temp);
9f5ec0cc sago007 2015-12-05 08:01 249
            }
dbf0fff9 Poul Sander 2025-09-18 18:25 250
            bool operator == (const iterator& rhs) const
dbf0fff9 Poul Sander 2025-09-18 18:25 251
            {
9f5ec0cc sago007 2015-12-05 08:01 252
                return (it == rhs.it);
9f5ec0cc sago007 2015-12-05 08:01 253
            }
9f5ec0cc sago007 2015-12-05 08:01 254
            bool operator != (const iterator& rhs) const
9f5ec0cc sago007 2015-12-05 08:01 255
            {
9f5ec0cc sago007 2015-12-05 08:01 256
                return !(operator == (rhs));
9f5ec0cc sago007 2015-12-05 08:01 257
            }
dbf0fff9 Poul Sander 2025-09-18 18:25 258
            iterator& operator ++ ()
9f5ec0cc sago007 2015-12-05 08:01 259
            {
9f5ec0cc sago007 2015-12-05 08:01 260
                ::std::advance(it, utf8::internal::sequence_length(it));
9f5ec0cc sago007 2015-12-05 08:01 261
                return *this;
9f5ec0cc sago007 2015-12-05 08:01 262
            }
9f5ec0cc sago007 2015-12-05 08:01 263
            iterator operator ++ (int)
9f5ec0cc sago007 2015-12-05 08:01 264
            {
9f5ec0cc sago007 2015-12-05 08:01 265
                iterator temp = *this;
9f5ec0cc sago007 2015-12-05 08:01 266
                ::std::advance(it, utf8::internal::sequence_length(it));
9f5ec0cc sago007 2015-12-05 08:01 267
                return temp;
dbf0fff9 Poul Sander 2025-09-18 18:25 268
            }
9f5ec0cc sago007 2015-12-05 08:01 269
            iterator& operator -- ()
9f5ec0cc sago007 2015-12-05 08:01 270
            {
9f5ec0cc sago007 2015-12-05 08:01 271
                utf8::unchecked::prior(it);
9f5ec0cc sago007 2015-12-05 08:01 272
                return *this;
9f5ec0cc sago007 2015-12-05 08:01 273
            }
9f5ec0cc sago007 2015-12-05 08:01 274
            iterator operator -- (int)
9f5ec0cc sago007 2015-12-05 08:01 275
            {
9f5ec0cc sago007 2015-12-05 08:01 276
                iterator temp = *this;
9f5ec0cc sago007 2015-12-05 08:01 277
                utf8::unchecked::prior(it);
9f5ec0cc sago007 2015-12-05 08:01 278
                return temp;
9f5ec0cc sago007 2015-12-05 08:01 279
            }
9f5ec0cc sago007 2015-12-05 08:01 280
          }; // class iterator
9f5ec0cc sago007 2015-12-05 08:01 281
9f5ec0cc sago007 2015-12-05 08:01 282
    } // namespace utf8::unchecked
dbf0fff9 Poul Sander 2025-09-18 18:25 283
} // namespace utf8
9f5ec0cc sago007 2015-12-05 08:01 284
9f5ec0cc sago007 2015-12-05 08:01 285
#endif // header guard
9f5ec0cc sago007 2015-12-05 08:01 286
1970-01-01 00:00 287