Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP
00012 #define ASIO_DETAIL_WIN_FD_SET_ADAPTER_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/socket_types.hpp"
00021
00022 #if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
00023
00024 namespace asio {
00025 namespace detail {
00026
00027
00028 class win_fd_set_adapter
00029 {
00030 public:
00031 enum { win_fd_set_size = 1024 };
00032
00033 win_fd_set_adapter()
00034 : max_descriptor_(invalid_socket)
00035 {
00036 fd_set_.fd_count = 0;
00037 }
00038
00039 bool set(socket_type descriptor)
00040 {
00041 for (u_int i = 0; i < fd_set_.fd_count; ++i)
00042 if (fd_set_.fd_array[i] == descriptor)
00043 return true;
00044 if (fd_set_.fd_count < win_fd_set_size)
00045 {
00046 fd_set_.fd_array[fd_set_.fd_count++] = descriptor;
00047 return true;
00048 }
00049 return false;
00050 }
00051
00052 bool is_set(socket_type descriptor) const
00053 {
00054 return !!__WSAFDIsSet(descriptor,
00055 const_cast<fd_set*>(reinterpret_cast<const fd_set*>(&fd_set_)));
00056 }
00057
00058 operator fd_set*()
00059 {
00060 return reinterpret_cast<fd_set*>(&fd_set_);
00061 }
00062
00063 socket_type max_descriptor() const
00064 {
00065 return max_descriptor_;
00066 }
00067
00068 private:
00069
00070
00071 struct win_fd_set
00072 {
00073 u_int fd_count;
00074 SOCKET fd_array[win_fd_set_size];
00075 };
00076
00077 win_fd_set fd_set_;
00078 socket_type max_descriptor_;
00079 };
00080
00081 }
00082 }
00083
00084 #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
00085
00086 #include "asio/detail/pop_options.hpp"
00087
00088 #endif // ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP