// D import file generated from '../../../../libphobos/libdruntime/core/sys/posix/sys/select.d'
module core.sys.posix.sys.select;
private import core.sys.posix.config;

public import core.stdc.time;

public import core.sys.posix.sys.time;

public import core.sys.posix.sys.types;

public import core.sys.posix.signal;

version (unittest)
{
	import core.stdc.stdio : printf;
}
version (Posix)
{
	extern (C) 
	{
		version (linux)
		{
			private 
			{
				alias c_long __fd_mask;
				enum uint __NFDBITS = 8 * __fd_mask.sizeof;
				extern (D) auto __FDELT(int d)
				{
					return d / __NFDBITS;
				}


				extern (D) auto __FDMASK(int d)
				{
					return cast(__fd_mask)1 << d % __NFDBITS;
				}


			}
			enum FD_SETSIZE = 1024;
			struct fd_set
			{
				__fd_mask[FD_SETSIZE / __NFDBITS] fds_bits;
			}
			extern (D) void FD_CLR(int fd, fd_set* fdset);

			extern (D) bool FD_ISSET(int fd, const(fd_set)* fdset);

			extern (D) void FD_SET(int fd, fd_set* fdset);

			extern (D) void FD_ZERO(fd_set* fdset);

			int pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
			int select(int, fd_set*, fd_set*, fd_set*, timeval*);
		}
		else
		{
			version (OSX)
			{
				private 
				{
					enum uint __DARWIN_NBBY = 8;
					enum uint __DARWIN_NFDBITS = (int).sizeof * __DARWIN_NBBY;
				}
				enum FD_SETSIZE = 1024;
				struct fd_set
				{
					int[(FD_SETSIZE + (__DARWIN_NFDBITS - 1)) / __DARWIN_NFDBITS] fds_bits;
				}
				extern (D) void FD_CLR(int fd, fd_set* fdset);

				extern (D) bool FD_ISSET(int fd, const(fd_set)* fdset);

				extern (D) void FD_SET(int fd, fd_set* fdset);

				extern (D) void FD_ZERO(fd_set* fdset);

				int pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
				int select(int, fd_set*, fd_set*, fd_set*, timeval*);
			}
			else
			{
				version (FreeBSD)
				{
					private 
					{
						alias c_ulong __fd_mask;
						enum _NFDBITS = __fd_mask.sizeof * 8;
					}
					enum uint FD_SETSIZE = 1024;
					struct fd_set
					{
						__fd_mask[(FD_SETSIZE + (_NFDBITS - 1)) / _NFDBITS] __fds_bits;
					}
					extern (D) __fd_mask __fdset_mask(uint n);

					extern (D) void FD_CLR(int n, fd_set* p);

					extern (D) bool FD_ISSET(int n, const(fd_set)* p);

					extern (D) void FD_SET(int n, fd_set* p);

					extern (D) void FD_ZERO(fd_set* p);

					int pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
					int select(int, fd_set*, fd_set*, fd_set*, timeval*);
				}
				else
				{
					version (Solaris)
					{
						private 
						{
							alias c_long fds_mask;
							enum _NBBY = 8;
							enum FD_NFDBITS = fds_mask.sizeof * _NBBY;
						}
						version (D_LP64)
						{
							enum uint FD_SETSIZE = 65536;
						}
						else
						{
							enum uint FD_SETSIZE = 1024;
						}
						struct fd_set
						{
							c_long[(FD_SETSIZE + (FD_NFDBITS - 1)) / FD_NFDBITS] fds_bits;
						}
						extern (D) void FD_SET(int __n, fd_set* __p);

						extern (D) void FD_CLR(int __n, fd_set* __p);

						extern (D) bool FD_ISSET(int __n, const(fd_set)* __p);

						extern (D) void FD_ZERO(fd_set* __p);

						int select(int, fd_set*, fd_set*, fd_set*, timeval*);
						int pselect(int, fd_set*, fd_set*, fd_set*, in timespec*, in sigset_t*);
					}
					else
					{
						static assert(false,"Unsupported platform");
					}
				}
			}
		}
	}
}
