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

Revision 857, 5.0 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_HPP_INCLUDED
8#define BOOST_IOSTREAMS_STREAM_HPP_INCLUDED
9
10#if defined(_MSC_VER) && (_MSC_VER >= 1020)
11# pragma once
12#endif
13
14#include <boost/iostreams/constants.hpp>
15#include <boost/iostreams/detail/char_traits.hpp>
16#include <boost/iostreams/detail/config/overload_resolution.hpp>
17#include <boost/iostreams/detail/forward.hpp>
18#include <boost/iostreams/detail/iostream.hpp>  // standard streams.
19#include <boost/iostreams/detail/select.hpp>
20#include <boost/iostreams/stream_buffer.hpp>
21#include <boost/mpl/and.hpp>
22#include <boost/type_traits/is_convertible.hpp>
23
24namespace boost { namespace iostreams { namespace detail {
25
26template<typename Device, typename Tr>
27struct stream_traits {
28    typedef typename char_type_of<Device>::type                char_type;
29    typedef Tr                                                 traits_type;
30    typedef typename category_of<Device>::type                 mode;
31    typedef typename
32            iostreams::select< // Dismbiguation required for Tru64.
33                mpl::and_<
34                    is_convertible<mode, input>,
35                    is_convertible<mode, output>
36                >,
37                BOOST_IOSTREAMS_BASIC_IOSTREAM(char_type, traits_type),
38                is_convertible<mode, input>,
39                BOOST_IOSTREAMS_BASIC_ISTREAM(char_type, traits_type),
40                else_,
41                BOOST_IOSTREAMS_BASIC_OSTREAM(char_type, traits_type)
42            >::type type;
43};
44
45// By encapsulating initialization in a base, we can define the macro
46// BOOST_IOSTREAMS_DEFINE_FORWARDING_FUNCTIONS to generate constuctors
47// without base member initializer lists.
48template< typename Device,
49          typename Tr =
50              BOOST_IOSTREAMS_CHAR_TRAITS(
51                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
52              ),
53          typename Alloc =
54              std::allocator<
55                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
56              >,
57          typename Base = // VC6 Workaround.
58              BOOST_DEDUCED_TYPENAME
59              detail::stream_traits<Device, Tr>::type >
60class stream_base
61    : protected base_from_member< stream_buffer<Device, Tr, Alloc> >,
62      public Base
63{
64private:
65    typedef base_from_member< stream_buffer<Device, Tr, Alloc> > pbase_type;
66    typedef typename stream_traits<Device, Tr>::type         stream_type;
67protected:
68    using pbase_type::member; // Avoid warning about 'this' in initializer list.
69public:
70    stream_base() : pbase_type(), stream_type(&member) { }
71};
72
73} } } // End namespaces detail, iostreams, boost.
74
75#ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
76# include <boost/iostreams/detail/broken_overload_resolution/stream.hpp>
77#else
78
79namespace boost { namespace iostreams {
80
81//
82// Template name: stream.
83// Description: A iostream which reads from and writes to an instance of a
84//      designated device type.
85// Template paramters:
86//      Device - A device type.
87//      Alloc - The allocator type.
88//
89template< typename Device,
90          typename Tr =
91              BOOST_IOSTREAMS_CHAR_TRAITS(
92                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
93              ),
94          typename Alloc =
95              std::allocator<
96                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
97              > >
98struct stream : detail::stream_base<Device, Tr, Alloc> {
99public:
100    typedef typename char_type_of<Device>::type  char_type;
101    BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
102private:
103    typedef typename
104            detail::stream_traits<
105                Device, Tr
106            >::type                              stream_type;
107    typedef Device                               policy_type;
108public:
109    stream() { }
110    BOOST_IOSTREAMS_FORWARD( stream, open_impl, Device,
111                             BOOST_IOSTREAMS_PUSH_PARAMS,
112                             BOOST_IOSTREAMS_PUSH_ARGS )
113    bool is_open() const { return this->member.is_open(); }
114    void close() { this->member.close(); }
115    bool auto_close() const { return this->member.auto_close(); }
116    void set_auto_close(bool close) { this->member.set_auto_close(close); }
117    bool strict_sync() { return this->member.strict_sync(); }
118    Device& operator*() { return *this->member; }
119    Device* operator->() { return &*this->member; }
120    Device* component() { return this->member.component(); }
121private:
122    void open_impl(const Device& dev BOOST_IOSTREAMS_PUSH_PARAMS()) // For forwarding.
123    {
124        this->clear();
125        this->member.open(dev BOOST_IOSTREAMS_PUSH_ARGS());
126    }
127};
128
129} } // End namespaces iostreams, boost.
130
131#endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
132
133#endif // #ifndef BOOST_IOSTREAMS_stream_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.