imgtools/imglib/boostlibrary/boost/regex/pending/unicode_iterator.hpp
author jjkang
Fri, 25 Jun 2010 18:11:34 +0800
changeset 600 6d08f4a05d93
permissions -rw-r--r--
add deprecated files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
600
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     1
/*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     2
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     3
 * Copyright (c) 2004
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     4
 * John Maddock
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     5
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     6
 * Use, modification and distribution are subject to the 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     7
 * Boost Software License, Version 1.0. (See accompanying file 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     8
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
     9
 *
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    10
 */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    11
 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    12
 /*
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    13
  *   LOCATION:    see http://www.boost.org for most recent version.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    14
  *   FILE         unicode_iterator.hpp
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    15
  *   VERSION      see <boost/version.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    16
  *   DESCRIPTION: Iterator adapters for converting between different Unicode encodings.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    17
  */
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    18
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    19
/****************************************************************************
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    20
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    21
Contents:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    22
~~~~~~~~~
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    23
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    24
1) Read Only, Input Adapters:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    25
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    26
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    27
template <class BaseIterator, class U8Type = ::boost::uint8_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    28
class u32_to_u8_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    29
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    30
Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-8.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    31
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    32
template <class BaseIterator, class U32Type = ::boost::uint32_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    33
class u8_to_u32_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    34
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    35
Adapts sequence of UTF-8 code points to "look like" a sequence of UTF-32.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    36
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    37
template <class BaseIterator, class U16Type = ::boost::uint16_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    38
class u32_to_u16_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    39
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    40
Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-16.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    41
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    42
template <class BaseIterator, class U32Type = ::boost::uint32_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    43
class u16_to_u32_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    44
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    45
Adapts sequence of UTF-16 code points to "look like" a sequence of UTF-32.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    46
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    47
2) Single pass output iterator adapters:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    48
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    49
template <class BaseIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    50
class utf8_output_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    51
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    52
Accepts UTF-32 code points and forwards them on as UTF-8 code points.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    53
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    54
template <class BaseIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    55
class utf16_output_iterator;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    56
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    57
Accepts UTF-32 code points and forwards them on as UTF-16 code points.
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    58
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    59
****************************************************************************/
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    60
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    61
#ifndef BOOST_REGEX_UNICODE_ITERATOR_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    62
#define BOOST_REGEX_UNICODE_ITERATOR_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    63
#include <boost/cstdint.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    64
#include <boost/assert.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    65
#include <boost/iterator/iterator_facade.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    66
#include <boost/static_assert.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    67
#include <boost/throw_exception.hpp>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    68
#include <stdexcept>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    69
#ifndef BOOST_NO_STD_LOCALE
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    70
#include <sstream>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    71
#include <ios>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    72
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    73
#include <limits.h> // CHAR_BIT
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    74
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    75
namespace boost{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    76
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    77
namespace detail{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    78
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    79
static const ::boost::uint16_t high_surrogate_base = 0xD7C0u;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    80
static const ::boost::uint16_t low_surrogate_base = 0xDC00u;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    81
static const ::boost::uint32_t ten_bit_mask = 0x3FFu;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    82
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    83
inline bool is_high_surrogate(::boost::uint16_t v)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    84
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    85
   return (v & 0xFC00u) == 0xd800u;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    86
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    87
inline bool is_low_surrogate(::boost::uint16_t v)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    88
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    89
   return (v & 0xFC00u) == 0xdc00u;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    90
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    91
template <class T>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    92
inline bool is_surrogate(T v)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    93
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    94
   return (v & 0xF800u) == 0xd800;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    95
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    96
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    97
inline unsigned utf8_byte_count(boost::uint8_t c)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    98
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
    99
   // if the most significant bit with a zero in it is in position
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   100
   // 8-N then there are N bytes in this UTF-8 sequence:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   101
   boost::uint8_t mask = 0x80u;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   102
   unsigned result = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   103
   while(c & mask)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   104
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   105
      ++result;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   106
      mask >>= 1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   107
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   108
   return (result == 0) ? 1 : ((result > 4) ? 4 : result);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   109
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   110
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   111
inline unsigned utf8_trailing_byte_count(boost::uint8_t c)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   112
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   113
   return utf8_byte_count(c) - 1;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   114
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   115
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   116
inline void invalid_utf32_code_point(::boost::uint32_t val)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   117
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   118
#ifndef BOOST_NO_STD_LOCALE
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   119
   std::stringstream ss;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   120
   ss << "Invalid UTF-32 code point U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-16 sequence";
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   121
   std::out_of_range e(ss.str());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   122
#else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   123
   std::out_of_range e("Invalid UTF-32 code point encountered while trying to encode UTF-16 sequence");
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   124
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   125
   boost::throw_exception(e);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   126
}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   127
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   128
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   129
} // namespace detail
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   130
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   131
template <class BaseIterator, class U16Type = ::boost::uint16_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   132
class u32_to_u16_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   133
   : public boost::iterator_facade<u32_to_u16_iterator<BaseIterator, U16Type>, U16Type, std::bidirectional_iterator_tag, const U16Type>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   134
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   135
   typedef boost::iterator_facade<u32_to_u16_iterator<BaseIterator, U16Type>, U16Type, std::bidirectional_iterator_tag, const U16Type> base_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   136
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   137
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   138
   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   139
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   140
   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   141
   BOOST_STATIC_ASSERT(sizeof(U16Type)*CHAR_BIT == 16);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   142
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   143
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   144
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   145
   typename base_type::reference
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   146
      dereference()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   147
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   148
      if(m_current == 2)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   149
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   150
      return m_values[m_current];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   151
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   152
   bool equal(const u32_to_u16_iterator& that)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   153
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   154
      if(m_position == that.m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   155
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   156
         // Both m_currents must be equal, or both even
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   157
         // this is the same as saying their sum must be even:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   158
         return (m_current + that.m_current) & 1u ? false : true;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   159
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   160
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   161
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   162
   void increment()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   163
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   164
      // if we have a pending read then read now, so that we know whether
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   165
      // to skip a position, or move to a low-surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   166
      if(m_current == 2)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   167
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   168
         // pending read:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   169
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   170
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   171
      // move to the next surrogate position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   172
      ++m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   173
      // if we've reached the end skip a position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   174
      if(m_values[m_current] == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   175
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   176
         m_current = 2;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   177
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   178
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   179
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   180
   void decrement()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   181
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   182
      if(m_current != 1)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   183
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   184
         // decrementing an iterator always leads to a valid position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   185
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   186
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   187
         m_current = m_values[1] ? 1 : 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   188
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   189
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   190
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   191
         m_current = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   192
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   193
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   194
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   195
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   196
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   197
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   198
   // construct:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   199
   u32_to_u16_iterator() : m_position(), m_current(0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   200
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   201
      m_values[0] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   202
      m_values[1] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   203
      m_values[2] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   204
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   205
   u32_to_u16_iterator(BaseIterator b) : m_position(b), m_current(2)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   206
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   207
      m_values[0] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   208
      m_values[1] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   209
      m_values[2] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   210
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   211
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   212
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   213
   void extract_current()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   214
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   215
      // begin by checking for a code point out of range:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   216
      ::boost::uint32_t v = *m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   217
      if(v >= 0x10000u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   218
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   219
         if(v > 0x10FFFFu)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   220
            detail::invalid_utf32_code_point(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   221
         // split into two surrogates:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   222
         m_values[0] = static_cast<U16Type>(v >> 10) + detail::high_surrogate_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   223
         m_values[1] = static_cast<U16Type>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   224
         m_current = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   225
         BOOST_ASSERT(detail::is_high_surrogate(m_values[0]));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   226
         BOOST_ASSERT(detail::is_low_surrogate(m_values[1]));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   227
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   228
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   229
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   230
         // 16-bit code point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   231
         m_values[0] = static_cast<U16Type>(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   232
         m_values[1] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   233
         m_current = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   234
         // value must not be a surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   235
         if(detail::is_surrogate(m_values[0]))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   236
            detail::invalid_utf32_code_point(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   237
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   238
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   239
   BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   240
   mutable U16Type m_values[3];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   241
   mutable unsigned m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   242
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   243
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   244
template <class BaseIterator, class U32Type = ::boost::uint32_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   245
class u16_to_u32_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   246
   : public boost::iterator_facade<u16_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   247
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   248
   typedef boost::iterator_facade<u16_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type> base_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   249
   // special values for pending iterator reads:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   250
   BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   251
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   252
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   253
   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   254
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   255
   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 16);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   256
   BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   257
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   258
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   259
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   260
   typename base_type::reference
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   261
      dereference()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   262
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   263
      if(m_value == pending_read)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   264
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   265
      return m_value;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   266
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   267
   bool equal(const u16_to_u32_iterator& that)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   268
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   269
      return m_position == that.m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   270
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   271
   void increment()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   272
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   273
      // skip high surrogate first if there is one:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   274
      if(detail::is_high_surrogate(*m_position)) ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   275
      ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   276
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   277
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   278
   void decrement()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   279
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   280
      --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   281
      // if we have a low surrogate then go back one more:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   282
      if(detail::is_low_surrogate(*m_position)) 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   283
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   284
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   285
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   286
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   287
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   288
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   289
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   290
   // construct:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   291
   u16_to_u32_iterator() : m_position()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   292
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   293
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   294
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   295
   u16_to_u32_iterator(BaseIterator b) : m_position(b)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   296
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   297
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   298
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   299
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   300
   static void invalid_code_point(::boost::uint16_t val)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   301
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   302
#ifndef BOOST_NO_STD_LOCALE
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   303
      std::stringstream ss;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   304
      ss << "Misplaced UTF-16 surrogate U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-32 sequence";
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   305
      std::out_of_range e(ss.str());
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   306
#else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   307
      std::out_of_range e("Misplaced UTF-16 surrogate encountered while trying to encode UTF-32 sequence");
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   308
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   309
      boost::throw_exception(e);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   310
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   311
   void extract_current()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   312
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   313
      m_value = static_cast<U32Type>(static_cast< ::boost::uint16_t>(*m_position));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   314
      // if the last value is a high surrogate then adjust m_position and m_value as needed:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   315
      if(detail::is_high_surrogate(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   316
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   317
         // precondition; next value must have be a low-surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   318
         BaseIterator next(m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   319
         ::boost::uint16_t t = *++next;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   320
         if((t & 0xFC00u) != 0xDC00u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   321
            invalid_code_point(t);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   322
         m_value = (m_value - detail::high_surrogate_base) << 10;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   323
         m_value |= (static_cast<U32Type>(static_cast< ::boost::uint16_t>(t)) & detail::ten_bit_mask);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   324
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   325
      // postcondition; result must not be a surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   326
      if(detail::is_surrogate(m_value))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   327
         invalid_code_point(static_cast< ::boost::uint16_t>(m_value));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   328
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   329
   BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   330
   mutable U32Type m_value;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   331
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   332
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   333
template <class BaseIterator, class U8Type = ::boost::uint8_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   334
class u32_to_u8_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   335
   : public boost::iterator_facade<u32_to_u8_iterator<BaseIterator, U8Type>, U8Type, std::bidirectional_iterator_tag, const U8Type>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   336
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   337
   typedef boost::iterator_facade<u32_to_u8_iterator<BaseIterator, U8Type>, U8Type, std::bidirectional_iterator_tag, const U8Type> base_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   338
   
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   339
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   340
   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   341
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   342
   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   343
   BOOST_STATIC_ASSERT(sizeof(U8Type)*CHAR_BIT == 8);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   344
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   345
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   346
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   347
   typename base_type::reference
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   348
      dereference()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   349
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   350
      if(m_current == 4)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   351
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   352
      return m_values[m_current];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   353
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   354
   bool equal(const u32_to_u8_iterator& that)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   355
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   356
      if(m_position == that.m_position)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   357
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   358
         // either the m_current's must be equal, or one must be 0 and 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   359
         // the other 4: which means neither must have bits 1 or 2 set:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   360
         return (m_current == that.m_current)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   361
            || (((m_current | that.m_current) & 3) == 0);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   362
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   363
      return false;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   364
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   365
   void increment()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   366
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   367
      // if we have a pending read then read now, so that we know whether
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   368
      // to skip a position, or move to a low-surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   369
      if(m_current == 4)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   370
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   371
         // pending read:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   372
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   373
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   374
      // move to the next surrogate position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   375
      ++m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   376
      // if we've reached the end skip a position:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   377
      if(m_values[m_current] == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   378
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   379
         m_current = 4;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   380
         ++m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   381
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   382
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   383
   void decrement()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   384
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   385
      if((m_current & 3) == 0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   386
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   387
         --m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   388
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   389
         m_current = 3;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   390
         while(m_current && (m_values[m_current] == 0))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   391
            --m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   392
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   393
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   394
         --m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   395
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   396
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   397
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   398
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   399
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   400
   // construct:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   401
   u32_to_u8_iterator() : m_position(), m_current(0)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   402
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   403
      m_values[0] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   404
      m_values[1] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   405
      m_values[2] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   406
      m_values[3] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   407
      m_values[4] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   408
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   409
   u32_to_u8_iterator(BaseIterator b) : m_position(b), m_current(4)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   410
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   411
      m_values[0] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   412
      m_values[1] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   413
      m_values[2] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   414
      m_values[3] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   415
      m_values[4] = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   416
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   417
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   418
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   419
   void extract_current()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   420
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   421
      boost::uint32_t c = *m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   422
      if(c > 0x10FFFFu)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   423
         detail::invalid_utf32_code_point(c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   424
      if(c < 0x80u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   425
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   426
         m_values[0] = static_cast<unsigned char>(c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   427
         m_values[1] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   428
         m_values[2] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   429
         m_values[3] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   430
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   431
      else if(c < 0x800u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   432
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   433
         m_values[0] = static_cast<unsigned char>(0xC0u + (c >> 6));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   434
         m_values[1] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   435
         m_values[2] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   436
         m_values[3] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   437
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   438
      else if(c < 0x10000u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   439
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   440
         m_values[0] = static_cast<unsigned char>(0xE0u + (c >> 12));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   441
         m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   442
         m_values[2] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   443
         m_values[3] = static_cast<unsigned char>(0u);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   444
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   445
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   446
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   447
         m_values[0] = static_cast<unsigned char>(0xF0u + (c >> 18));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   448
         m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   449
         m_values[2] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   450
         m_values[3] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   451
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   452
      m_current= 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   453
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   454
   BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   455
   mutable U8Type m_values[5];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   456
   mutable unsigned m_current;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   457
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   458
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   459
template <class BaseIterator, class U32Type = ::boost::uint32_t>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   460
class u8_to_u32_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   461
   : public boost::iterator_facade<u8_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   462
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   463
   typedef boost::iterator_facade<u8_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type> base_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   464
   // special values for pending iterator reads:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   465
   BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   466
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   467
#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   468
   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   469
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   470
   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 8);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   471
   BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   472
#endif
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   473
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   474
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   475
   typename base_type::reference
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   476
      dereference()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   477
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   478
      if(m_value == pending_read)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   479
         extract_current();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   480
      return m_value;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   481
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   482
   bool equal(const u8_to_u32_iterator& that)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   483
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   484
      return m_position == that.m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   485
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   486
   void increment()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   487
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   488
      // skip high surrogate first if there is one:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   489
      unsigned c = detail::utf8_byte_count(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   490
      std::advance(m_position, c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   491
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   492
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   493
   void decrement()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   494
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   495
      // Keep backtracking until we don't have a trailing character:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   496
      unsigned count = 0;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   497
      while((*--m_position & 0xC0u) == 0x80u) ++count;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   498
      // now check that the sequence was valid:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   499
      if(count != detail::utf8_trailing_byte_count(*m_position))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   500
         invalid_sequnce();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   501
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   502
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   503
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   504
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   505
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   506
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   507
   // construct:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   508
   u8_to_u32_iterator() : m_position()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   509
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   510
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   511
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   512
   u8_to_u32_iterator(BaseIterator b) : m_position(b)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   513
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   514
      m_value = pending_read;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   515
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   516
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   517
   static void invalid_sequnce()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   518
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   519
      std::out_of_range e("Invalid UTF-8 sequence encountered while trying to encode UTF-32 character");
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   520
      boost::throw_exception(e);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   521
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   522
   void extract_current()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   523
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   524
      m_value = static_cast<U32Type>(static_cast< ::boost::uint8_t>(*m_position));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   525
      // we must not have a continuation character:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   526
      if((m_value & 0xC0u) == 0x80u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   527
         invalid_sequnce();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   528
      // see how many extra byts we have:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   529
      unsigned extra = detail::utf8_trailing_byte_count(*m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   530
      // extract the extra bits, 6 from each extra byte:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   531
      BaseIterator next(m_position);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   532
      for(unsigned c = 0; c < extra; ++c)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   533
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   534
         ++next;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   535
         m_value <<= 6;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   536
         m_value += static_cast<boost::uint8_t>(*next) & 0x3Fu;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   537
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   538
      // we now need to remove a few of the leftmost bits, but how many depends
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   539
      // upon how many extra bytes we've extracted:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   540
      static const boost::uint32_t masks[4] = 
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   541
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   542
         0x7Fu,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   543
         0x7FFu,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   544
         0xFFFFu,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   545
         0x1FFFFFu,
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   546
      };
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   547
      m_value &= masks[extra];
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   548
      // check the result:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   549
      if(m_value > static_cast<U32Type>(0x10FFFFu))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   550
         invalid_sequnce();
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   551
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   552
   BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   553
   mutable U32Type m_value;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   554
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   555
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   556
template <class BaseIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   557
class utf16_output_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   558
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   559
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   560
   typedef void                                   difference_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   561
   typedef void                                   value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   562
   typedef boost::uint32_t*                       pointer;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   563
   typedef boost::uint32_t&                       reference;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   564
   typedef std::output_iterator_tag               iterator_category;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   565
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   566
   utf16_output_iterator(const BaseIterator& b)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   567
      : m_position(b){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   568
   utf16_output_iterator(const utf16_output_iterator& that)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   569
      : m_position(that.m_position){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   570
   utf16_output_iterator& operator=(const utf16_output_iterator& that)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   571
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   572
      m_position = that.m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   573
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   574
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   575
   const utf16_output_iterator& operator*()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   576
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   577
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   578
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   579
   void operator=(boost::uint32_t val)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   580
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   581
      push(val);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   582
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   583
   utf16_output_iterator& operator++()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   584
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   585
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   586
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   587
   utf16_output_iterator& operator++(int)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   588
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   589
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   590
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   591
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   592
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   593
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   594
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   595
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   596
   void push(boost::uint32_t v)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   597
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   598
      if(v >= 0x10000u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   599
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   600
         // begin by checking for a code point out of range:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   601
         if(v > 0x10FFFFu)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   602
            detail::invalid_utf32_code_point(v);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   603
         // split into two surrogates:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   604
         *m_position++ = static_cast<boost::uint16_t>(v >> 10) + detail::high_surrogate_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   605
         *m_position++ = static_cast<boost::uint16_t>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   606
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   607
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   608
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   609
         // 16-bit code point:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   610
         // value must not be a surrogate:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   611
         if(detail::is_surrogate(v))
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   612
            detail::invalid_utf32_code_point(v);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   613
         *m_position++ = static_cast<boost::uint16_t>(v);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   614
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   615
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   616
   mutable BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   617
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   618
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   619
template <class BaseIterator>
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   620
class utf8_output_iterator
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   621
{
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   622
public:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   623
   typedef void                                   difference_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   624
   typedef void                                   value_type;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   625
   typedef boost::uint32_t*                       pointer;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   626
   typedef boost::uint32_t&                       reference;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   627
   typedef std::output_iterator_tag               iterator_category;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   628
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   629
   utf8_output_iterator(const BaseIterator& b)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   630
      : m_position(b){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   631
   utf8_output_iterator(const utf8_output_iterator& that)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   632
      : m_position(that.m_position){}
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   633
   utf8_output_iterator& operator=(const utf8_output_iterator& that)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   634
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   635
      m_position = that.m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   636
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   637
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   638
   const utf8_output_iterator& operator*()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   639
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   640
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   641
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   642
   void operator=(boost::uint32_t val)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   643
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   644
      push(val);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   645
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   646
   utf8_output_iterator& operator++()
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   647
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   648
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   649
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   650
   utf8_output_iterator& operator++(int)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   651
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   652
      return *this;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   653
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   654
   BaseIterator base()const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   655
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   656
      return m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   657
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   658
private:
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   659
   void push(boost::uint32_t c)const
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   660
   {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   661
      if(c > 0x10FFFFu)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   662
         detail::invalid_utf32_code_point(c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   663
      if(c < 0x80u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   664
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   665
         *m_position++ = static_cast<unsigned char>(c);
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   666
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   667
      else if(c < 0x800u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   668
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   669
         *m_position++ = static_cast<unsigned char>(0xC0u + (c >> 6));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   670
         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   671
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   672
      else if(c < 0x10000u)
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   673
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   674
         *m_position++ = static_cast<unsigned char>(0xE0u + (c >> 12));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   675
         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   676
         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   677
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   678
      else
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   679
      {
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   680
         *m_position++ = static_cast<unsigned char>(0xF0u + (c >> 18));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   681
         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   682
         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   683
         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   684
      }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   685
   }
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   686
   mutable BaseIterator m_position;
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   687
};
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   688
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   689
} // namespace boost
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   690
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   691
#endif // BOOST_REGEX_UNICODE_ITERATOR_HPP
6d08f4a05d93 add deprecated files
jjkang
parents:
diff changeset
   692