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