![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/include/boost/spirit/home/support/ |
Upload File : |
/*============================================================================= Copyright (c) 2001-2011 Joel de Guzman 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) ==============================================================================*/ #if !defined(BOOST_SPIRIT_UC_TYPES_NOVEMBER_23_2008_0840PM) #define BOOST_SPIRIT_UC_TYPES_NOVEMBER_23_2008_0840PM #if defined(_MSC_VER) #pragma once #endif #include <boost/cstdint.hpp> #include <boost/foreach.hpp> #include <boost/regex/pending/unicode_iterator.hpp> #include <boost/type_traits/make_unsigned.hpp> #include <string> namespace boost { namespace spirit { typedef ::boost::uint32_t ucs4_char; typedef char utf8_char; typedef std::basic_string<ucs4_char> ucs4_string; typedef std::basic_string<utf8_char> utf8_string; template <typename Char> inline utf8_string to_utf8(Char value) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator<utf8_string> insert_iter; insert_iter out_iter(result); utf8_output_iterator<insert_iter> utf8_iter(out_iter); typedef typename make_unsigned<Char>::type UChar; *utf8_iter = (UChar)value; return result; } template <typename Char> inline utf8_string to_utf8(Char const* str) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator<utf8_string> insert_iter; insert_iter out_iter(result); utf8_output_iterator<insert_iter> utf8_iter(out_iter); typedef typename make_unsigned<Char>::type UChar; while (*str) *utf8_iter++ = (UChar)*str++; return result; } template <typename Char, typename Traits, typename Allocator> inline utf8_string to_utf8(std::basic_string<Char, Traits, Allocator> const& str) { // always store as UTF8 utf8_string result; typedef std::back_insert_iterator<utf8_string> insert_iter; insert_iter out_iter(result); utf8_output_iterator<insert_iter> utf8_iter(out_iter); typedef typename make_unsigned<Char>::type UChar; BOOST_FOREACH(Char ch, str) { *utf8_iter++ = (UChar)ch; } return result; } // Assume wchar_t content is UTF-16 on Windows and UCS-4 on Unix #if defined(_WIN32) || defined(__CYGWIN__) inline utf8_string to_utf8(wchar_t value) { utf8_string result; typedef std::back_insert_iterator<utf8_string> insert_iter; insert_iter out_iter(result); utf8_output_iterator<insert_iter> utf8_iter(out_iter); u16_to_u32_iterator<wchar_t const*, ucs4_char> ucs4_iter(&value); *utf8_iter++ = *ucs4_iter; return result; } inline utf8_string to_utf8(wchar_t const* str) { utf8_string result; typedef std::back_insert_iterator<utf8_string> insert_iter; insert_iter out_iter(result); utf8_output_iterator<insert_iter> utf8_iter(out_iter); u16_to_u32_iterator<wchar_t const*, ucs4_char> ucs4_iter(str); for (ucs4_char c; (c = *ucs4_iter) != ucs4_char(); ++ucs4_iter) { *utf8_iter++ = c; } return result; } template <typename Traits, typename Allocator> inline utf8_string to_utf8(std::basic_string<wchar_t, Traits, Allocator> const& str) { return to_utf8(str.c_str()); } #endif }} #endif