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