00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ASIO_BUFFERED_STREAM_HPP
00012 #define ASIO_BUFFERED_STREAM_HPP
00013
00014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00015 # pragma once
00016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
00017
00018 #include "asio/detail/push_options.hpp"
00019
00020 #include "asio/detail/push_options.hpp"
00021 #include <cstddef>
00022 #include <boost/config.hpp>
00023 #include "asio/detail/pop_options.hpp"
00024
00025 #include "asio/buffered_read_stream.hpp"
00026 #include "asio/buffered_write_stream.hpp"
00027 #include "asio/buffered_stream_fwd.hpp"
00028 #include "asio/error.hpp"
00029 #include "asio/io_service.hpp"
00030 #include "asio/detail/noncopyable.hpp"
00031
00032 namespace asio {
00033
00035
00046 template <typename Stream>
00047 class buffered_stream
00048 : private noncopyable
00049 {
00050 public:
00052 typedef typename boost::remove_reference<Stream>::type next_layer_type;
00053
00055 typedef typename next_layer_type::lowest_layer_type lowest_layer_type;
00056
00058 template <typename Arg>
00059 explicit buffered_stream(Arg& a)
00060 : inner_stream_impl_(a),
00061 stream_impl_(inner_stream_impl_)
00062 {
00063 }
00064
00066 template <typename Arg>
00067 explicit buffered_stream(Arg& a, std::size_t read_buffer_size,
00068 std::size_t write_buffer_size)
00069 : inner_stream_impl_(a, write_buffer_size),
00070 stream_impl_(inner_stream_impl_, read_buffer_size)
00071 {
00072 }
00073
00075 next_layer_type& next_layer()
00076 {
00077 return stream_impl_.next_layer().next_layer();
00078 }
00079
00081 lowest_layer_type& lowest_layer()
00082 {
00083 return stream_impl_.lowest_layer();
00084 }
00085
00087 asio::io_service& io_service()
00088 {
00089 return stream_impl_.io_service();
00090 }
00091
00093 void close()
00094 {
00095 stream_impl_.close();
00096 }
00097
00099 asio::error_code close(asio::error_code& ec)
00100 {
00101 return stream_impl_.close(ec);
00102 }
00103
00107 std::size_t flush()
00108 {
00109 return stream_impl_.next_layer().flush();
00110 }
00111
00115 std::size_t flush(asio::error_code& ec)
00116 {
00117 return stream_impl_.next_layer().flush(ec);
00118 }
00119
00121 template <typename WriteHandler>
00122 void async_flush(WriteHandler handler)
00123 {
00124 return stream_impl_.next_layer().async_flush(handler);
00125 }
00126
00129 template <typename ConstBufferSequence>
00130 std::size_t write_some(const ConstBufferSequence& buffers)
00131 {
00132 return stream_impl_.write_some(buffers);
00133 }
00134
00137 template <typename ConstBufferSequence>
00138 std::size_t write_some(const ConstBufferSequence& buffers,
00139 asio::error_code& ec)
00140 {
00141 return stream_impl_.write_some(buffers, ec);
00142 }
00143
00146 template <typename ConstBufferSequence, typename WriteHandler>
00147 void async_write_some(const ConstBufferSequence& buffers,
00148 WriteHandler handler)
00149 {
00150 stream_impl_.async_write_some(buffers, handler);
00151 }
00152
00155 std::size_t fill()
00156 {
00157 return stream_impl_.fill();
00158 }
00159
00162 std::size_t fill(asio::error_code& ec)
00163 {
00164 return stream_impl_.fill(ec);
00165 }
00166
00168 template <typename ReadHandler>
00169 void async_fill(ReadHandler handler)
00170 {
00171 stream_impl_.async_fill(handler);
00172 }
00173
00176 template <typename MutableBufferSequence>
00177 std::size_t read_some(const MutableBufferSequence& buffers)
00178 {
00179 return stream_impl_.read_some(buffers);
00180 }
00181
00184 template <typename MutableBufferSequence>
00185 std::size_t read_some(const MutableBufferSequence& buffers,
00186 asio::error_code& ec)
00187 {
00188 return stream_impl_.read_some(buffers, ec);
00189 }
00190
00193 template <typename MutableBufferSequence, typename ReadHandler>
00194 void async_read_some(const MutableBufferSequence& buffers,
00195 ReadHandler handler)
00196 {
00197 stream_impl_.async_read_some(buffers, handler);
00198 }
00199
00202 template <typename MutableBufferSequence>
00203 std::size_t peek(const MutableBufferSequence& buffers)
00204 {
00205 return stream_impl_.peek(buffers);
00206 }
00207
00210 template <typename MutableBufferSequence>
00211 std::size_t peek(const MutableBufferSequence& buffers,
00212 asio::error_code& ec)
00213 {
00214 return stream_impl_.peek(buffers, ec);
00215 }
00216
00218 std::size_t in_avail()
00219 {
00220 return stream_impl_.in_avail();
00221 }
00222
00224 std::size_t in_avail(asio::error_code& ec)
00225 {
00226 return stream_impl_.in_avail(ec);
00227 }
00228
00229 private:
00230
00231 typedef buffered_write_stream<Stream> write_stream_type;
00232 write_stream_type inner_stream_impl_;
00233
00234
00235 typedef buffered_read_stream<write_stream_type&> read_stream_type;
00236 read_stream_type stream_impl_;
00237 };
00238
00239 }
00240
00241 #include "asio/detail/pop_options.hpp"
00242
00243 #endif // ASIO_BUFFERED_STREAM_HPP