xml_oarchive_impl.ipp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  2. // xml_oarchive_impl.ipp:
  3. // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #include <ostream>
  8. #include <iomanip>
  9. #include <algorithm>
  10. #include <string>
  11. #include <cstring> // strlen
  12. #include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings
  13. #if defined(BOOST_NO_STDC_NAMESPACE)
  14. namespace std{
  15. using ::strlen;
  16. } // namespace std
  17. #endif
  18. #include <boost/archive/iterators/xml_escape.hpp>
  19. #include <boost/archive/iterators/ostream_iterator.hpp>
  20. #ifndef BOOST_NO_CWCHAR
  21. #include <boost/archive/wcslen.hpp>
  22. #include <boost/archive/iterators/mb_from_wchar.hpp>
  23. #endif
  24. namespace boost {
  25. namespace archive {
  26. /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  27. // implemenations of functions specific to char archives
  28. // wide char stuff used by char archives
  29. #ifndef BOOST_NO_CWCHAR
  30. // copy chars to output escaping to xml and translating wide chars to mb chars
  31. template<class InputIterator>
  32. void save_iterator(std::ostream &os, InputIterator begin, InputIterator end){
  33. typedef boost::archive::iterators::mb_from_wchar<
  34. boost::archive::iterators::xml_escape<InputIterator>
  35. > translator;
  36. std::copy(
  37. translator(BOOST_MAKE_PFTO_WRAPPER(begin)),
  38. translator(BOOST_MAKE_PFTO_WRAPPER(end)),
  39. boost::archive::iterators::ostream_iterator<char>(os)
  40. );
  41. }
  42. #ifndef BOOST_NO_STD_WSTRING
  43. template<class Archive>
  44. BOOST_ARCHIVE_DECL(void)
  45. xml_oarchive_impl<Archive>::save(const std::wstring & ws){
  46. // at least one library doesn't typedef value_type for strings
  47. // so rather than using string directly make a pointer iterator out of it
  48. // save_iterator(os, ws.data(), ws.data() + std::wcslen(ws.data()));
  49. save_iterator(os, ws.data(), ws.data() + ws.size());
  50. }
  51. #endif
  52. #ifndef BOOST_NO_INTRINSIC_WCHAR_T
  53. template<class Archive>
  54. BOOST_ARCHIVE_DECL(void)
  55. xml_oarchive_impl<Archive>::save(const wchar_t * ws){
  56. save_iterator(os, ws, ws + std::wcslen(ws));
  57. }
  58. #endif
  59. #endif // BOOST_NO_CWCHAR
  60. template<class Archive>
  61. BOOST_ARCHIVE_DECL(void)
  62. xml_oarchive_impl<Archive>::save(const std::string & s){
  63. // at least one library doesn't typedef value_type for strings
  64. // so rather than using string directly make a pointer iterator out of it
  65. typedef boost::archive::iterators::xml_escape<
  66. const char *
  67. > xml_escape_translator;
  68. std::copy(
  69. xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data())),
  70. xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data()+ s.size())),
  71. boost::archive::iterators::ostream_iterator<char>(os)
  72. );
  73. }
  74. template<class Archive>
  75. BOOST_ARCHIVE_DECL(void)
  76. xml_oarchive_impl<Archive>::save(const char * s){
  77. typedef boost::archive::iterators::xml_escape<
  78. const char *
  79. > xml_escape_translator;
  80. std::copy(
  81. xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s)),
  82. xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s + std::strlen(s))),
  83. boost::archive::iterators::ostream_iterator<char>(os)
  84. );
  85. }
  86. template<class Archive>
  87. BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
  88. xml_oarchive_impl<Archive>::xml_oarchive_impl(
  89. std::ostream & os_,
  90. unsigned int flags
  91. ) :
  92. basic_text_oprimitive<std::ostream>(
  93. os_,
  94. 0 != (flags & no_codecvt)
  95. ),
  96. basic_xml_oarchive<Archive>(flags)
  97. {
  98. if(0 == (flags & no_header))
  99. this->init();
  100. }
  101. } // namespace archive
  102. } // namespace boost