1 //
2 // detail/io_control.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 #ifndef ASIO_DETAIL_IO_CONTROL_HPP
12 #define ASIO_DETAIL_IO_CONTROL_HPP
13 
14 
15 #include "asio/detail/config.hpp"
16 #include <cstddef>
17 #include "asio/detail/socket_types.hpp"
18 
19 #include "asio/detail/push_options.hpp"
20 
21 namespace asio {
22 namespace detail {
23 namespace io_control {
24 
25 // IO control command for non-blocking I/O.
26 class non_blocking_io
27 {
28 public:
29   // Default constructor.
non_blocking_io()30   non_blocking_io()
31     : value_(0)
32   {
33   }
34 
35   // Construct with a specific command value.
non_blocking_io(bool value)36   non_blocking_io(bool value)
37     : value_(value ? 1 : 0)
38   {
39   }
40 
41   // Get the name of the IO control command.
name() const42   int name() const
43   {
44     return static_cast<int>(ASIO_OS_DEF(FIONBIO));
45   }
46 
47   // Set the value of the I/O control command.
set(bool value)48   void set(bool value)
49   {
50     value_ = value ? 1 : 0;
51   }
52 
53   // Get the current value of the I/O control command.
get() const54   bool get() const
55   {
56     return value_ != 0;
57   }
58 
59   // Get the address of the command data.
data()60   detail::ioctl_arg_type* data()
61   {
62     return &value_;
63   }
64 
65   // Get the address of the command data.
data() const66   const detail::ioctl_arg_type* data() const
67   {
68     return &value_;
69   }
70 
71 private:
72   detail::ioctl_arg_type value_;
73 };
74 
75 // I/O control command for getting number of bytes available.
76 class bytes_readable
77 {
78 public:
79   // Default constructor.
bytes_readable()80   bytes_readable()
81     : value_(0)
82   {
83   }
84 
85   // Construct with a specific command value.
bytes_readable(std::size_t value)86   bytes_readable(std::size_t value)
87     : value_(static_cast<detail::ioctl_arg_type>(value))
88   {
89   }
90 
91   // Get the name of the IO control command.
name() const92   int name() const
93   {
94     return static_cast<int>(ASIO_OS_DEF(FIONREAD));
95   }
96 
97   // Set the value of the I/O control command.
set(std::size_t value)98   void set(std::size_t value)
99   {
100     value_ = static_cast<detail::ioctl_arg_type>(value);
101   }
102 
103   // Get the current value of the I/O control command.
get() const104   std::size_t get() const
105   {
106     return static_cast<std::size_t>(value_);
107   }
108 
109   // Get the address of the command data.
data()110   detail::ioctl_arg_type* data()
111   {
112     return &value_;
113   }
114 
115   // Get the address of the command data.
data() const116   const detail::ioctl_arg_type* data() const
117   {
118     return &value_;
119   }
120 
121 private:
122   detail::ioctl_arg_type value_;
123 };
124 
125 } // namespace io_control
126 } // namespace detail
127 } // namespace asio
128 
129 #include "asio/detail/pop_options.hpp"
130 
131 #endif // ASIO_DETAIL_IO_CONTROL_HPP
132