From a23ac8c9f742c8dcd66cce2e5be3919203e38c69 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 5 May 2016 15:21:37 +0200 Subject: [PATCH] add container transformation function --- alib2std/src/algorithm | 1 + alib2std/src/extensions/algorithm.hpp | 7 +++++++ alib2std/test-src/extensions/AlgorithmTest.cpp | 11 +++++++++++ alib2std/test-src/extensions/AlgorithmTest.h | 2 ++ 4 files changed, 21 insertions(+) diff --git a/alib2std/src/algorithm b/alib2std/src/algorithm index 08d9642f79..dcf693aac1 100644 --- a/alib2std/src/algorithm +++ b/alib2std/src/algorithm @@ -2,6 +2,7 @@ #define __ALGORITHM_HEADER_WRAPPER_ #include <bits/../algorithm> +#include <functional> #include "extensions/algorithm.hpp" #endif /* __ALGORITHM_HEADER_WRAPPER_ */ diff --git a/alib2std/src/extensions/algorithm.hpp b/alib2std/src/extensions/algorithm.hpp index 1685438156..43b11b334c 100644 --- a/alib2std/src/extensions/algorithm.hpp +++ b/alib2std/src/extensions/algorithm.hpp @@ -29,6 +29,13 @@ bool excludes(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) return excludes(first1, last1, first2, last2, std::less<decltype(*first1)>()); } +template<class ResType, class InType, template < typename ... > class ContainerType, class Callback > +ContainerType<ResType> transform(const ContainerType<InType> & in, Callback transform) { + ContainerType<ResType> res; + std::transform ( in.begin ( ), in.end ( ), std::inserter ( res, res.begin ( ) ), transform ); + return res; +} + } /* namespace std */ #endif /* ALGORITHM_HPP_ */ diff --git a/alib2std/test-src/extensions/AlgorithmTest.cpp b/alib2std/test-src/extensions/AlgorithmTest.cpp index aa30eb250c..7037d6dc07 100644 --- a/alib2std/test-src/extensions/AlgorithmTest.cpp +++ b/alib2std/test-src/extensions/AlgorithmTest.cpp @@ -49,3 +49,14 @@ void AlgorithmTest::testExclude() { } } +void AlgorithmTest::testTransform() { + std::set<int> in = {1, 2, 3, 4}; + std::set<long> ref = {2, 3, 4, 5}; + +/* std::function<long(const int&)> lamb = [](const int& elem) { return (long) elem + 1; }; + std::set<long> out = std::transform<long>(in, lamb); //*/ + + std::set<long> out = std::transform<long>(in, [](const int& elem) { return (long) elem + 1; }); + + CPPUNIT_ASSERT(ref == out); +} diff --git a/alib2std/test-src/extensions/AlgorithmTest.h b/alib2std/test-src/extensions/AlgorithmTest.h index 45b6f3efce..0483ba8157 100644 --- a/alib2std/test-src/extensions/AlgorithmTest.h +++ b/alib2std/test-src/extensions/AlgorithmTest.h @@ -7,6 +7,7 @@ class AlgorithmTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE( AlgorithmTest ); CPPUNIT_TEST( testExclude ); + CPPUNIT_TEST( testTransform ); CPPUNIT_TEST_SUITE_END(); public: @@ -14,6 +15,7 @@ public: void tearDown(); void testExclude(); + void testTransform(); }; #endif // ALGORITHM_TEST_H_ -- GitLab