annotate DEPENDENCIES/generic/include/boost/archive/impl/xml_wiarchive_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@101 2 // xml_wiarchive_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 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 10
Chris@16 11 #include <cstring>
Chris@16 12 #if defined(BOOST_NO_STDC_NAMESPACE)
Chris@16 13 namespace std{
Chris@16 14 using ::memcpy;
Chris@16 15 } //std
Chris@16 16 #endif
Chris@16 17
Chris@16 18 #include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings
Chris@16 19 #ifndef BOOST_NO_STD_WSTREAMBUF
Chris@16 20
Chris@16 21 #include <boost/assert.hpp>
Chris@101 22 #include <algorithm> // std::copy
Chris@16 23
Chris@16 24 #include <boost/detail/workaround.hpp> // Dinkumware and RogueWave
Chris@16 25 #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
Chris@16 26 #include <boost/archive/dinkumware.hpp>
Chris@16 27 #endif
Chris@16 28
Chris@16 29 #include <boost/io/ios_state.hpp>
Chris@101 30 #include <boost/core/no_exceptions_support.hpp>
Chris@16 31 #include <boost/serialization/pfto.hpp>
Chris@16 32 #include <boost/serialization/string.hpp>
Chris@16 33
Chris@16 34 #include <boost/archive/basic_xml_archive.hpp>
Chris@16 35 #include <boost/archive/xml_wiarchive.hpp>
Chris@16 36
Chris@101 37 #include <boost/archive/add_facet.hpp>
Chris@101 38
Chris@101 39 #include <boost/archive/xml_archive_exception.hpp>
Chris@101 40 #include <boost/archive/iterators/mb_from_wchar.hpp>
Chris@101 41
Chris@16 42 #include "basic_xml_grammar.hpp"
Chris@16 43
Chris@16 44 namespace boost {
Chris@16 45 namespace archive {
Chris@16 46
Chris@16 47 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
Chris@16 48 // implemenations of functions specific to wide char archives
Chris@16 49
Chris@16 50 namespace { // anonymous
Chris@16 51
Chris@16 52 void copy_to_ptr(char * s, const std::wstring & ws){
Chris@16 53 std::copy(
Chris@16 54 iterators::mb_from_wchar<std::wstring::const_iterator>(
Chris@16 55 BOOST_MAKE_PFTO_WRAPPER(ws.begin())
Chris@16 56 ),
Chris@16 57 iterators::mb_from_wchar<std::wstring::const_iterator>(
Chris@16 58 BOOST_MAKE_PFTO_WRAPPER(ws.end())
Chris@16 59 ),
Chris@16 60 s
Chris@16 61 );
Chris@16 62 s[ws.size()] = 0;
Chris@16 63 }
Chris@16 64
Chris@16 65 } // anonymous
Chris@16 66
Chris@16 67 template<class Archive>
Chris@16 68 BOOST_WARCHIVE_DECL(void)
Chris@16 69 xml_wiarchive_impl<Archive>::load(std::string & s){
Chris@16 70 std::wstring ws;
Chris@16 71 bool result = gimpl->parse_string(is, ws);
Chris@16 72 if(! result)
Chris@16 73 boost::serialization::throw_exception(
Chris@16 74 xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
Chris@16 75 );
Chris@16 76 #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
Chris@16 77 if(NULL != s.data())
Chris@16 78 #endif
Chris@16 79 s.resize(0);
Chris@16 80 s.reserve(ws.size());
Chris@16 81 std::copy(
Chris@16 82 iterators::mb_from_wchar<std::wstring::iterator>(
Chris@16 83 BOOST_MAKE_PFTO_WRAPPER(ws.begin())
Chris@16 84 ),
Chris@16 85 iterators::mb_from_wchar<std::wstring::iterator>(
Chris@16 86 BOOST_MAKE_PFTO_WRAPPER(ws.end())
Chris@16 87 ),
Chris@16 88 std::back_inserter(s)
Chris@16 89 );
Chris@16 90 }
Chris@16 91
Chris@16 92 #ifndef BOOST_NO_STD_WSTRING
Chris@16 93 template<class Archive>
Chris@16 94 BOOST_WARCHIVE_DECL(void)
Chris@16 95 xml_wiarchive_impl<Archive>::load(std::wstring & ws){
Chris@16 96 bool result = gimpl->parse_string(is, ws);
Chris@16 97 if(! result)
Chris@16 98 boost::serialization::throw_exception(
Chris@16 99 xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
Chris@16 100 );
Chris@16 101 }
Chris@16 102 #endif
Chris@16 103
Chris@16 104 template<class Archive>
Chris@16 105 BOOST_WARCHIVE_DECL(void)
Chris@16 106 xml_wiarchive_impl<Archive>::load(char * s){
Chris@16 107 std::wstring ws;
Chris@16 108 bool result = gimpl->parse_string(is, ws);
Chris@16 109 if(! result)
Chris@16 110 boost::serialization::throw_exception(
Chris@16 111 xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
Chris@16 112 );
Chris@16 113 copy_to_ptr(s, ws);
Chris@16 114 }
Chris@16 115
Chris@16 116 #ifndef BOOST_NO_INTRINSIC_WCHAR_T
Chris@16 117 template<class Archive>
Chris@16 118 BOOST_WARCHIVE_DECL(void)
Chris@16 119 xml_wiarchive_impl<Archive>::load(wchar_t * ws){
Chris@16 120 std::wstring twstring;
Chris@16 121 bool result = gimpl->parse_string(is, twstring);
Chris@16 122 if(! result)
Chris@16 123 boost::serialization::throw_exception(
Chris@16 124 xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
Chris@16 125 );
Chris@16 126 std::memcpy(ws, twstring.c_str(), twstring.size());
Chris@16 127 ws[twstring.size()] = L'\0';
Chris@16 128 }
Chris@16 129 #endif
Chris@16 130
Chris@16 131 template<class Archive>
Chris@16 132 BOOST_WARCHIVE_DECL(void)
Chris@16 133 xml_wiarchive_impl<Archive>::load_override(class_name_type & t, int){
Chris@16 134 const std::wstring & ws = gimpl->rv.class_name;
Chris@16 135 if(ws.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1)
Chris@16 136 boost::serialization::throw_exception(
Chris@16 137 archive_exception(archive_exception::invalid_class_name)
Chris@16 138 );
Chris@16 139 copy_to_ptr(t, ws);
Chris@16 140 }
Chris@16 141
Chris@16 142 template<class Archive>
Chris@16 143 BOOST_WARCHIVE_DECL(void)
Chris@16 144 xml_wiarchive_impl<Archive>::init(){
Chris@16 145 gimpl->init(is);
Chris@16 146 this->set_library_version(
Chris@16 147 library_version_type(gimpl->rv.version)
Chris@16 148 );
Chris@16 149 }
Chris@16 150
Chris@16 151 template<class Archive>
Chris@16 152 BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
Chris@16 153 xml_wiarchive_impl<Archive>::xml_wiarchive_impl(
Chris@16 154 std::wistream &is_,
Chris@16 155 unsigned int flags
Chris@16 156 ) :
Chris@16 157 basic_text_iprimitive<std::wistream>(
Chris@16 158 is_,
Chris@16 159 true // don't change the codecvt - use the one below
Chris@16 160 ),
Chris@16 161 basic_xml_iarchive<Archive>(flags),
Chris@16 162 gimpl(new xml_wgrammar())
Chris@16 163 {
Chris@16 164 if(0 == (flags & no_codecvt)){
Chris@101 165 // note usage of argument "1" so that the locale isn't
Chris@101 166 // automatically delete the facet
Chris@16 167 archive_locale.reset(
Chris@16 168 add_facet(
Chris@101 169 is_.getloc(),
Chris@16 170 new boost::archive::detail::utf8_codecvt_facet
Chris@16 171 )
Chris@16 172 );
Chris@101 173 //is.imbue(* archive_locale);
Chris@16 174 }
Chris@101 175 if(0 == (flags & no_header))
Chris@101 176 init();
Chris@16 177 }
Chris@16 178
Chris@16 179 template<class Archive>
Chris@16 180 BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
Chris@16 181 xml_wiarchive_impl<Archive>::~xml_wiarchive_impl(){
Chris@16 182 if(0 == (this->get_flags() & no_header)){
Chris@16 183 BOOST_TRY{
Chris@16 184 gimpl->windup(is);
Chris@16 185 }
Chris@16 186 BOOST_CATCH(...){}
Chris@16 187 BOOST_CATCH_END
Chris@16 188 }
Chris@16 189 }
Chris@16 190
Chris@16 191 } // namespace archive
Chris@16 192 } // namespace boost
Chris@16 193
Chris@16 194 #endif // BOOST_NO_STD_WSTREAMBUF