From e1fbb9eb8e1fed2a13a22b47e285fe17604f3807 Mon Sep 17 00:00:00 2001
From: namark <namark@disroot.org>
Date: Mon, 20 Sep 2021 19:41:41 +0400
Subject: [PATCH] Convenience meta function for transforming tuples,

with barely a test.
---
 source/simple/support/tuple_utils.hpp         |  2 ++
 .../support/tuple_utils/meta_transform.hpp    | 28 +++++++++++++++++++
 unit_tests/tuple_utils.cpp                    | 15 ++++++++--
 3 files changed, 43 insertions(+), 2 deletions(-)
 create mode 100644 source/simple/support/tuple_utils/meta_transform.hpp

diff --git a/source/simple/support/tuple_utils.hpp b/source/simple/support/tuple_utils.hpp
index 3f0ae3c..40b34ff 100644
--- a/source/simple/support/tuple_utils.hpp
+++ b/source/simple/support/tuple_utils.hpp
@@ -4,5 +4,7 @@
 #include "tuple_utils/meta_bind.hpp"
 #include "tuple_utils/meta_find.hpp"
 #include "tuple_utils/meta_flatten.hpp"
+#include "tuple_utils/meta_transform.hpp"
 #include "tuple_utils/pend.hpp"
 #include "tuple_utils/subtuple.hpp"
+
diff --git a/source/simple/support/tuple_utils/meta_transform.hpp b/source/simple/support/tuple_utils/meta_transform.hpp
new file mode 100644
index 0000000..dc7a7f7
--- /dev/null
+++ b/source/simple/support/tuple_utils/meta_transform.hpp
@@ -0,0 +1,28 @@
+#ifndef SIMPLE_SUPPORT_TUPLE_UTILS_META_TRANSFORM_HPP
+#define SIMPLE_SUPPORT_TUPLE_UTILS_META_TRANSFORM_HPP
+
+#include "meta_flatten.hpp"
+
+namespace simple::support
+{
+
+	template <template<typename...> typename transformer>
+	struct meta_transform_tuple_wrapper
+	{
+		template <typename... Ts>
+		struct op
+		{
+			using type = std::tuple<transformer<Ts...>>;
+		};
+	};
+
+	template <typename Tuple, template <typename...> typename Operator>
+	using transform_t = flatten_t
+	<
+		Tuple,
+		meta_transform_tuple_wrapper<Operator>::template op
+	>;
+
+} // namespace simple::support
+
+#endif /* end of include guard */
diff --git a/unit_tests/tuple_utils.cpp b/unit_tests/tuple_utils.cpp
index 1931814..16de6ea 100644
--- a/unit_tests/tuple_utils.cpp
+++ b/unit_tests/tuple_utils.cpp
@@ -1,11 +1,12 @@
 // TODO: need a test file per header and include the header first, to detect missing includes
 
+#include "simple/support/tuple_utils.hpp"
+#include "simple/support/function_utils.hpp"
+
 #include <cassert>
 #include <string>
 #include <sstream>
 #include <array>
-#include "simple/support/tuple_utils.hpp"
-#include "simple/support/function_utils.hpp"
 
 using namespace simple::support;
 using namespace std::literals;
@@ -522,6 +523,15 @@ void MetaFlatten()
 	>);
 }
 
+void MetaTransform()
+{
+	static_assert(std::is_same_v<
+		transform_t<std::tuple<long, int, short, signed char>,
+			std::make_unsigned_t>,
+		std::tuple<unsigned long, unsigned, unsigned short, unsigned char>
+	>);
+}
+
 int main()
 {
 	ApplyFor();
@@ -534,5 +544,6 @@ int main()
 	Pend();
 	MetaFind();
 	MetaFlatten();
+	MetaTransform();
 	return 0;
 }
-- 
GitLab