annotate DEPENDENCIES/generic/include/boost/archive/impl/xml_woarchive_impl.ipp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 2 // xml_woarchive_impl.ipp:
Chris@16 3
Chris@16 4 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
Chris@16 5 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 6 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 #include <boost/config.hpp>
Chris@16 10 #ifndef BOOST_NO_STD_WSTREAMBUF
Chris@16 11
Chris@16 12 #include <ostream>
Chris@16 13 #include <string>
Chris@101 14 #include <algorithm> // std::copy
Chris@16 15 #include <locale>
Chris@16 16
Chris@16 17 #include <cstring> // strlen
Chris@16 18 #include <cstdlib> // mbtowc
Chris@16 19 #include <cwchar> // wcslen
Chris@16 20
Chris@101 21 #include <boost/config.hpp>
Chris@16 22 #if defined(BOOST_NO_STDC_NAMESPACE)
Chris@16 23 namespace std{
Chris@16 24 using ::strlen;
Chris@16 25 #if ! defined(BOOST_NO_INTRINSIC_WCHAR_T)
Chris@16 26 using ::mbtowc;
Chris@16 27 using ::wcslen;
Chris@16 28 #endif
Chris@16 29 } // namespace std
Chris@16 30 #endif
Chris@16 31
Chris@101 32 #include <boost/archive/xml_woarchive.hpp>
Chris@16 33 #include <boost/serialization/throw_exception.hpp>
Chris@16 34
Chris@16 35 #include <boost/archive/iterators/xml_escape.hpp>
Chris@16 36 #include <boost/archive/iterators/wchar_from_mb.hpp>
Chris@16 37 #include <boost/archive/iterators/ostream_iterator.hpp>
Chris@16 38 #include <boost/archive/iterators/dataflow_exception.hpp>
Chris@16 39
Chris@16 40 #include <boost/archive/add_facet.hpp>
Chris@16 41
Chris@16 42 namespace boost {
Chris@16 43 namespace archive {
Chris@16 44
Chris@16 45 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 46 // implemenations of functions specific to wide char archives
Chris@16 47
Chris@16 48 // copy chars to output escaping to xml and widening characters as we go
Chris@16 49 template<class InputIterator>
Chris@16 50 void save_iterator(std::wostream &os, InputIterator begin, InputIterator end){
Chris@16 51 typedef iterators::wchar_from_mb<
Chris@16 52 iterators::xml_escape<InputIterator>
Chris@16 53 > xmbtows;
Chris@16 54 std::copy(
Chris@16 55 xmbtows(BOOST_MAKE_PFTO_WRAPPER(begin)),
Chris@16 56 xmbtows(BOOST_MAKE_PFTO_WRAPPER(end)),
Chris@16 57 boost::archive::iterators::ostream_iterator<wchar_t>(os)
Chris@16 58 );
Chris@16 59 }
Chris@16 60
Chris@16 61 template<class Archive>
Chris@16 62 BOOST_WARCHIVE_DECL(void)
Chris@16 63 xml_woarchive_impl<Archive>::save(const std::string & s){
Chris@16 64 // note: we don't use s.begin() and s.end() because dinkumware
Chris@16 65 // doesn't have string::value_type defined. So use a wrapper
Chris@16 66 // around these values to implement the definitions.
Chris@16 67 const char * begin = s.data();
Chris@16 68 const char * end = begin + s.size();
Chris@16 69 save_iterator(os, begin, end);
Chris@16 70 }
Chris@16 71
Chris@16 72 #ifndef BOOST_NO_STD_WSTRING
Chris@16 73 template<class Archive>
Chris@16 74 BOOST_WARCHIVE_DECL(void)
Chris@16 75 xml_woarchive_impl<Archive>::save(const std::wstring & ws){
Chris@16 76 #if 0
Chris@16 77 typedef iterators::xml_escape<std::wstring::const_iterator> xmbtows;
Chris@16 78 std::copy(
Chris@16 79 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.begin())),
Chris@16 80 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.end())),
Chris@16 81 boost::archive::iterators::ostream_iterator<wchar_t>(os)
Chris@16 82 );
Chris@16 83 #endif
Chris@16 84 typedef iterators::xml_escape<const wchar_t *> xmbtows;
Chris@16 85 std::copy(
Chris@16 86 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.data())),
Chris@16 87 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.data() + ws.size())),
Chris@16 88 boost::archive::iterators::ostream_iterator<wchar_t>(os)
Chris@16 89 );
Chris@16 90 }
Chris@16 91 #endif //BOOST_NO_STD_WSTRING
Chris@16 92
Chris@16 93 template<class Archive>
Chris@16 94 BOOST_WARCHIVE_DECL(void)
Chris@16 95 xml_woarchive_impl<Archive>::save(const char * s){
Chris@16 96 save_iterator(os, s, s + std::strlen(s));
Chris@16 97 }
Chris@16 98
Chris@16 99 #ifndef BOOST_NO_INTRINSIC_WCHAR_T
Chris@16 100 template<class Archive>
Chris@16 101 BOOST_WARCHIVE_DECL(void)
Chris@16 102 xml_woarchive_impl<Archive>::save(const wchar_t * ws){
Chris@16 103 os << ws;
Chris@16 104 typedef iterators::xml_escape<const wchar_t *> xmbtows;
Chris@16 105 std::copy(
Chris@16 106 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws)),
Chris@16 107 xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws + std::wcslen(ws))),
Chris@16 108 boost::archive::iterators::ostream_iterator<wchar_t>(os)
Chris@16 109 );
Chris@16 110 }
Chris@16 111 #endif
Chris@16 112
Chris@16 113 template<class Archive>
Chris@16 114 BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
Chris@16 115 xml_woarchive_impl<Archive>::xml_woarchive_impl(
Chris@16 116 std::wostream & os_,
Chris@16 117 unsigned int flags
Chris@16 118 ) :
Chris@16 119 basic_text_oprimitive<std::wostream>(
Chris@16 120 os_,
Chris@16 121 true // don't change the codecvt - use the one below
Chris@16 122 ),
Chris@16 123 basic_xml_oarchive<Archive>(flags)
Chris@16 124 {
Chris@16 125 // Standard behavior is that imbue can be called
Chris@16 126 // a) before output is invoked or
Chris@16 127 // b) after flush has been called. This prevents one-to-many
Chris@16 128 // transforms (such as one to many transforms from getting
Chris@101 129 // mixed up.
Chris@16 130 if(0 == (flags & no_codecvt)){
Chris@101 131 archive_locale.reset(
Chris@101 132 add_facet(
Chris@101 133 os_.getloc(),
Chris@101 134 new boost::archive::detail::utf8_codecvt_facet
Chris@101 135 )
Chris@101 136 );
Chris@101 137 //os.imbue(* archive_locale);
Chris@16 138 }
Chris@16 139 if(0 == (flags & no_header))
Chris@16 140 this->init();
Chris@16 141 }
Chris@16 142
Chris@101 143 template<class Archive>
Chris@101 144 BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
Chris@101 145 xml_woarchive_impl<Archive>::~xml_woarchive_impl(){
Chris@101 146 }
Chris@101 147
Chris@16 148 } // namespace archive
Chris@16 149 } // namespace boost
Chris@16 150
Chris@16 151 #endif //BOOST_NO_STD_WSTREAMBUF