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

Revision 857, 6.2 KB checked in by igarcia, 19 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_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_HPP_INCLUDED
8#define BOOST_IOSTREAMS_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_HPP_INCLUDED
9
10#include <boost/iostreams/detail/broken_overload_resolution/forward.hpp>
11
12namespace boost { namespace iostreams {
13
14template< typename Device,
15          typename Tr =
16              BOOST_IOSTREAMS_CHAR_TRAITS(
17                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
18              ),
19          typename Alloc =
20              std::allocator<
21                  BOOST_DEDUCED_TYPENAME char_type_of<Device>::type
22              > >
23struct stream : detail::stream_base<Device, Tr, Alloc> {
24public:
25    typedef typename char_type_of<Device>::type  char_type;
26    BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
27private:
28    typedef typename
29            detail::stream_traits<
30                Device, Tr
31            >::type                              stream_type;
32    typedef Device                               policy_type;
33public:
34    stream() { }
35    template<typename U0>
36    stream(const U0& u0)
37    {
38        open_impl(detail::forward<Device, U0>(), u0);
39    }
40    template<typename U0, typename U1>
41    stream(const U0& u0, const U1& u1)
42    {
43        open_impl(detail::forward<Device, U0>(), u0, u1);
44    }
45    template<typename U0, typename U1, typename U2>
46    stream(const U0& u0, const U1& u1, const U2& u2)
47    {
48        open_impl(detail::forward<Device, U0>(), u0, u1, u2);
49    }
50#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
51    template<typename U0>
52    stream(U0& u0)
53    {
54        open_impl(detail::forward<Device, U0>(), u0);
55    }
56    template<typename U0, typename U1>
57    stream(U0& u0, const U1& u1)
58    {
59        open_impl(detail::forward<Device, U0>(), u0, u1);
60    }
61    template<typename U0, typename U1, typename U2>
62    stream(U0& u0, const U1& u1, const U2& u2)
63    {
64        open_impl(detail::forward<Device, U0>(), u0, u1, u2);
65    }
66#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
67    template<typename U0>
68    void open(const U0& u0)
69    {
70        open_impl(detail::forward<Device, U0>(), u0);
71    }
72    template<typename U0, typename U1>
73    void open(const U0& u0, const U1& u1)
74    {
75        open_impl(detail::forward<Device, U0>(), u0, u1);
76    }
77    template<typename U0, typename U1, typename U2>
78    void open(const U0& u0, const U1& u1, const U2& u2)
79    {
80        open_impl(detail::forward<Device, U0>(), u0, u1, u2);
81    }
82#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
83    template<typename U0>
84    void open(U0& u0)
85    {
86        open_impl(detail::forward<Device, U0>(), u0);
87    }
88    template<typename U0, typename U1>
89    void open(U0& u0, const U1& u1)
90    {
91        open_impl(detail::forward<Device, U0>(), u0, u1);
92    }
93    template<typename U0, typename U1, typename U2>
94    void open(U0& u0, const U1& u1, const U2& u2)
95    {
96        open_impl(detail::forward<Device, U0>(), u0, u1, u2);
97    }
98#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
99    bool is_open() const { return this->member.is_open(); }
100    void close() { this->member.close(); }
101    bool auto_close() const { return this->member.auto_close(); }
102    void set_auto_close(bool close) { this->member.set_auto_close(close); }
103    bool strict_sync() { return this->member.strict_sync(); }
104    Device& operator*() { return *this->member; }
105    Device* operator->() { return &*this->member; }
106private:
107    template<typename U0>
108    void open_impl(mpl::false_, const U0& u0)
109    {
110        this->clear();
111        this->member.open(u0);
112    }
113#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
114    template<typename U0>
115    void open_impl(mpl::false_, U0& u0)
116    {
117        this->clear();
118        this->member.open(detail::wrap(u0));
119    }
120#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
121    template<typename U0>
122    void open_impl(mpl::true_, const U0& u0)
123    {
124        this->clear();
125        this->member.open(Device(const_cast<U0&>(u0)));
126    }
127#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
128    template<typename U0>
129    void open_impl(mpl::true_, U0& u0)
130    {
131        this->clear();
132        this->member.open(Device(u0));
133    }
134#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
135    template<typename U0, typename U1>
136    void open_impl(mpl::false_, const U0& u0, const U1& u1)
137    {
138        this->clear();
139        this->member.open(u0, u1);
140    }
141    template<typename U0, typename U1>
142    void open_impl(mpl::true_, const U0& u0, const U1& u1)
143    {
144        this->clear();
145        this->member.open(Device(const_cast<U0&>(u0), u1));
146    }
147#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
148    template<typename U0, typename U1>
149    void open_impl(mpl::true_, U0& u0, const U1& u1)
150    {
151        this->clear();
152        this->member.open(Device(u0, u1));
153    }
154#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
155    template<typename U0, typename U1, typename U2>
156    void open_impl(mpl::false_, const U0& u0, const U1& u1, const U2& u2)
157    {
158        this->clear();
159        this->member.open(u0, u1, u2);
160    }
161    template<typename U0, typename U1, typename U2>
162    void open_impl(mpl::true_, const U0& u0, const U1& u1, const U2& u2)
163    {
164        this->clear();
165        this->member.open(Device(const_cast<U0&>(u0), u1, u2));
166    }
167#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
168    template<typename U0, typename U1, typename U2>
169    void open_impl(mpl::true_, U0& u0, const U1& u1, const U2& u2)
170    {
171        this->clear();
172        this->member.open(Device(u0, u1, u2));
173    }
174#endif
175};
176
177} } // End namespaces iostreams, boost.
178
179#endif BOOST_IOSTREAMS_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.