Last active
November 3, 2015 20:16
-
-
Save ricejasonf/3572a9ded591e8767f3a to your computer and use it in GitHub Desktop.
Hand Written C++11 Sequence Reverse Migrated to Hana
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<boost/hana.hpp> | |
namespace hana = boost::hana; | |
constexpr auto my_sequence = hana::tuple_t<int, float, char>; | |
constexpr auto my_sequence_reversed = hana::tuple_t<char, float, int>; | |
static_assert(hana::reverse(my_sequence) == my_sequence_reversed, ""); | |
int main() | |
{ } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Copyright Jason Rice 2015 | |
// Distributed under the Boost Software License, Version 1.0. | |
// (See accompanying file LICENSE_1_0.txt or copy at | |
// http://www.boost.org/LICENSE_1_0.txt) | |
// | |
#include<type_traits> | |
#include<tuple> | |
namespace my_mpl { | |
template<int... sequence> | |
struct NumberSequence {}; | |
template<int n, int... sequence> | |
struct CreateNumberSequence { | |
using Type = typename CreateNumberSequence<n - 1, n - 1, sequence...>::Type; | |
}; | |
template<int... sequence> | |
struct CreateNumberSequence<0, sequence...> { | |
using Type = NumberSequence<sequence...>; | |
}; | |
namespace details { | |
template<typename Tuple, typename Sequence> | |
struct ReverseTuple; | |
template<typename Tuple, int... sequence> | |
struct ReverseTuple<Tuple, NumberSequence<sequence...>> { | |
using Type = std::tuple<typename std::tuple_element<(sizeof...(sequence) - 1 - sequence), Tuple>::type...>; | |
}; | |
}//details | |
template<typename Tuple> | |
struct Reverse; | |
template<typename... Ts> | |
struct Reverse<std::tuple<Ts...>> { | |
using Tuple = std::tuple<Ts...>; | |
using Sequence = typename CreateNumberSequence<std::tuple_size<Tuple>::value>::Type; | |
using Type = typename details::ReverseTuple<Tuple, Sequence>::Type; | |
}; | |
}//my_mpl | |
using MySequence = std::tuple<int, float, char>; | |
using MySequenceReversed = std::tuple<char, float, int>; | |
static_assert(std::is_same<typename my_mpl::Reverse<MySequence>::Type, MySequenceReversed>::value, ""); | |
int main() | |
{ } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment