diff --git a/sprout/assert.hpp b/sprout/assert.hpp index 086329ca..ad3a59ff 100644 --- a/sprout/assert.hpp +++ b/sprout/assert.hpp @@ -10,12 +10,21 @@ #if defined(SPROUT_DISABLE_ASSERTS) || defined(NDEBUG) # include +# include +# include +# include #elif defined(SPROUT_ENABLE_ASSERT_HANDLER) # include +# include +# include +# include #else # include # include # include +# include +# include +# include #endif #if !(defined(SPROUT_DISABLE_ASSERTS) || defined(NDEBUG)) # include @@ -29,99 +38,6 @@ "***** Internal Program Error - assertion (" #expr ") failed: " file "(" SPROUT_PP_STRINGIZE(line) ")" #endif -// -// SPROUT_ASSERT -// - -#if defined(SPROUT_DISABLE_ASSERTS) || defined(NDEBUG) - -# define SPROUT_ASSERT(expr) \ - ((void)0) - -#elif defined(SPROUT_ENABLE_ASSERT_HANDLER) - -namespace sprout { - // - // assertion_info - // - class assertion_info { - private: - char const* expr_; - char const* function_; - char const* file_; - long line_; - public: - SPROUT_CONSTEXPR assertion_info(char const* expr, char const* function, char const* file, long line) - : expr_(expr), function_(function), file_(file), line_(line) - {} - SPROUT_CONSTEXPR char const* expr() const SPROUT_NOEXCEPT { - return expr_; - } - SPROUT_CONSTEXPR char const* function() const SPROUT_NOEXCEPT { - return function_; - } - SPROUT_CONSTEXPR char const* file() const SPROUT_NOEXCEPT { - return file_; - } - SPROUT_CONSTEXPR long line() const SPROUT_NOEXCEPT { - return line_; - } - }; - - // - // assertion_failed - // * user defined - // - void - assertion_failed(sprout::assertion_info const&); -} // namespace sprout - -namespace sprout { - namespace detail { - inline bool - assertion_failed(bool cond, char const* formatted, char const* expr, char const* function, char const* file, long line) { - return cond ? true - : ((void)sprout::assertion_failed(sprout::assertion_info(expr, function, file, line)), false) - ; - } - inline SPROUT_CONSTEXPR bool - assertion_check(bool cond, char const* formatted, char const* expr, char const* function, char const* file, long line) { - return cond ? true - : sprout::detail::assertion_failed(cond, formatted, expr, function, file, line) - ; - } - } // namespace detail -} // namespace sprout - -# define SPROUT_ASSERT(expr) ( \ - (void)sprout::detail::assertion_check( \ - (expr), SPROUT_ASSERTION_FAILED_FORMAT(expr, __FILE__, __LINE__), \ - #expr, "(unknown)"/*SPROUT_CURRENT_FUNCTION*/, __FILE__, __LINE__ \ - ) \ - ) - -#else - -namespace sprout { - namespace detail { - inline bool - assertion_failed(char const* formatted) { - return (std::cerr << formatted << std::endl), std::abort(), false; - } - inline SPROUT_CONSTEXPR bool - assertion_check(bool cond, char const* formatted) { - return cond ? true - : sprout::detail::assertion_failed(formatted) - ; - } - } // namespace detail -} // namespace sprout - -# define SPROUT_ASSERT(expr) \ - ((void)sprout::detail::assertion_check((expr), SPROUT_ASSERTION_FAILED_FORMAT(expr, __FILE__, __LINE__))) - -#endif - // // SPROUT_ASSERT_MSG // @@ -219,6 +135,109 @@ namespace sprout { #endif +// +// SPROUT_ASSERT +// + +#if defined(SPROUT_DISABLE_ASSERTS) || defined(NDEBUG) + +# define SPROUT_ASSERT_1(expr) \ + ((void)0) + +#elif defined(SPROUT_ENABLE_ASSERT_HANDLER) + +namespace sprout { + // + // assertion_info + // + class assertion_info { + private: + char const* expr_; + char const* function_; + char const* file_; + long line_; + public: + SPROUT_CONSTEXPR assertion_info(char const* expr, char const* function, char const* file, long line) + : expr_(expr), function_(function), file_(file), line_(line) + {} + SPROUT_CONSTEXPR char const* expr() const SPROUT_NOEXCEPT { + return expr_; + } + SPROUT_CONSTEXPR char const* function() const SPROUT_NOEXCEPT { + return function_; + } + SPROUT_CONSTEXPR char const* file() const SPROUT_NOEXCEPT { + return file_; + } + SPROUT_CONSTEXPR long line() const SPROUT_NOEXCEPT { + return line_; + } + }; + + // + // assertion_failed + // * user defined + // + void + assertion_failed(sprout::assertion_info const&); +} // namespace sprout + +namespace sprout { + namespace detail { + inline bool + assertion_failed(bool cond, char const* formatted, char const* expr, char const* function, char const* file, long line) { + return cond ? true + : ((void)sprout::assertion_failed(sprout::assertion_info(expr, function, file, line)), false) + ; + } + inline SPROUT_CONSTEXPR bool + assertion_check(bool cond, char const* formatted, char const* expr, char const* function, char const* file, long line) { + return cond ? true + : sprout::detail::assertion_failed(cond, formatted, expr, function, file, line) + ; + } + } // namespace detail +} // namespace sprout + +# define SPROUT_ASSERT_1(expr) \ + (void)sprout::detail::assertion_check( \ + (expr), SPROUT_ASSERTION_FAILED_FORMAT(expr, __FILE__, __LINE__), \ + #expr, "(unknown)"/*SPROUT_CURRENT_FUNCTION*/, __FILE__, __LINE__ \ + ) \ + ) + +#else + +namespace sprout { + namespace detail { + inline bool + assertion_failed(char const* formatted) { + return (std::cerr << formatted << std::endl), std::abort(), false; + } + inline SPROUT_CONSTEXPR bool + assertion_check(bool cond, char const* formatted) { + return cond ? true + : sprout::detail::assertion_failed(formatted) + ; + } + } // namespace detail +} // namespace sprout + +# define SPROUT_ASSERT_1(expr) \ + ((void)sprout::detail::assertion_check((expr), SPROUT_ASSERTION_FAILED_FORMAT(expr, __FILE__, __LINE__))) + +#endif + +#if SPROUT_PP_VARIADICS +# define SPROUT_ASSERT_2(expr, msg) \ + SPROUT_ASSERT_MSG(expr, msg) +# define SPROUT_ASSERT(__VA_ARGS__) \ + SPROUT_PP_CAT(SPROUT_ASSERT_, SPROUT_PP_VARIADIC_SIZE(__VA_ARGS__))(__VA_ARGS__) +#else +# define SPROUT_ASSERT(expr) \ + SPROUT_ASSERT_1(expr) +#endif + // // SPROUT_VERIFY // diff --git a/sprout/functional/type_traits/is_strict_function.hpp b/sprout/functional/type_traits/is_strict_function.hpp index 1c8ce0d0..d3787e05 100644 --- a/sprout/functional/type_traits/is_strict_function.hpp +++ b/sprout/functional/type_traits/is_strict_function.hpp @@ -34,12 +34,25 @@ namespace sprout { && sprout::has_second_argument_type::value > {}; + // + // is_strict_function + // + template + struct is_strict_function + : public sprout::integral_constant< + bool, + sprout::is_strict_unary_function::value + || sprout::is_strict_binary_function::value + > + {}; #if SPROUT_USE_VARIABLE_TEMPLATES template SPROUT_STATIC_CONSTEXPR bool is_strict_unary_function_v = sprout::is_strict_unary_function::value; template SPROUT_STATIC_CONSTEXPR bool is_strict_binary_function_v = sprout::is_strict_binary_function::value; + template + SPROUT_STATIC_CONSTEXPR bool is_strict_function_v = sprout::is_strict_function::value; #endif // #if SPROUT_USE_VARIABLE_TEMPLATES } // namespace sprout diff --git a/sprout/preprocessor.hpp b/sprout/preprocessor.hpp index 5404dd17..7f12553e 100644 --- a/sprout/preprocessor.hpp +++ b/sprout/preprocessor.hpp @@ -9,11 +9,13 @@ #define SPROUT_PREPROCESSOR_HPP #include +#include #include #include #include #include #include #include +#include #endif // #ifndef SPROUT_PREPROCESSOR_HPP diff --git a/sprout/preprocessor/config.hpp b/sprout/preprocessor/config.hpp new file mode 100644 index 00000000..56b95bfc --- /dev/null +++ b/sprout/preprocessor/config.hpp @@ -0,0 +1,47 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_PREPROCESSOR_CONFIG_HPP +#define SPROUT_PREPROCESSOR_CONFIG_HPP + +#include + +// +// SPROUT_PP_VARIADICS +// +#if !defined(SPROUT_PP_VARIADICS) +# if defined(__GCCXML__) || defined(__CUDACC__) || defined(__PATHSCALE__) || defined(__clang__) || defined(__DMC__) || defined(__CODEGEARC__) || defined(__BORLANDC__) || defined(__MWERKS__) || defined(__SUNPRO_CC) || (defined(__HP_aCC) && !defined(__EDG__)) || defined(__MRC__) || defined(__SC__) || defined(__IBMCPP__) || defined(__PGI) +# define SPROUT_PP_VARIADICS 0 +# /* VC++ (C/C++) */ +# elif defined(_MSC_VER) && _MSC_VER >= 1400 && !defined(__EDG__) +# if _MSC_VER >= 1400 +# define SPROUT_PP_VARIADICS 1 +# define SPROUT_PP_VARIADICS_MSVC 1 +# else +# define SPROUT_PP_VARIADICS 0 +# endif +# /* Wave (C/C++), GCC (C++) */ +# elif defined(__WAVE__) && __WAVE_HAS_VARIADICS__ || defined(__GNUC__) && __GXX_EXPERIMENTAL_CXX0X__ +# define SPROUT_PP_VARIADICS 1 +# /* EDG-based (C/C++), GCC (C), and unknown (C/C++) */ +# elif !defined(__cplusplus) && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L +# define SPROUT_PP_VARIADICS 1 +# else +# define SPROUT_PP_VARIADICS 0 +# endif +#elif !SPROUT_PP_VARIADICS + 1 < 2 +# undef SPROUT_PP_VARIADICS +# define SPROUT_PP_VARIADICS 1 +# if (defined(_MSC_VER) && _MSC_VER >= 1400 && !(defined(__EDG__)) || defined(__GCCXML__) || defined(__CUDACC__) || defined(__PATHSCALE__) || defined(__clang__) || defined(__DMC__) || defined(__CODEGEARC__) || defined(__BORLANDC__) || defined(__MWERKS__) || defined(__SUNPRO_CC) || defined(__HP_aCC) || defined(__MRC__) || defined(__SC__) || defined(__IBMCPP__) || defined(__PGI)) +# define SPROUT_PP_VARIADICS_MSVC 1 +# endif +#else +# undef SPROUT_PP_VARIADICS +# define SPROUT_PP_VARIADICS 0 +#endif + +#endif // #ifndef SPROUT_PREPROCESSOR_CONFIG_HPP diff --git a/sprout/preprocessor/variadic.hpp b/sprout/preprocessor/variadic.hpp new file mode 100644 index 00000000..aa16d551 --- /dev/null +++ b/sprout/preprocessor/variadic.hpp @@ -0,0 +1,15 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_PREPROCESSOR_VARIADIC_HPP +#define SPROUT_PREPROCESSOR_VARIADIC_HPP + +#include +#include +#include + +#endif // #ifndef SPROUT_PREPROCESSOR_VARIADIC_HPP diff --git a/sprout/preprocessor/variadic/elem.hpp b/sprout/preprocessor/variadic/elem.hpp new file mode 100644 index 00000000..84bfe565 --- /dev/null +++ b/sprout/preprocessor/variadic/elem.hpp @@ -0,0 +1,91 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_PREPROCESSOR_VARIADIC_ELEM_HPP +#define SPROUT_PREPROCESSOR_VARIADIC_ELEM_HPP + +#include +#include +#include + +// +// SPROUT_PP_VARIADIC_ELEM +// +#if SPROUT_PP_VARIADICS +# if SPROUT_PP_VARIADICS_MSVC +# define SPROUT_PP_VARIADIC_ELEM(n, ...) SPROUT_PP_VARIADIC_ELEM_I(n, __VA_ARGS__) +# define SPROUT_PP_VARIADIC_ELEM_I(n, ...) SPROUT_PP_CAT(SPROUT_PP_CAT(SPROUT_PP_VARIADIC_ELEM_, n)(__VA_ARGS__, ), ) +# else +# define SPROUT_PP_VARIADIC_ELEM(n, ...) SPROUT_PP_CAT(SPROUT_PP_VARIADIC_ELEM_, n)(__VA_ARGS__, ) +# endif +# define SPROUT_PP_VARIADIC_ELEM_0(e0, ...) e0 +# define SPROUT_PP_VARIADIC_ELEM_1(e0, e1, ...) e1 +# define SPROUT_PP_VARIADIC_ELEM_2(e0, e1, e2, ...) e2 +# define SPROUT_PP_VARIADIC_ELEM_3(e0, e1, e2, e3, ...) e3 +# define SPROUT_PP_VARIADIC_ELEM_4(e0, e1, e2, e3, e4, ...) e4 +# define SPROUT_PP_VARIADIC_ELEM_5(e0, e1, e2, e3, e4, e5, ...) e5 +# define SPROUT_PP_VARIADIC_ELEM_6(e0, e1, e2, e3, e4, e5, e6, ...) e6 +# define SPROUT_PP_VARIADIC_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, ...) e7 +# define SPROUT_PP_VARIADIC_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, ...) e8 +# define SPROUT_PP_VARIADIC_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ...) e9 +# define SPROUT_PP_VARIADIC_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ...) e10 +# define SPROUT_PP_VARIADIC_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ...) e11 +# define SPROUT_PP_VARIADIC_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ...) e12 +# define SPROUT_PP_VARIADIC_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ...) e13 +# define SPROUT_PP_VARIADIC_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ...) e14 +# define SPROUT_PP_VARIADIC_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ...) e15 +# define SPROUT_PP_VARIADIC_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ...) e16 +# define SPROUT_PP_VARIADIC_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ...) e17 +# define SPROUT_PP_VARIADIC_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ...) e18 +# define SPROUT_PP_VARIADIC_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ...) e19 +# define SPROUT_PP_VARIADIC_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ...) e20 +# define SPROUT_PP_VARIADIC_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ...) e21 +# define SPROUT_PP_VARIADIC_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ...) e22 +# define SPROUT_PP_VARIADIC_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ...) e23 +# define SPROUT_PP_VARIADIC_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ...) e24 +# define SPROUT_PP_VARIADIC_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ...) e25 +# define SPROUT_PP_VARIADIC_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ...) e26 +# define SPROUT_PP_VARIADIC_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ...) e27 +# define SPROUT_PP_VARIADIC_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ...) e28 +# define SPROUT_PP_VARIADIC_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ...) e29 +# define SPROUT_PP_VARIADIC_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ...) e30 +# define SPROUT_PP_VARIADIC_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ...) e31 +# define SPROUT_PP_VARIADIC_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ...) e32 +# define SPROUT_PP_VARIADIC_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ...) e33 +# define SPROUT_PP_VARIADIC_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ...) e34 +# define SPROUT_PP_VARIADIC_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ...) e35 +# define SPROUT_PP_VARIADIC_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ...) e36 +# define SPROUT_PP_VARIADIC_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ...) e37 +# define SPROUT_PP_VARIADIC_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ...) e38 +# define SPROUT_PP_VARIADIC_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ...) e39 +# define SPROUT_PP_VARIADIC_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ...) e40 +# define SPROUT_PP_VARIADIC_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ...) e41 +# define SPROUT_PP_VARIADIC_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ...) e42 +# define SPROUT_PP_VARIADIC_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ...) e43 +# define SPROUT_PP_VARIADIC_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ...) e44 +# define SPROUT_PP_VARIADIC_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ...) e45 +# define SPROUT_PP_VARIADIC_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ...) e46 +# define SPROUT_PP_VARIADIC_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ...) e47 +# define SPROUT_PP_VARIADIC_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ...) e48 +# define SPROUT_PP_VARIADIC_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ...) e49 +# define SPROUT_PP_VARIADIC_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ...) e50 +# define SPROUT_PP_VARIADIC_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ...) e51 +# define SPROUT_PP_VARIADIC_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ...) e52 +# define SPROUT_PP_VARIADIC_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ...) e53 +# define SPROUT_PP_VARIADIC_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ...) e54 +# define SPROUT_PP_VARIADIC_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ...) e55 +# define SPROUT_PP_VARIADIC_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ...) e56 +# define SPROUT_PP_VARIADIC_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ...) e57 +# define SPROUT_PP_VARIADIC_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ...) e58 +# define SPROUT_PP_VARIADIC_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ...) e59 +# define SPROUT_PP_VARIADIC_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ...) e60 +# define SPROUT_PP_VARIADIC_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ...) e61 +# define SPROUT_PP_VARIADIC_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ...) e62 +# define SPROUT_PP_VARIADIC_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, ...) e63 +#endif // #if SPROUT_PP_VARIADICS + +#endif // #ifndef SPROUT_PREPROCESSOR_VARIADIC_ELEM_HPP diff --git a/sprout/preprocessor/variadic/size.hpp b/sprout/preprocessor/variadic/size.hpp new file mode 100644 index 00000000..f4d43ca0 --- /dev/null +++ b/sprout/preprocessor/variadic/size.hpp @@ -0,0 +1,27 @@ +/*============================================================================= + Copyright (c) 2011-2014 Bolero MURAKAMI + https://github.com/bolero-MURAKAMI/Sprout + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +=============================================================================*/ +#ifndef SPROUT_PREPROCESSOR_VARIADIC_SIZE_HPP +#define SPROUT_PREPROCESSOR_VARIADIC_SIZE_HPP + +#include +#include +#include + +// +// SPROUT_PP_VARIADIC_SIZE +// +#if SPROUT_PP_VARIADICS +# if SPROUT_PP_VARIADICS_MSVC +# define SPROUT_PP_VARIADIC_SIZE(...) SPROUT_PP_CAT(SPROUT_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),) +# else +# define SPROUT_PP_VARIADIC_SIZE(...) SPROUT_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,) +# endif +# define SPROUT_PP_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size +#endif // #if SPROUT_PP_VARIADICS + +#endif // #ifndef SPROUT_PREPROCESSOR_VARIADIC_SIZE_HPP