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