basic_text_oprimitive.ipp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
  2. // basic_text_oprimitive.ipp:
  3. // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
  4. // Use, modification and distribution is subject to the Boost Software
  5. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. // See http://www.boost.org for updates, documentation, and revision history.
  8. #include <cstddef> // NULL
  9. #include <boost/serialization/pfto.hpp>
  10. #include <boost/archive/basic_text_oprimitive.hpp>
  11. #include <boost/archive/codecvt_null.hpp>
  12. #include <boost/archive/add_facet.hpp>
  13. #include <boost/archive/iterators/base64_from_binary.hpp>
  14. #include <boost/archive/iterators/insert_linebreaks.hpp>
  15. #include <boost/archive/iterators/transform_width.hpp>
  16. #include <boost/archive/iterators/ostream_iterator.hpp>
  17. namespace boost {
  18. namespace archive {
  19. // translate to base64 and copy in to buffer.
  20. template<class OStream>
  21. BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
  22. basic_text_oprimitive<OStream>::save_binary(
  23. const void *address,
  24. std::size_t count
  25. ){
  26. typedef BOOST_DEDUCED_TYPENAME OStream::char_type CharType;
  27. if(0 == count)
  28. return;
  29. if(os.fail())
  30. boost::serialization::throw_exception(
  31. archive_exception(archive_exception::output_stream_error)
  32. );
  33. os.put('\n');
  34. typedef
  35. boost::archive::iterators::insert_linebreaks<
  36. boost::archive::iterators::base64_from_binary<
  37. boost::archive::iterators::transform_width<
  38. const char *,
  39. 6,
  40. 8
  41. >
  42. >
  43. ,76
  44. ,const char // cwpro8 needs this
  45. >
  46. base64_text;
  47. boost::archive::iterators::ostream_iterator<CharType> oi(os);
  48. std::copy(
  49. base64_text(BOOST_MAKE_PFTO_WRAPPER(static_cast<const char *>(address))),
  50. base64_text(
  51. BOOST_MAKE_PFTO_WRAPPER(static_cast<const char *>(address) + count)
  52. ),
  53. oi
  54. );
  55. std::size_t tail = count % 3;
  56. if(tail > 0){
  57. *oi++ = '=';
  58. if(tail < 2)
  59. *oi = '=';
  60. }
  61. }
  62. template<class OStream>
  63. BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
  64. basic_text_oprimitive<OStream>::basic_text_oprimitive(
  65. OStream & os_,
  66. bool no_codecvt
  67. ) :
  68. #ifndef BOOST_NO_STD_LOCALE
  69. os(os_),
  70. flags_saver(os_),
  71. precision_saver(os_),
  72. archive_locale(NULL),
  73. locale_saver(* os_.rdbuf())
  74. {
  75. if(! no_codecvt){
  76. archive_locale.reset(
  77. add_facet(
  78. std::locale::classic(),
  79. new codecvt_null<BOOST_DEDUCED_TYPENAME OStream::char_type>
  80. )
  81. );
  82. os.imbue(* archive_locale);
  83. }
  84. os << std::noboolalpha;
  85. }
  86. #else
  87. os(os_),
  88. flags_saver(os_),
  89. precision_saver(os_)
  90. {}
  91. #endif
  92. template<class OStream>
  93. BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
  94. basic_text_oprimitive<OStream>::~basic_text_oprimitive(){
  95. os << std::endl;
  96. }
  97. } //namespace boost
  98. } //namespace archive