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 void 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;
00044 if (fd_set_.fd_count < win_fd_set_size)
00045 fd_set_.fd_array[fd_set_.fd_count++] = descriptor;
00046 }
00047
00048 bool is_set(socket_type descriptor) const
00049 {
00050 return !!__WSAFDIsSet(descriptor,
00051 const_cast<fd_set*>(reinterpret_cast<const fd_set*>(&fd_set_)));
00052 }
00053
00054 operator fd_set*()
00055 {
00056 return reinterpret_cast<fd_set*>(&fd_set_);
00057 }
00058
00059 socket_type max_descriptor() const
00060 {
00061 return max_descriptor_;
00062 }
00063
00064 private:
00065
00066
00067 struct win_fd_set
00068 {
00069 u_int fd_count;
00070 SOCKET fd_array[win_fd_set_size];
00071 };
00072
00073 win_fd_set fd_set_;
00074 socket_type max_descriptor_;
00075 };
00076
00077 }
00078 }
00079
00080 #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
00081
00082 #include "asio/detail/pop_options.hpp"
00083
00084 #endif // ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP