~ubuntu-branches/debian/sid/boost1.49/sid

« back to all changes in this revision

Viewing changes to boost/iostreams/detail/adapter/non_blocking_adapter.hpp

  • Committer: Package Import Robot
  • Author(s): Steve M. Robbins
  • Date: 2012-02-26 00:31:44 UTC
  • Revision ID: package-import@ubuntu.com-20120226003144-eaytp12cbf6ubpms
Tags: upstream-1.49.0
ImportĀ upstreamĀ versionĀ 1.49.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
 
2
// (C) Copyright 2005-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_NON_BLOCKING_ADAPTER_HPP_INCLUDED
 
9
#define BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
 
10
 
 
11
#include <boost/iostreams/detail/ios.hpp>  // streamsize, seekdir, openmode.
 
12
#include <boost/iostreams/read.hpp>
 
13
#include <boost/iostreams/seek.hpp>
 
14
#include <boost/iostreams/traits.hpp>
 
15
#include <boost/iostreams/write.hpp>
 
16
 
 
17
namespace boost { namespace iostreams {
 
18
 
 
19
template<typename Device>
 
20
class non_blocking_adapter {
 
21
public:
 
22
    typedef typename char_type_of<Device>::type char_type;
 
23
    struct category
 
24
        : mode_of<Device>::type, device_tag
 
25
        { };
 
26
    explicit non_blocking_adapter(Device& dev) : device_(dev) { }
 
27
    std::streamsize read(char_type* s, std::streamsize n)
 
28
    { 
 
29
        std::streamsize result = 0;
 
30
        while (result < n) {
 
31
            std::streamsize amt = iostreams::read(device_, s, n);
 
32
            if (amt == -1)
 
33
                break;
 
34
            result += amt;
 
35
        }
 
36
        return result != 0 ? result : -1;
 
37
    }
 
38
    std::streamsize write(const char_type* s, std::streamsize n)
 
39
    { 
 
40
        std::streamsize result = 0;
 
41
        while (result < n) {
 
42
            std::streamsize amt = 
 
43
                iostreams::write(device_, s + result, n - result);
 
44
            result += amt;
 
45
        }
 
46
        return result;    
 
47
    }
 
48
    std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
 
49
                         BOOST_IOS::openmode which = 
 
50
                             BOOST_IOS::in | BOOST_IOS::out )
 
51
    { return iostreams::seek(device_, off, way, which); }
 
52
public:
 
53
    non_blocking_adapter& operator=(const non_blocking_adapter&);
 
54
    Device& device_;
 
55
};
 
56
 
 
57
} } // End namespace iostreams.
 
58
 
 
59
#endif // #ifndef BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED