summaryrefslogtreecommitdiff
path: root/boost/test/data/for_each_sample.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/test/data/for_each_sample.hpp')
-rw-r--r--boost/test/data/for_each_sample.hpp54
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