]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/iostreams/include/boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / iostreams / include / boost / iostreams / detail / broken_overload_resolution / stream_buffer.hpp
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