/*============================================================================= Copyright (c) 2016 Paul Fultz II limit.h 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 FIT_GUARD_LIMIT_H #define FIT_GUARD_LIMIT_H /// limit /// ===== /// /// Description /// ----------- /// /// The `limit` function decorator annotates the function with the max number of /// parameters. The `limit_c` version can be used to give the max number /// directly(instead of relying on dependent typing). /// /// Synopsis /// -------- /// /// template /// constexpr auto limit(IntegralConstant); /// /// template /// constexpr auto limit_c(F); /// /// Requirements /// ------------ /// /// IntegralConstant must be: /// /// * IntegralConstant /// /// F must be: /// /// * [Callable](concepts.md#callable) /// * MoveConstructible /// /// Example /// ------- /// /// struct sum_f /// { /// template /// int operator()(T x, T y) const /// { /// return x+y; /// } /// }; /// FIT_STATIC_FUNCTION(sum) = limit_c<2>(sum_f()); /// assert(3 == sum(1, 2)); /// /// function_param_limit /// ==================== /// /// Description /// ----------- /// /// The `function_param_limit` metafunction retrieves the maxium number of /// parameters for a function. /// /// Synopsis /// -------- /// /// template /// struct function_param_limit; /// #include #include #include #include #include #include namespace fit { namespace detail { template struct limit_adaptor : detail::callable_base { typedef std::integral_constant fit_function_param_limit; FIT_INHERIT_CONSTRUCTOR(limit_adaptor, detail::callable_base) }; template struct make_limit_f { constexpr make_limit_f() {} template constexpr limit_adaptor operator()(F f) const { return limit_adaptor(static_cast(f)); } }; struct limit_f { template constexpr make_limit_f operator()(IntegralConstant) const { return {}; } }; } template constexpr detail::limit_adaptor limit_c(F f) { return detail::limit_adaptor(static_cast(f)); } FIT_DECLARE_STATIC_VAR(limit, detail::limit_f); template struct function_param_limit : std::integral_constant {}; template struct function_param_limit::type> : F::fit_function_param_limit {}; } // namespace fit #endif