| | #ifndef METAL_LAMBDA_BIND_HPP |
| | #define METAL_LAMBDA_BIND_HPP |
| |
|
| | #include "../config.hpp" |
| |
|
| | namespace metal { |
| | |
| | namespace detail { |
| | template <class lbd, class... vals> |
| | struct _bind; |
| | } |
| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | template <class lbd, class... vals> |
| | using bind = typename detail::_bind<lbd, vals...>::type; |
| | } |
| |
|
| | #include "../detail/sfinae.hpp" |
| | #include "../lambda/lambda.hpp" |
| |
|
| | namespace metal { |
| | |
| | namespace detail { |
| | template <class... vals> |
| | struct _bind_impl { |
| | template <template <class...> class expr, template <class...> class... params> |
| | using type = |
| | #if defined(METAL_WORKAROUND) |
| | call<expr, call<params, vals...>...>; |
| | #else |
| | expr<params<vals...>...>; |
| | #endif |
| | }; |
| |
|
| | template <class lbd, class... vals> |
| | struct _bind { |
| | }; |
| |
|
| | template <template <class...> class expr, template <class...> class... params> |
| | struct _bind<lambda<expr>, lambda<params>...> { |
| | template <class... vals> |
| | using impl = forward<_bind_impl<vals...>::template type, expr, params...>; |
| |
|
| | using type = lambda<impl>; |
| | }; |
| | } |
| | |
| | } |
| |
|
| | #endif |
| |
|