diff --git a/test/tuple/value.cpp b/test/tuple/value.cpp index 8f0e1b8e..a251cb60 100644 --- a/test/tuple/value.cpp +++ b/test/tuple/value.cpp @@ -29,5 +29,13 @@ main (void) tap.expect_eq (c, util::tuple::value::zip (a, b), "tuple zipping"); } + { + std::tuple a (1, 2); + auto result = util::tuple::value::reverse (a); + std::tuple expected (2, 1); + + tap.expect_eq (result, expected, "tuple reverse"); + } + return tap.status (); } diff --git a/tuple/value.hpp b/tuple/value.hpp index 0d66fbbc..530a0263 100644 --- a/tuple/value.hpp +++ b/tuple/value.hpp @@ -17,6 +17,7 @@ #ifndef CRUFT_UTIL_TUPLE_VALUE_HPP #define CRUFT_UTIL_TUPLE_VALUE_HPP +#include "index.hpp" #include "../types.hpp" #include @@ -123,6 +124,32 @@ namespace util::tuple::value { std::forward (args)... ); } + + + /////////////////////////////////////////////////////////////////////////// + namespace detail { + template + auto + reverse (index::indices, TupleT &&val) + { + return std::make_tuple ( + std::get (val)... + ); + } + }; + + //------------------------------------------------------------------------- + template + auto + reverse (TupleT &&val) + { + return detail::reverse ( + index::make_reverse_t< + std::tuple_size_v> + > {}, + std::forward (val) + ); + } }