1 //
2 // detail/config.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_CONFIG_HPP
12 #define ASIO_DETAIL_CONFIG_HPP
13 
14 # define ASIO_DISABLE_BOOST_ARRAY 1
15 # define ASIO_DISABLE_BOOST_ASSERT 1
16 # define ASIO_DISABLE_BOOST_BIND 1
17 # define ASIO_DISABLE_BOOST_CHRONO 1
18 # define ASIO_DISABLE_BOOST_DATE_TIME 1
19 # define ASIO_DISABLE_BOOST_LIMITS 1
20 # define ASIO_DISABLE_BOOST_REGEX 1
21 # define ASIO_DISABLE_BOOST_STATIC_CONSTANT 1
22 # define ASIO_DISABLE_BOOST_THROW_EXCEPTION 1
23 # define ASIO_DISABLE_BOOST_WORKAROUND 1
24 
25 // Default to a header-only implementation. The user must specifically request
26 // separate compilation by defining either ASIO_SEPARATE_COMPILATION or
27 // ASIO_DYN_LINK (as a DLL/shared library implies separate compilation).
28 
29 # define ASIO_DECL inline
30 
31 // If ASIO_DECL isn't defined yet define it now.
32 #if !defined(ASIO_DECL)
33 # define ASIO_DECL
34 #endif // !defined(ASIO_DECL)
35 
36 // Microsoft Visual C++ detection.
37 
38 // Clang / libc++ detection.
39 # if (__cplusplus >= 201103)
40 #  if __has_include(<__config>)
41 #   include <__config>
42 #   if defined(_LIBCPP_VERSION)
43 #    define ASIO_HAS_CLANG_LIBCXX 1
44 #   endif // defined(_LIBCPP_VERSION)
45 #  endif // __has_include(<__config>)
46 # endif // (__cplusplus >= 201103)
47 
48 // Support move construction and assignment on compilers known to allow it.
49 
50 // If ASIO_MOVE_CAST isn't defined, and move support is available, define
51 // ASIO_MOVE_ARG and ASIO_MOVE_CAST to take advantage of rvalue
52 // references and perfect forwarding.
53 #if defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST)
54 # define ASIO_MOVE_ARG(type) type&&
55 # define ASIO_MOVE_CAST(type) static_cast<type&&>
56 # define ASIO_MOVE_CAST2(type1, type2) static_cast<type1, type2&&>
57 #endif // defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST)
58 
59 // If ASIO_MOVE_CAST still isn't defined, default to a C++03-compatible
60 // implementation. Note that older g++ and MSVC versions don't like it when you
61 // pass a non-member function through a const reference, so for most compilers
62 // we'll play it safe and stick with the old approach of passing the handler by
63 // value.
64 #if !defined(ASIO_MOVE_CAST)
65 # if defined(__GNUC__)
66 #  if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4)
67 #   define ASIO_MOVE_ARG(type) const type&
68 #  else // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4)
69 #   define ASIO_MOVE_ARG(type) type
70 #  endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4)
71 # else
72 #  define ASIO_MOVE_ARG(type) type
73 # endif
74 # define ASIO_MOVE_CAST(type) static_cast<const type&>
75 # define ASIO_MOVE_CAST2(type1, type2) static_cast<const type1, type2&>
76 #endif // !defined(ASIO_MOVE_CAST)
77 
78 // Support variadic templates on compilers known to allow it.
79 
80 // Support constexpr on compilers known to allow it.
81 #if !defined(ASIO_CONSTEXPR)
82 #  define ASIO_CONSTEXPR constexpr
83 #endif // !defined(ASIO_CONSTEXPR)
84 
85 // Standard library support for system errors.
86 
87 // Compliant C++11 compilers put noexcept specifiers on error_category members.
88 #if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT)
89 # if (BOOST_VERSION >= 105300)
90 #  define ASIO_ERROR_CATEGORY_NOEXCEPT BOOST_NOEXCEPT
91 # else
92 #  if __has_feature(__cxx_noexcept__)
93 #   define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
94 #  endif // __has_feature(__cxx_noexcept__)
95 # endif
96 # if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT)
97 #  define ASIO_ERROR_CATEGORY_NOEXCEPT
98 # endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT)
99 #endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT)
100 
101 // Standard library support for arrays.
102 
103 // Standard library support for shared_ptr and weak_ptr.
104 
105 // Standard library support for atomic operations.
106 
107 // Standard library support for chrono. Some standard libraries (such as the
108 // libstdc++ shipped with gcc 4.6) provide monotonic_clock as per early C++0x
109 // drafts, rather than the eventually standardised name of steady_clock.
110 
111 // Boost support for chrono.
112 
113 // Boost support for the DateTime library.
114 
115 // Standard library support for addressof.
116 
117 // Standard library support for the function class.
118 
119 // Standard library support for type traits.
120 
121 // Standard library support for the cstdint header.
122 
123 // Standard library support for the thread class.
124 
125 // Standard library support for the mutex and condition variable classes.
126 
127 // WinRT target.
128 # if defined(__cplusplus_winrt)
129 #  include <winapifamily.h>
130 #  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)     && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
131 #   define ASIO_WINDOWS_RUNTIME 1
132 #  endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
133          // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
134 # endif // defined(__cplusplus_winrt)
135 
136 // Windows target. Excludes WinRT.
137 
138 // Windows: target OS version.
139 
140 // Windows: minimise header inclusion.
141 
142 // Windows: suppress definition of "min" and "max" macros.
143 
144 // Windows: IO Completion Ports.
145 
146 // On POSIX (and POSIX-like) platforms we need to include unistd.h in order to
147 // get access to the various platform feature macros, e.g. to be able to test
148 // for threads support.
149 #if !defined(ASIO_HAS_UNISTD_H)
150 #  if defined(unix)     || defined(__unix)     || defined(_XOPEN_SOURCE)     || defined(_POSIX_SOURCE)     || (defined(__MACH__) && defined(__APPLE__))     || defined(__FreeBSD__)     || defined(__NetBSD__)     || defined(__OpenBSD__)     || defined(__linux__)
151 #   define ASIO_HAS_UNISTD_H 1
152 #  endif
153 #endif // !defined(ASIO_HAS_UNISTD_H)
154 #if defined(ASIO_HAS_UNISTD_H)
155 # include <unistd.h>
156 #endif // defined(ASIO_HAS_UNISTD_H)
157 
158 // Linux: epoll, eventfd and timerfd.
159 #if defined(__linux__)
160 # include <linux/version.h>
161 # if !defined(ASIO_HAS_EPOLL)
162 # endif // !defined(ASIO_HAS_EPOLL)
163 #  if defined(ASIO_HAS_EPOLL)
164 #   if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)
165 #    define ASIO_HAS_TIMERFD 1
166 #   endif // (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8)
167 #  endif // defined(ASIO_HAS_EPOLL)
168 #endif // defined(__linux__)
169 
170 // Mac OS X, FreeBSD, NetBSD, OpenBSD: kqueue.
171 #if (defined(__MACH__) && defined(__APPLE__))    || defined(__FreeBSD__)    || defined(__NetBSD__)    || defined(__OpenBSD__)
172 #endif // (defined(__MACH__) && defined(__APPLE__))
173        //   || defined(__FreeBSD__)
174        //   || defined(__NetBSD__)
175        //   || defined(__OpenBSD__)
176 
177 // Solaris: /dev/poll.
178 #if defined(__sun)
179 # if !defined(ASIO_HAS_DEV_POLL)
180 #  if !defined(ASIO_DISABLE_DEV_POLL)
181 #   define ASIO_HAS_DEV_POLL 1
182 #  endif // !defined(ASIO_DISABLE_DEV_POLL)
183 # endif // !defined(ASIO_HAS_DEV_POLL)
184 #endif // defined(__sun)
185 
186 // Serial ports.
187         //   || !defined(ASIO_WINDOWS)
188         //   && !defined(ASIO_WINDOWS_RUNTIME)
189         //   && !defined(__CYGWIN__)
190 
191 // Windows: stream handles.
192 # if !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE)
193 # endif // !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE)
194 
195 // Windows: random access handles.
196 # if !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE)
197 # endif // !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE)
198 
199 // Windows: object handles.
200 # if !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
201 # endif // !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
202 
203 // Windows: OVERLAPPED wrapper.
204 # if !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR)
205 # endif // !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR)
206 
207 // POSIX: stream-oriented file descriptors.
208 
209 // UNIX domain sockets.
210 
211 // Can use sigaction() instead of signal().
212 #if !defined(ASIO_HAS_SIGACTION)
213 # if !defined(ASIO_DISABLE_SIGACTION)
214 #   define ASIO_HAS_SIGACTION 1
215          //   && !defined(ASIO_WINDOWS_RUNTIME)
216          //   && !defined(__CYGWIN__)
217 # endif // !defined(ASIO_DISABLE_SIGACTION)
218 #endif // !defined(ASIO_HAS_SIGACTION)
219 
220 // Can use signal().
221 #if !defined(ASIO_HAS_SIGNAL)
222 # if !defined(ASIO_DISABLE_SIGNAL)
223 #  if !defined(UNDER_CE)
224 #   define ASIO_HAS_SIGNAL 1
225 #  endif // !defined(UNDER_CE)
226 # endif // !defined(ASIO_DISABLE_SIGNAL)
227 #endif // !defined(ASIO_HAS_SIGNAL)
228 
229 // Can use getaddrinfo() and getnameinfo().
230 
231 // Whether standard iostreams are disabled.
232 
233 // Whether exception handling is disabled.
234 #if !defined(ASIO_NO_EXCEPTIONS)
235 #endif // !defined(ASIO_NO_EXCEPTIONS)
236 
237 // Whether the typeid operator is supported.
238 #if !defined(ASIO_NO_TYPEID)
239 #endif // !defined(ASIO_NO_TYPEID)
240 
241 // Threads.
242 
243 // POSIX threads.
244 #if !defined(ASIO_HAS_PTHREADS)
245 #  if   defined(_POSIX_THREADS)
246 #   define ASIO_HAS_PTHREADS 1
247 #  endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS)
248 #endif // !defined(ASIO_HAS_PTHREADS)
249 
250 // Helper to prevent macro expansion.
251 #define ASIO_PREVENT_MACRO_SUBSTITUTION
252 
253 // Helper to define in-class constants.
254 #if !defined(ASIO_STATIC_CONSTANT)
255 #  define ASIO_STATIC_CONSTANT(type, assignment)      static const type assignment
256 #endif // !defined(ASIO_STATIC_CONSTANT)
257 
258 // Boost array library.
259 
260 // Boost assert macro.
261 
262 // Boost limits header.
263 
264 // Boost throw_exception function.
265 
266 // Boost regex library.
267 
268 // Boost bind function.
269 
270 // Boost's BOOST_WORKAROUND macro.
271 
272 // Microsoft Visual C++'s secure C runtime library.
273 #if !defined(ASIO_HAS_SECURE_RTL)
274 # if !defined(ASIO_DISABLE_SECURE_RTL)
275          // && (ASIO_MSVC >= 1400)
276          // && !defined(UNDER_CE)
277 # endif // !defined(ASIO_DISABLE_SECURE_RTL)
278 #endif // !defined(ASIO_HAS_SECURE_RTL)
279 
280 // Handler hooking. Disabled for ancient Borland C++ and gcc compilers.
281 #if !defined(ASIO_HAS_HANDLER_HOOKS)
282 # if !defined(ASIO_DISABLE_HANDLER_HOOKS)
283 #  if defined(__GNUC__)
284 #   if (__GNUC__ >= 3)
285 #    define ASIO_HAS_HANDLER_HOOKS 1
286 #   endif // (__GNUC__ >= 3)
287 #  else
288 #   define ASIO_HAS_HANDLER_HOOKS 1
289 #  endif // !defined(__BORLANDC__)
290 # endif // !defined(ASIO_DISABLE_HANDLER_HOOKS)
291 #endif // !defined(ASIO_HAS_HANDLER_HOOKS)
292 
293 // Support for the __thread keyword extension.
294 #if !defined(ASIO_THREAD_KEYWORD)
295 # define ASIO_THREAD_KEYWORD __thread
296 #endif // !defined(ASIO_THREAD_KEYWORD)
297 
298 // Support for POSIX ssize_t typedef.
299 #if !defined(ASIO_DISABLE_SSIZE_T)
300 # if defined(__linux__)     || (defined(__MACH__) && defined(__APPLE__))
301 #  define ASIO_HAS_SSIZE_T 1
302 # endif // defined(__linux__)
303         //   || (defined(__MACH__) && defined(__APPLE__))
304 #endif // !defined(ASIO_DISABLE_SSIZE_T)
305 
306 #endif // ASIO_DETAIL_CONFIG_HPP
307