Home | History | Annotate | Download | only in detail
      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.
     30   non_blocking_io()
     31     : value_(0)
     32   {
     33   }
     34 
     35   // Construct with a specific command value.
     36   non_blocking_io(bool value)
     37     : value_(value ? 1 : 0)
     38   {
     39   }
     40 
     41   // Get the name of the IO control command.
     42   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.
     48   void set(bool value)
     49   {
     50     value_ = value ? 1 : 0;
     51   }
     52 
     53   // Get the current value of the I/O control command.
     54   bool get() const
     55   {
     56     return value_ != 0;
     57   }
     58 
     59   // Get the address of the command data.
     60   detail::ioctl_arg_type* data()
     61   {
     62     return &value_;
     63   }
     64 
     65   // Get the address of the command data.
     66   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.
     80   bytes_readable()
     81     : value_(0)
     82   {
     83   }
     84 
     85   // Construct with a specific command 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.
     92   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.
     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.
    104   std::size_t get() const
    105   {
    106     return static_cast<std::size_t>(value_);
    107   }
    108 
    109   // Get the address of the command data.
    110   detail::ioctl_arg_type* data()
    111   {
    112     return &value_;
    113   }
    114 
    115   // Get the address of the command data.
    116   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