]> https://gitweb.dealii.org/ - dealii.git/blob
d5c7107087e0bcdd10deee80857b74d3aa51e588
[dealii.git] /
1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
2 // (C) Copyright 2003-2007 Jonathan Turkanis
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
5
6 // See http://www.boost.org/libs/iostreams for documentation.
7
8 #ifndef BOOST_IOSTREAMS_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_BUFFER_HPP_INCLUDED
9 #define BOOST_IOSTREAMS_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_BUFFER_HPP_INCLUDED
10
11 #include <boost/iostreams/detail/broken_overload_resolution/forward.hpp>
12 #include <boost/throw_exception.hpp>
13
14 namespace boost { namespace iostreams {
15
16 template< typename T, 
17           typename Tr = 
18               BOOST_IOSTREAMS_CHAR_TRAITS(
19                   BOOST_DEDUCED_TYPENAME char_type_of<T>::type 
20               ),
21           typename Alloc = 
22               std::allocator<
23                   BOOST_DEDUCED_TYPENAME char_type_of<T>::type 
24               >,
25           typename Mode = BOOST_DEDUCED_TYPENAME mode_of<T>::type >
26 class stream_buffer
27     : public detail::stream_buffer_traits<T, Tr, Alloc, Mode>::type
28 {
29 private:
30     BOOST_STATIC_ASSERT((
31         is_convertible<
32             BOOST_DEDUCED_TYPENAME iostreams::category_of<T>::type, Mode
33         >::value
34     ));
35     typedef typename 
36             detail::stream_buffer_traits<
37                 T, Tr, Alloc, Mode
38             >::type                           base_type;
39 public:
40     typedef typename char_type_of<T>::type    char_type;
41     struct category 
42         : Mode,
43           closable_tag,
44           streambuf_tag
45         { };
46     BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
47     stream_buffer() { }
48     ~stream_buffer()
49     { 
50         try { 
51             if (this->is_open() && this->auto_close()) 
52                 this->close(); 
53         } catch (...) { } 
54     }
55     template<typename U0>
56     stream_buffer(const U0& u0)
57     {
58         open_impl(detail::forward<T, U0>(), u0);
59     }
60     template<typename U0, typename U1>
61     stream_buffer(const U0& u0, const U1& u1)
62     {
63         open_impl(detail::forward<T, U0>(), u0, u1);
64     }
65     template<typename U0, typename U1, typename U2>
66     stream_buffer(const U0& u0, const U1& u1, const U2& u2)
67     {
68         open_impl(detail::forward<T, U0>(), u0, u1, u2);
69     }
70 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
71     template<typename U0>
72     stream_buffer(U0& u0)
73     {
74         open_impl(detail::forward<T, U0>(), u0);
75     }
76     template<typename U0, typename U1>
77     stream_buffer(U0& u0, const U1& u1)
78     {
79         open_impl(detail::forward<T, U0>(), u0, u1);
80     }
81     template<typename U0, typename U1, typename U2>
82     stream_buffer(U0& u0, const U1& u1, const U2& u2)
83     {
84         open_impl(detail::forward<T, U0>(), u0, u1, u2);
85     }
86 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
87     template<typename U0>
88     void open(const U0& u0)
89     {
90         open_impl(detail::forward<T, U0>(), u0);
91     }
92     template<typename U0, typename U1>
93     void open(const U0& u0, const U1& u1)
94     {
95         open_impl(detail::forward<T, U0>(), u0, u1);
96     }
97     template<typename U0, typename U1, typename U2>
98     void open(const U0& u0, const U1& u1, const U2& u2)
99     {
100         open_impl(detail::forward<T, U0>(), u0, u1, u2);
101     }
102 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
103     template<typename U0>
104     void open(U0& u0)
105     {
106         open_impl(detail::forward<T, U0>(), u0);
107     }
108     template<typename U0, typename U1>
109     void open(U0& u0, const U1& u1)
110     {
111         open_impl(detail::forward<T, U0>(), u0, u1);
112     }
113     template<typename U0, typename U1, typename U2>
114     void open(U0& u0, const U1& u1, const U2& u2)
115     {
116         open_impl(detail::forward<T, U0>(), u0, u1, u2);
117     }
118 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
119     T& operator*() { return *this->component(); }
120     T* operator->() { return this->component(); }
121 private:
122     template<typename U0>
123     void open_impl(mpl::false_, const U0& u0)
124     {
125         base_type::open(const_cast<U0&>(u0), -1, -1);
126     }
127 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
128     template<typename U0>
129     void open_impl(mpl::false_, U0& u0)
130     {
131         base_type::open(detail::wrap(u0), -1, -1);
132     }
133 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
134     template<typename U0>
135     void open_impl(mpl::true_, const U0& u0)
136     {
137         base_type::open(T(const_cast<U0&>(u0)), -1, -1);
138     }
139 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
140     template<typename U0>
141     void open_impl(mpl::true_, U0& u0)
142     {
143         base_type::open(T(u0), -1, -1);
144     }
145 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
146     template<typename U0, typename U1>
147     void open_impl(mpl::false_, const U0& u0, const U1& u1)
148     {
149         base_type::open(u0, u1, -1);
150     }
151     template<typename U0, typename U1>
152     void open_impl(mpl::true_, const U0& u0, const U1& u1)
153     {
154         base_type::open(T(const_cast<U0&>(u0), u1), -1, -1);
155     }
156 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
157     template<typename U0, typename U1>
158     void open_impl(mpl::true_, U0& u0, const U1& u1)
159     {
160         base_type::open(T(u0, u1), -1, -1);
161     }
162 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
163     template<typename U0, typename U1, typename U2>
164     void open_impl(mpl::false_, const U0& u0, const U1& u1, const U2& u2)
165     {
166         base_type::open(u0, u1, u2);
167     }
168     template<typename U0, typename U1, typename U2>
169     void open_impl(mpl::true_, const U0& u0, const U1& u1, const U2& u2)
170     {
171         base_type::open(T(const_cast<U0&>(u0), u1, u2), -1, -1);
172     }
173 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
174     template<typename U0, typename U1, typename U2>
175     void open_impl(mpl::true_, U0& u0, const U1& u1, const U2& u2)
176     {
177         base_type::open(T(u0, u1, u2), -1, -1);
178     }
179 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------//
180     void check_open()
181     {
182         if (this->is_open()) 
183             boost::throw_exception(BOOST_IOSTREAMS_FAILURE("already open"));
184     }
185 };
186
187 } } // End namespaces iostreams, boost.
188
189 #endif // BOOST_IOSTREAMS_DETAIL_BROKEN_OVERLOAD_RESOLUTION_STREAM_BUFFER_HPP_INCLUDED

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.