3 #ifndef INCLUDE_NN_NLIB_CONFIG_H_
4 #define INCLUDE_NN_NLIB_CONFIG_H_
14 #ifndef NLIB_NAMESPACE_BEGIN
15 #define NLIB_NAMESPACE_BEGIN namespace nn { namespace nlib {
18 #ifndef NLIB_NAMESPACE_END
19 #define NLIB_NAMESPACE_END }}
23 #define NLIB_NS ::nn::nlib
31 # include "nn/nlib/Config_cafe.h"
32 #elif defined(NN_PLATFORM_CTR)
33 # include "nn/nlib/Config_ctr.h"
34 #elif defined(_MSC_VER)
35 # include "nn/nlib/Config_win32.h"
36 #elif defined(__CYGWIN__)
37 # include "nn/nlib/Config_cygwin.h"
38 #elif defined(__linux__)
39 # include "nn/nlib/Config_linux.h"
40 #elif defined(__FreeBSD__)
41 # include "nn/nlib/Config_freebsd.h"
42 #elif defined(__APPLE__) && defined(__MACH__)
43 # include "nn/nlib/Config_osx.h"
46 #ifdef NLIB_CXX11_STDLIB_ATOMIC
48 # undef NLIB_MEMORY_ORDER_RELEASE
49 # undef NLIB_MEMORY_ORDER_ACQUIRE
50 # undef NLIB_MEMORY_ORDER_ACQ_REL
52 # define NLIB_MEMORY_ORDER_RELEASE ::std::atomic_thread_fence(::std::memory_order_release)
53 # define NLIB_MEMORY_ORDER_ACQUIRE ::std::atomic_thread_fence(::std::memory_order_acquire)
54 # define NLIB_MEMORY_ORDER_ACQ_REL ::std::atomic_thread_fence(::std::memory_order_acq_rel)
57 #ifdef NLIB_CXX11_RVALUE_REFERENCES
59 # define NLIB_FWD(T, v) std::forward<T>(v)
60 # define NLIB_MOVE(x) std::move(x)
63 # define NLIB_FWD(T, v) (v)
64 # define NLIB_MOVE(x) (x)
67 #ifdef NLIB_CXX11_CONSTEXPR
68 # define NLIB_CEXPR constexpr
74 # define NLIB_NOEXCEPT
77 struct nlib_unwind_exception {};
78 #ifndef NLIB_RETHROW_UNWIND
79 # define NLIB_RETHROW_UNWIND catch (nlib_unwind_exception&)
82 #ifndef NLIB_ASSERT_NOERR
83 # define NLIB_ASSERT_NOERR(e) NLIB_ASSERT((e) == 0)
86 #ifdef NLIB_EXCEPTION_ENABLED
88 # define NLIB_CATCH(x) catch(x)
89 # define NLIB_THROW throw
91 # define NLIB_TRY if (true)
92 # define NLIB_CATCH(x) if (false)
96 #ifndef NLIB_STATIC_ASSERT
97 #ifndef NLIB_CXX11_STATIC_ASSERTIONS
101 struct STATIC_ASSERTION_FAILURE;
103 struct STATIC_ASSERTION_FAILURE<true> {};
105 struct static_assert_test {};
109 #define NLIB_ASSERT_H_STRING_JOIN_(X, Y) NLIB_ASSERT_H_STRING_JOIN1_(X, Y)
110 #define NLIB_ASSERT_H_STRING_JOIN1_(X, Y) X##Y
112 #define NLIB_STATIC_ASSERT(exp) \
113 typedef ::nlib_ns::detail::static_assert_test< \
114 sizeof(::nlib_ns::detail::STATIC_ASSERTION_FAILURE<(exp) != 0>)> \
115 NLIB_ASSERT_H_STRING_JOIN_(nn_static_assert_typedef_, __LINE__)
117 # define NLIB_STATIC_ASSERT(exp) static_assert((exp), "NLIB_STATIC_ASSERT error: " #exp)
121 #ifndef NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS
122 #define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName) \
123 TypeName(const TypeName&); \
124 void operator=(const TypeName&)
126 #define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName) \
127 TypeName(const TypeName&) = delete; \
128 void operator=(const TypeName&) = delete
131 #ifndef NLIB_CXX11_EXPLICIT_CONVERSION_OPERATORS
132 #define NLIB_SAFE_BOOL(class_name, exp) \
134 typedef void (class_name::*bool_type)() const; \
135 void this_type_does_not_support_comparisons() const NLIB_NOEXCEPT {} \
137 operator bool_type() const NLIB_NOEXCEPT { \
138 return (exp) ? &class_name::this_type_does_not_support_comparisons : 0; \
141 #define NLIB_SAFE_BOOL(class_name, exp) \
143 explicit NLIB_ALWAYS_INLINE operator bool() const NLIB_NOEXCEPT { return (exp); }
147 #if defined(WCHAR_MIN) && defined(WCHAR_MAX)
148 # if WCHAR_MAX <= 0xFFFF
149 # define NLIB_WCHAR_SIZE (2)
152 # define NLIB_WCHAR_SIZE (4)
156 # error WCHAR_MIN, WCHAR_MAX not defined
166 #ifndef NLIB_CXX11_NULL_POINTER_CONSTANT
171 operator T*()
const {
174 template <
class C,
class T>
175 operator T C::*()
const {
180 void operator&()
const;
184 const nullptr_t
nullptr = {};
190 typedef std::nullptr_t nullptr_t;
194 #ifndef NLIB_CXX11_EXPLICIT_VIRTUAL_OVERRIDES
195 # define NLIB_OVERRIDE
198 # define NLIB_OVERRIDE override
199 # define NLIB_FINAL final
202 #ifdef NLIB_CXX11_ALIGNMENT_SUPPORT
209 # define NLIB_ALIGNAS(x) alignas(x)
210 # define NLIB_ALIGNOF(tp) alignof(tp)
213 #ifdef NLIB_CXX11_RVALUE_REFERENCES
222 #define NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
224 tp& assign(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT { \
230 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_1(tp, mem1) \
231 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
233 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : mem1() \
238 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_2(tp, mem1, mem2) \
239 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
241 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : mem1(), \
247 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_3(tp, mem1, mem2, mem3) \
248 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
250 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : \
257 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_4(tp, mem1, mem2, mem3, mem4) \
258 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
260 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : \
268 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_5(tp, mem1, mem2, mem3, mem4, mem5) \
269 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
271 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : \
280 #define NLIB_MOVE_MEMBER_HELPER_WITHTAG_6(tp, mem1, mem2, mem3, mem4, mem5, mem6) \
281 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
283 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : \
293 #ifdef NLIB_CXX11_RVALUE_REFERENCES
294 #define NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp) \
296 tp& operator=(tp&& rhs) NLIB_NOEXCEPT { \
297 tp tmp(std::move(rhs)); \
302 #ifdef NLIB_CXX11_DELEGATING_CONSTRUCTORS
303 #define NLIB_MOVE_MEMBER_HELPER_(tp) \
304 NLIB_MOVE_MEMBER_HELPER_COMMON(tp) \
305 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp) \
307 tp(tp&& rhs) NLIB_NOEXCEPT : tp() { this->swap(rhs); } \
309 tp(tp& rhs, ::nlib_ns::move_tag) NLIB_NOEXCEPT : tp() { this->swap(rhs); } // NOLINT
311 #define NLIB_MOVE_MEMBER_HELPER_1(tp, mem1) NLIB_MOVE_MEMBER_HELPER_(tp)
312 #define NLIB_MOVE_MEMBER_HELPER_2(tp, mem1, mem2) NLIB_MOVE_MEMBER_HELPER_(tp)
313 #define NLIB_MOVE_MEMBER_HELPER_3(tp, mem1, mem2, mem3) NLIB_MOVE_MEMBER_HELPER_(tp)
314 #define NLIB_MOVE_MEMBER_HELPER_4(tp, mem1, mem2, mem3, mem4) NLIB_MOVE_MEMBER_HELPER_(tp)
315 #define NLIB_MOVE_MEMBER_HELPER_5(tp, mem1, mem2, mem3, mem4, mem5) NLIB_MOVE_MEMBER_HELPER_(tp)
316 #define NLIB_MOVE_MEMBER_HELPER_6(tp, mem1, mem2, mem3, mem4, mem5, mem6) \
317 NLIB_MOVE_MEMBER_HELPER_(tp)
320 #define NLIB_MOVE_MEMBER_HELPER_1(tp, mem1) \
322 tp(tp&& rhs) NLIB_NOEXCEPT : mem1() { this->swap(rhs); } \
323 NLIB_MOVE_MEMBER_HELPER_WITHTAG_1(tp, mem1) \
324 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
326 #define NLIB_MOVE_MEMBER_HELPER_2(tp, mem1, mem2) \
328 tp(tp&& rhs) : mem1(), mem2() { this->swap(rhs); } \
329 NLIB_MOVE_MEMBER_HELPER_WITHTAG_2(tp, mem1, mem2) \
330 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
332 #define NLIB_MOVE_MEMBER_HELPER_3(tp, mem1, mem2, mem3) \
334 tp(tp&& rhs) : mem1(), mem2(), mem3() { this->swap(rhs); } \
335 NLIB_MOVE_MEMBER_HELPER_WITHTAG_3(tp, mem1, mem2, mem3) \
336 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
338 #define NLIB_MOVE_MEMBER_HELPER_4(tp, mem1, mem2, mem3, mem4) \
340 tp(tp&& rhs) : mem1(), mem2(), mem3(), mem4() { this->swap(rhs); } \
341 NLIB_MOVE_MEMBER_HELPER_WITHTAG_4(tp, mem1, mem2, mem3, mem4) \
342 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
344 #define NLIB_MOVE_MEMBER_HELPER_5(tp, mem1, mem2, mem3, mem4, mem5) \
346 tp(tp&& rhs) : mem1(), mem2(), mem3(), mem4(), mem5() { this->swap(rhs); } \
347 NLIB_MOVE_MEMBER_HELPER_WITHTAG_5(tp, mem1, mem2, mem3, mem4, mem5) \
348 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
350 #define NLIB_MOVE_MEMBER_HELPER_6(tp, mem1, mem2, mem3, mem4, mem5, mem6) \
352 tp(tp&& rhs) : mem1(), mem2(), mem3(), mem4(), mem5(), mem6() { this->swap(rhs); } \
353 NLIB_MOVE_MEMBER_HELPER_WITHTAG_6(tp, mem1, mem2, mem3, mem4, mem5, mem6) \
354 NLIB_MOVE_MEMBER_HELPER_X_COMMON(tp)
358 #define NLIB_MOVE_MEMBER_HELPER_1(tp, mem1) NLIB_MOVE_MEMBER_HELPER_WITHTAG_1(tp, mem1)
360 #define NLIB_MOVE_MEMBER_HELPER_2(tp, mem1, mem2) NLIB_MOVE_MEMBER_HELPER_WITHTAG_2(tp, mem1, mem2)
362 #define NLIB_MOVE_MEMBER_HELPER_3(tp, mem1, mem2, mem3) \
363 NLIB_MOVE_MEMBER_HELPER_WITHTAG_3(tp, mem1, mem2, mem3)
365 #define NLIB_MOVE_MEMBER_HELPER_4(tp, mem1, mem2, mem3, mem4) \
366 NLIB_MOVE_MEMBER_HELPER_WITHTAG_4(tp, mem1, mem2, mem3, mem4)
368 #define NLIB_MOVE_MEMBER_HELPER_5(tp, mem1, mem2, mem3, mem4, mem5) \
369 NLIB_MOVE_MEMBER_HELPER_WITHTAG_5(tp, mem1, mem2, mem3, mem4, mem5)
371 #define NLIB_MOVE_MEMBER_HELPER_6(tp, mem1, mem2, mem3, mem4, mem5, mem6) \
372 NLIB_MOVE_MEMBER_HELPER_WITHTAG_6(tp, mem1, mem2, mem3, mem4, mem5, mem6)
376 #ifdef NLIB_HAS_STDHEADER_TIME
383 #ifndef NLIB_MEMCHECKER
384 # define NLIB_MEMCHECKER NLIB_STATIC_ASSERT(sizeof(char) == 1) // NOLINT
385 # define NLIB_MEMCHECKER_START NLIB_STATIC_ASSERT(sizeof(char) == 1) // NOLINT
386 # define NLIB_MEMCHECKER_CHECK true
390 # define NLIB_UNUSED(x) (void)(x)
395 #ifndef NLIB_NOEMPTYFILE
396 # define NLIB_NOEMPTYFILE()
399 #ifdef NLIB_SOCKET_ENABLED
402 # define NLIB_SOCKPORT_SAMPLE (17974 + _MSC_VER + 50)
404 # define NLIB_SOCKPORT_SAMPLE (17974 + _MSC_VER)
406 # elif defined(__clang__)
408 # define NLIB_SOCKPORT_SAMPLE (18174)
410 # define NLIB_SOCKPORT_SAMPLE (18074)
414 # define NLIB_SOCKPORT_SAMPLE (17874)
416 # define NLIB_SOCKPORT_SAMPLE (17974)
429 #if !defined(NLIB_CIBUILD) && defined(NDEBUG)
430 # define NLIB_TESTLOOPCOUNT(x) (x)
432 # define NLIB_TESTLOOPCOUNT(x) (1)
435 #endif // INCLUDE_NN_NLIB_CONFIG_H_
nlib_utf16_t utf16_t
Type for UTF-16 characters. Defined as nlib_utf16_t using typedef.
An empty structure indicating that an argument to a function needs to be moved.
Implements common features and features that are highly platform-dependent. Also refer to nlib Platfo...
nlib_utf32_t utf32_t
Type for UTF-32 characters. Defined as nlib_utf32_t using typedef.
#define NLIB_STATIC_ASSERT(exp)
Defines a static assertion. Uses static_assert if it is available for use.