Skip to content
Snippets Groups Projects
Commit 1cc09e92 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

add another tuple helpers

parent 5d6ae957
No related branches found
No related tags found
No related merge requests found
......@@ -17,6 +17,71 @@
 
namespace std {
 
template < class Result, unsigned I, class Tuple, class Callable >
struct call_on_nth_helper;
template < class Result, unsigned I, class Tuple, class Callable >
struct call_on_nth_helper {
static Result call_on_nth_fn ( Tuple & t, unsigned index, Callable callback ) {
if ( index == 0 )
return callback ( std::get < tuple_size < Tuple >::value - I > ( t ) );
else
return call_on_nth_helper < Result, I - 1, Tuple, Callable >::call_on_nth_fn ( t, index - 1, callback );
}
};
template < class Result, class Tuple, class Callable >
struct call_on_nth_helper < Result, 0, Tuple, Callable > {
static Result call_on_nth_fn ( Tuple &, unsigned, Callable ) {
throw std::out_of_range ( "Not enough elements in tuple." );
}
};
template < class Result, class Tuple, class Callable >
Result call_on_nth ( Tuple & t, unsigned index, Callable callback ) {
return call_on_nth_helper < Result, tuple_size < Tuple >::value, Tuple, Callable >::call_on_nth_fn ( t, index, callback );
}
template < unsigned I, class Tuple, class Callable >
struct foreach_helper;
template < unsigned I, class Tuple, class Callable >
struct foreach_helper {
static void foreach_fn ( Tuple & t, Callable callback ) {
callback ( std::get < I - 1 > ( t ) );
foreach_helper < I - 1, Tuple, Callable >::foreach_fn ( t, callback );
}
};
template < class Tuple, class Callable >
struct foreach_helper < 0, Tuple, Callable > {
static void foreach_fn ( Tuple &, Callable ) {
}
};
template < class Tuple, class Callable >
void foreach ( Tuple & t, Callable callback ) {
return foreach_helper < tuple_size < Tuple >::value, Tuple, Callable >::foreach_fn ( t, callback );
}
template < class Tuple, class Callable >
bool all_of ( const Tuple & t, Callable callback ) {
bool res = true;
auto aggregateCallback = [ & ] ( auto & arg0 ) {
res &= callback ( arg0 );
};
std::foreach ( t, aggregateCallback );
return res;
}
template<int I, class Tuple>
struct operator_shift_left_impl;
 
......@@ -43,6 +108,8 @@ std::ostream& operator<<(std::ostream& out, const std::tuple<Ts...>& tuple) {
return out;
}
 
template < int I, typename Tuple >
struct compareTupleHelper;
 
......@@ -76,6 +143,8 @@ struct compare < tuple < Ts ... > > {
 
};
 
template < class ... Ts >
string to_string ( const std::tuple < Ts ... > & value ) {
std::stringstream ss;
......@@ -83,6 +152,8 @@ string to_string ( const std::tuple < Ts ... > & value ) {
return ss.str();
}
 
template < class Type, int size, class ... Types >
struct TupleBuilder;
 
......
#include "TupleTest.h"
#include <random>
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TupleTest, "bits" );
CPPUNIT_TEST_SUITE_REGISTRATION( TupleTest );
void TupleTest::setUp() {
}
void TupleTest::tearDown() {
}
void TupleTest::testCallOnNth() {
std::tuple < int, int, int, int, int > t = std::make_tuple ( 1, 2, 3, 4, 5 );
CPPUNIT_ASSERT ( std::call_on_nth < int > ( t, 1, [] ( int i ) { return i; } ) == 2 );
}
#ifndef TUPLE_TEST_H_
#define TUPLE_TEST_H_
#include <cppunit/extensions/HelperMacros.h>
class TupleTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( TupleTest );
CPPUNIT_TEST( testCallOnNth );
CPPUNIT_TEST_SUITE_END();
public:
void setUp();
void tearDown();
void testCallOnNth();
};
#endif // TUPLE_TEST_H_
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment