]> git.lyx.org Git - lyx.git/blob - boost/boost/iostreams/stream_buffer.hpp
Replace gzstream by boost::iostreams::gzip_(de)compressor: by Bo Peng (ben.bob@gmail...
[lyx.git] / boost / boost / iostreams / stream_buffer.hpp
1 // (C) Copyright Jonathan Turkanis 2003.
2 // Distributed under the Boost Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
4
5 // See http://www.boost.org/libs/iostreams for documentation.
6
7 #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
8 #define BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
9
10 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
11 # pragma once
12 #endif
13
14 #include <memory>            // allocator.
15 #include <boost/config.hpp>  // BOOST_DEDUCED_TYPENAME.
16 #include <boost/iostreams/detail/char_traits.hpp>
17 #include <boost/iostreams/detail/config/overload_resolution.hpp>
18 #include <boost/iostreams/detail/forward.hpp>
19 #include <boost/iostreams/detail/ios.hpp>  // failure, streamsize.
20 #include <boost/iostreams/detail/streambuf/direct_streambuf.hpp>
21 #include <boost/iostreams/detail/streambuf/indirect_streambuf.hpp>
22 #include <boost/iostreams/traits.hpp>
23 #include <boost/static_assert.hpp>
24 #include <boost/type_traits/is_convertible.hpp>
25
26 // Must come last.
27 #include <boost/iostreams/detail/config/disable_warnings.hpp>  // MSVC.
28
29 namespace boost { namespace iostreams { namespace detail {
30
31 template<typename T, typename Tr, typename Alloc, typename Mode>
32 struct stream_buffer_traits {
33     typedef typename
34             mpl::if_<
35                 is_convertible<
36                     BOOST_DEDUCED_TYPENAME category_of<T>::type,
37                     direct_tag
38                 >,
39                 direct_streambuf<T, Tr>,
40                 indirect_streambuf<T, Tr, Alloc, Mode>
41             >::type type;
42 };
43
44 } } } // End namespaces detail, iostreams, boost
45
46 #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
47 # include <boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp>
48 #else
49
50 namespace boost { namespace iostreams {
51
52 template< typename T,
53           typename Tr =
54               BOOST_IOSTREAMS_CHAR_TRAITS(
55                   BOOST_DEDUCED_TYPENAME char_type_of<T>::type
56               ),
57           typename Alloc =
58               std::allocator<
59                   BOOST_DEDUCED_TYPENAME char_type_of<T>::type
60               >,
61           typename Mode = BOOST_DEDUCED_TYPENAME mode_of<T>::type >
62 class stream_buffer
63     : public detail::stream_buffer_traits<T, Tr, Alloc, Mode>::type
64 {
65 private:
66     BOOST_STATIC_ASSERT((
67         is_convertible<
68             BOOST_DEDUCED_TYPENAME iostreams::category_of<T>::type, Mode
69         >::value
70     ));
71     typedef typename
72             detail::stream_buffer_traits<
73                 T, Tr, Alloc, Mode
74             >::type                           base_type;
75     typedef T                                 policy_type;
76 public:
77     typedef typename char_type_of<T>::type    char_type;
78     BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
79 public:
80     stream_buffer() { }
81     ~stream_buffer()
82     { 
83         try { 
84             if (this->is_open() && this->auto_close()) 
85                 this->close(); 
86         } catch (std::exception&) { } 
87     }
88     BOOST_IOSTREAMS_FORWARD( stream_buffer, open_impl, T,
89                              BOOST_IOSTREAMS_PUSH_PARAMS,
90                              BOOST_IOSTREAMS_PUSH_ARGS )
91     T& operator*() { return *this->component(); }
92     T* operator->() { return this->component(); }
93 private:
94     void open_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS())
95         {   // Used for forwarding.
96             if (this->is_open())
97                 BOOST_IOSTREAMS_FAILURE("already open");
98             base_type::open(t BOOST_IOSTREAMS_PUSH_ARGS());
99         }
100 };
101
102 } } // End namespaces iostreams, boost.
103
104 #endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
105
106 #include <boost/iostreams/detail/config/enable_warnings.hpp>  // MSVC.
107
108 #endif // #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED