source: NonGTP/Boost/boost/iostreams/stream_buffer.hpp @ 857

Revision 857, 3.7 KB checked in by igarcia, 18 years ago (diff)
Line 
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
29namespace boost { namespace iostreams { namespace detail {
30
31template<typename T, typename Tr, typename Alloc, typename Mode>
32struct 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
50namespace boost { namespace iostreams {
51
52template< 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 >
62class stream_buffer
63    : public detail::stream_buffer_traits<T, Tr, Alloc, Mode>::type
64{
65private:
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;
76public:
77    typedef typename char_type_of<T>::type    char_type;
78    BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
79public:
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(); }
93private:
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
Note: See TracBrowser for help on using the repository browser.