Skip to content

Instantly share code, notes, and snippets.

@ricejasonf
Last active November 3, 2015 20:16
Show Gist options
  • Save ricejasonf/3572a9ded591e8767f3a to your computer and use it in GitHub Desktop.
Save ricejasonf/3572a9ded591e8767f3a to your computer and use it in GitHub Desktop.
Hand Written C++11 Sequence Reverse Migrated to Hana
#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()
{ }
//
// 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