source: NonGTP/Boost/boost/iostreams/detail/adapter/non_blocking_adapter.hpp @ 857

Revision 857, 2.0 KB checked in by igarcia, 18 years ago (diff)
Line 
1// (C) Copyright Jonathan Turkanis 2005.
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_NON_BLOCKING_ADAPTER_HPP_INCLUDED
8#define BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
9
10#include <boost/iostreams/detail/ios.hpp>  // streamsize, seekdir, openmode.
11#include <boost/iostreams/read.hpp>
12#include <boost/iostreams/seek.hpp>
13#include <boost/iostreams/traits.hpp>
14#include <boost/iostreams/write.hpp>
15
16namespace boost { namespace iostreams {
17
18template<typename Device>
19class non_blocking_adapter {
20public:
21    typedef typename char_type_of<Device>::type char_type;
22    struct category
23        : mode_of<Device>::type, device_tag
24        { };
25    explicit non_blocking_adapter(Device& dev) : device_(dev) { }
26    std::streamsize read(char_type* s, std::streamsize n)
27    {
28        std::streamsize result = 0;
29        while (result < n) {
30            std::streamsize amt = iostreams::read(device_, s, n);
31            if (amt == -1)
32                break;
33            result += amt;
34        }
35        return result != 0 ? result : -1;
36    }
37    std::streamsize write(const char_type* s, std::streamsize n)
38    {
39        std::streamsize result = 0;
40        while (result < n) {
41            std::streamsize amt =
42                iostreams::write(device_, s + result, n - result);
43            result += amt;
44        }
45        return result;   
46    }
47    std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
48                         BOOST_IOS::openmode which =
49                             BOOST_IOS::in | BOOST_IOS::out )
50    { return iostreams::seek(device_, off, way, which); }
51public:
52    Device& device_;
53};
54
55} } // End namespace iostreams.
56
57#endif // #ifndef BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
Note: See TracBrowser for help on using the repository browser.