123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- //
- // Copyright (c) 2015 Artyom Beilis (Tonkikh)
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- #ifndef BOOST_LOCALE_UTF8_CODECVT_HPP
- #define BOOST_LOCALE_UTF8_CODECVT_HPP
- #include <boost/locale/utf.hpp>
- #include <boost/locale/generic_codecvt.hpp>
- #include <boost/cstdint.hpp>
- #include <locale>
- namespace boost {
- namespace locale {
- ///
- /// \brief Geneneric utf8 codecvt facet, it allows to convert UTF-8 strings to UTF-16 and UTF-32 using wchar_t, char32_t and char16_t
- ///
- template<typename CharType>
- class utf8_codecvt : public generic_codecvt<CharType,utf8_codecvt<CharType> >
- {
- public:
-
- struct state_type {};
- utf8_codecvt(size_t refs = 0) : generic_codecvt<CharType,utf8_codecvt<CharType> >(refs)
- {
- }
- static int max_encoding_length()
- {
- return 4;
- }
- static state_type initial_state(generic_codecvt_base::initial_convertion_state /* unused */)
- {
- return state_type();
- }
- static utf::code_point to_unicode(state_type &,char const *&begin,char const *end)
- {
- char const *p=begin;
- utf::code_point c = utf::utf_traits<char>::decode(p,end);
- if(c!=utf::illegal && c!=utf::incomplete)
- begin = p;
- return c;
- }
- static utf::code_point from_unicode(state_type &,utf::code_point u,char *begin,char const *end)
- {
- if(!utf::is_valid_codepoint(u))
- return utf::illegal;
- int width;
- if((width=utf::utf_traits<char>::width(u)) > end - begin)
- return utf::incomplete;
- utf::utf_traits<char>::encode(u,begin);
- return width;
- }
- };
- } // locale
- } // namespace boost
- #endif
- ///
- // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
|