Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // xml_oarchive_impl.ipp: Chris@16: Chris@16: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #include Chris@16: #include Chris@101: #include // std::copy Chris@16: #include Chris@16: Chris@16: #include // strlen Chris@16: #include // msvc 6.0 needs this to suppress warnings Chris@16: #if defined(BOOST_NO_STDC_NAMESPACE) Chris@16: namespace std{ Chris@16: using ::strlen; Chris@16: } // namespace std Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifndef BOOST_NO_CWCHAR Chris@16: #include Chris@16: #include Chris@16: #endif Chris@16: Chris@16: namespace boost { Chris@16: namespace archive { Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // implemenations of functions specific to char archives Chris@16: Chris@16: // wide char stuff used by char archives Chris@16: #ifndef BOOST_NO_CWCHAR Chris@16: // copy chars to output escaping to xml and translating wide chars to mb chars Chris@16: template Chris@16: void save_iterator(std::ostream &os, InputIterator begin, InputIterator end){ Chris@16: typedef boost::archive::iterators::mb_from_wchar< Chris@16: boost::archive::iterators::xml_escape Chris@16: > translator; Chris@16: std::copy( Chris@16: translator(BOOST_MAKE_PFTO_WRAPPER(begin)), Chris@16: translator(BOOST_MAKE_PFTO_WRAPPER(end)), Chris@16: boost::archive::iterators::ostream_iterator(os) Chris@16: ); Chris@16: } Chris@16: Chris@16: #ifndef BOOST_NO_STD_WSTRING Chris@16: template Chris@16: BOOST_ARCHIVE_DECL(void) Chris@16: xml_oarchive_impl::save(const std::wstring & ws){ Chris@16: // at least one library doesn't typedef value_type for strings Chris@16: // so rather than using string directly make a pointer iterator out of it Chris@16: // save_iterator(os, ws.data(), ws.data() + std::wcslen(ws.data())); Chris@16: save_iterator(os, ws.data(), ws.data() + ws.size()); Chris@16: } Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_NO_INTRINSIC_WCHAR_T Chris@16: template Chris@16: BOOST_ARCHIVE_DECL(void) Chris@16: xml_oarchive_impl::save(const wchar_t * ws){ Chris@16: save_iterator(os, ws, ws + std::wcslen(ws)); Chris@16: } Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_NO_CWCHAR Chris@16: Chris@16: template Chris@16: BOOST_ARCHIVE_DECL(void) Chris@16: xml_oarchive_impl::save(const std::string & s){ Chris@16: // at least one library doesn't typedef value_type for strings Chris@16: // so rather than using string directly make a pointer iterator out of it Chris@16: typedef boost::archive::iterators::xml_escape< Chris@16: const char * Chris@16: > xml_escape_translator; Chris@16: std::copy( Chris@16: xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data())), Chris@16: xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data()+ s.size())), Chris@16: boost::archive::iterators::ostream_iterator(os) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: BOOST_ARCHIVE_DECL(void) Chris@16: xml_oarchive_impl::save(const char * s){ Chris@16: typedef boost::archive::iterators::xml_escape< Chris@16: const char * Chris@16: > xml_escape_translator; Chris@16: std::copy( Chris@16: xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s)), Chris@16: xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s + std::strlen(s))), Chris@16: boost::archive::iterators::ostream_iterator(os) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) Chris@16: xml_oarchive_impl::xml_oarchive_impl( Chris@16: std::ostream & os_, Chris@16: unsigned int flags Chris@16: ) : Chris@16: basic_text_oprimitive( Chris@16: os_, Chris@16: 0 != (flags & no_codecvt) Chris@16: ), Chris@16: basic_xml_oarchive(flags) Chris@16: { Chris@16: if(0 == (flags & no_header)) Chris@16: this->init(); Chris@16: } Chris@16: Chris@16: } // namespace archive Chris@16: } // namespace boost