diff options
Diffstat (limited to 'boost/test/data/for_each_sample.hpp')
-rw-r--r-- | boost/test/data/for_each_sample.hpp | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/boost/test/data/for_each_sample.hpp b/boost/test/data/for_each_sample.hpp index 8bc1964311..b3bc1ffc78 100644 --- a/boost/test/data/for_each_sample.hpp +++ b/boost/test/data/for_each_sample.hpp @@ -14,10 +14,14 @@ // Boost.Test #include <boost/test/data/config.hpp> -#include <boost/test/data/traits.hpp> #include <boost/test/data/size.hpp> +#include <boost/test/data/index_sequence.hpp> +#include <boost/test/data/monomorphic/sample_merge.hpp> #include <boost/test/data/monomorphic/fwd.hpp> +// STL +#include <tuple> + #include <boost/test/detail/suppress_warnings.hpp> // needed for std::min @@ -30,12 +34,48 @@ namespace unit_test { namespace data { // ************************************************************************** // +// ************** data::invoke_action ************** // +// ************************************************************************** // + +template<typename Action, typename T> +inline void +invoke_action( Action const& action, T && arg, std::false_type /* is_tuple */ ) +{ + action( std::forward<T>(arg) ); +} + +//____________________________________________________________________________// + +template<typename Action, typename T, std::size_t ...I> +inline void +invoke_action_impl( Action const& action, + T && args, + index_sequence<I...> const& ) +{ + action( std::get<I>(std::forward<T>(args))... ); +} + +//____________________________________________________________________________// + +template<typename Action, typename T> +inline void +invoke_action( Action const& action, T&& args, std::true_type /* is_tuple */ ) +{ + invoke_action_impl( action, + std::forward<T>(args), + typename make_index_sequence< 0, std::tuple_size<T>::value >::type{} ); + +} + +//____________________________________________________________________________// + +// ************************************************************************** // // ************** for_each_sample ************** // // ************************************************************************** // template<typename DataSet, typename Action> inline typename std::enable_if<monomorphic::is_dataset<DataSet>::value,void>::type -for_each_sample( DataSet const& samples, +for_each_sample( DataSet && samples, Action const& act, data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE ) { @@ -45,7 +85,9 @@ for_each_sample( DataSet const& samples, auto it = samples.begin(); while( size-- > 0 ) { - data::traits<typename DataSet::sample>::invoke_action( *it, act ); + invoke_action( act, + *it, + typename monomorphic::ds_detail::is_tuple<decltype(*it)>::type()); ++it; } } @@ -54,11 +96,13 @@ for_each_sample( DataSet const& samples, template<typename DataSet, typename Action> inline typename std::enable_if<!monomorphic::is_dataset<DataSet>::value,void>::type -for_each_sample( DataSet const& samples, +for_each_sample( DataSet && samples, Action const& act, data::size_t number_of_samples = BOOST_TEST_DS_INFINITE_SIZE ) { - data::for_each_sample( data::make( samples ), act, number_of_samples ); + data::for_each_sample( data::make( std::forward<DataSet>(samples) ), + act, + number_of_samples ); } } // namespace data |