1 #ifndef BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
2 #define BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
3 
4 // MS compatible compilers support #pragma once
5 #if defined(_MSC_VER)
6 # pragma once
7 #endif
8 
9 /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
10 // binary_oarchive_impl.hpp
11 
12 // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
13 // Use, modification and distribution is subject to the Boost Software
14 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15 // http://www.boost.org/LICENSE_1_0.txt)
16 
17 //  See http://www.boost.org for updates, documentation, and revision history.
18 
19 #include <ostream>
20 #include <boost/config.hpp>
21 #include <boost/archive/basic_binary_oprimitive.hpp>
22 #include <boost/archive/basic_binary_oarchive.hpp>
23 
24 #ifdef BOOST_MSVC
25 #  pragma warning(push)
26 #  pragma warning(disable : 4511 4512)
27 #endif
28 
29 namespace boost {
30 namespace archive {
31 
32 namespace detail {
33     template<class Archive> class interface_oarchive;
34 } // namespace detail
35 
36 template<class Archive, class Elem, class Tr>
37 class binary_oarchive_impl :
38     public basic_binary_oprimitive<Archive, Elem, Tr>,
39     public basic_binary_oarchive<Archive>
40 {
41 #ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
42 public:
43 #else
44 protected:
45     #if BOOST_WORKAROUND(BOOST_MSVC, < 1500)
46         // for some inexplicable reason insertion of "class" generates compile erro
47         // on msvc 7.1
48         friend detail::interface_oarchive<Archive>;
49         friend basic_binary_oarchive<Archive>;
50         friend save_access;
51     #else
52         friend class detail::interface_oarchive<Archive>;
53         friend class basic_binary_oarchive<Archive>;
54         friend class save_access;
55     #endif
56 #endif
57     template<class T>
save_override(T & t)58     void save_override(T & t){
59         this->basic_binary_oarchive<Archive>::save_override(t);
60     }
init(unsigned int flags)61     void init(unsigned int flags) {
62         if(0 != (flags & no_header))
63             return;
64         #if ! defined(__MWERKS__)
65             this->basic_binary_oarchive<Archive>::init();
66             this->basic_binary_oprimitive<Archive, Elem, Tr>::init();
67         #else
68             basic_binary_oarchive<Archive>::init();
69             basic_binary_oprimitive<Archive, Elem, Tr>::init();
70         #endif
71     }
binary_oarchive_impl(std::basic_streambuf<Elem,Tr> & bsb,unsigned int flags)72     binary_oarchive_impl(
73         std::basic_streambuf<Elem, Tr> & bsb,
74         unsigned int flags
75     ) :
76         basic_binary_oprimitive<Archive, Elem, Tr>(
77             bsb,
78             0 != (flags & no_codecvt)
79         ),
80         basic_binary_oarchive<Archive>(flags)
81     {
82         init(flags);
83     }
binary_oarchive_impl(std::basic_ostream<Elem,Tr> & os,unsigned int flags)84     binary_oarchive_impl(
85         std::basic_ostream<Elem, Tr> & os,
86         unsigned int flags
87     ) :
88         basic_binary_oprimitive<Archive, Elem, Tr>(
89             * os.rdbuf(),
90             0 != (flags & no_codecvt)
91         ),
92         basic_binary_oarchive<Archive>(flags)
93     {
94         init(flags);
95     }
96 };
97 
98 } // namespace archive
99 } // namespace boost
100 
101 #ifdef BOOST_MSVC
102 #pragma warning(pop)
103 #endif
104 
105 #endif // BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
106