#ifndef SPROUT_GENERATOR_NEXT_GENERATOR_HPP #define SPROUT_GENERATOR_NEXT_GENERATOR_HPP #include #include #include #include #include #include namespace sprout_adl { sprout::not_found_via_adl next_generator(...); } // namespace sprout_adl namespace sprout_generator_detail { using sprout_adl::next_generator; template inline SPROUT_CONSTEXPR decltype(sprout::generators::generator_access_traits::next_generator(std::declval())) next_generator(Gen& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::generators::generator_access_traits::next_generator(std::declval()))) { return sprout::generators::generator_access_traits::next_generator(gen); } template inline SPROUT_CONSTEXPR typename std::enable_if< !std::is_const::value && !std::is_volatile::value && !std::is_reference::value, decltype(sprout::generators::generator_access_traits::type>::next_generator(std::declval())) >::type next_generator(Gen&& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::generators::generator_access_traits::type>::next_generator(std::declval()))) { return sprout::generators::generator_access_traits::next_generator(gen); } template inline SPROUT_CONSTEXPR decltype(sprout::generators::generator_access_traits::next_generator(std::declval())) next_generator(Gen const& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout::generators::generator_access_traits::next_generator(std::declval()))) { return sprout::generators::generator_access_traits::next_generator(gen); } template inline SPROUT_CONSTEXPR decltype(next_generator(std::declval())) call_next_generator(Gen& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(next_generator(std::declval()))) { return next_generator(gen); } template inline SPROUT_CONSTEXPR typename std::enable_if< !std::is_const::value && !std::is_volatile::value && !std::is_reference::value, decltype(next_generator(std::declval())) >::type call_next_generator(Gen&& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(next_generator(std::declval()))) { return next_generator(gen); } template inline SPROUT_CONSTEXPR decltype(next_generator(std::declval())) call_next_generator(Gen const& gen) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(next_generator(std::declval()))) { return next_generator(gen); } } // namespace sprout_generator_detail namespace sprout { namespace generators { // // next_generator // template inline SPROUT_CONSTEXPR decltype(sprout_generator_detail::call_next_generator(std::declval())) next_generator(T&& t) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(sprout_generator_detail::call_next_generator(std::declval()))) { return sprout_generator_detail::call_next_generator(sprout::forward(t)); } } // namespace generators using sprout::generators::next_generator; } // namespace sprout #endif // #ifndef SPROUT_GENERATOR_NEXT_GENERATOR_HPP