diff --git a/alib2std/src/extensions/tuple.hpp b/alib2std/src/extensions/tuple.hpp index 754ce7e4cad467e2270ae5727da8857a3a43b78b..bc15b03260a33725e9b07b930c969da05d5d1eb5 100644 --- a/alib2std/src/extensions/tuple.hpp +++ b/alib2std/src/extensions/tuple.hpp @@ -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; diff --git a/alib2std/test-src/extensions/TupleTest.cpp b/alib2std/test-src/extensions/TupleTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bef132abedaa778e2af3082fd11282e7a520a11f --- /dev/null +++ b/alib2std/test-src/extensions/TupleTest.cpp @@ -0,0 +1,18 @@ +#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 ); +} + diff --git a/alib2std/test-src/extensions/TupleTest.h b/alib2std/test-src/extensions/TupleTest.h new file mode 100644 index 0000000000000000000000000000000000000000..feaa2b86d0275be300cb2cb29d526dcad59929c2 --- /dev/null +++ b/alib2std/test-src/extensions/TupleTest.h @@ -0,0 +1,19 @@ +#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_