#include <tuple>
#include <utility>
#include<boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/algorithm/transformation/reverse.hpp>
#include <boost/fusion/include/reverse.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/include/size.hpp>
#include <iostream>
template <std::size_t... Is>
struct indices {};
template <std::size_t N, std::size_t... Is>
struct build_indices
: build_indices<N-1, N-1, Is...> {};
template <std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};
template<typename Sequence, std::size_t ...Is>
auto as_std_tuple_impl(const Sequence& s, indices<Is...>&&) -> decltype(std::tie(boost::fusion::at_c<Is>(s)...))
{
return std::tie(boost::fusion::at_c<Is>(s)...);
}
template <typename Sequence, typename Indices = build_indices<boost::fusion::result_of::size<Sequence>::value>>
auto as_std_tuple(const Sequence& s)
{
return as_std_tuple_impl(s, Indices());
}
template<class Tuple, std::size_t N>
struct TuplePrinter
{
static void print(const Tuple& t)
{
TuplePrinter<Tuple, N-1>::print(t);
std::cout << ", " << std::get<N-1>(t);
}
};
template<class Tuple>
struct TuplePrinter<Tuple, 1>
{
static void print(const Tuple& t)
{
std::cout << std::get<0>(t);
}
};
template<class... Args>
void print(const std::tuple<Args...>& t)
{
std::cout << "(";
TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
std::cout << ")\n";
}
int main()
{
std::tuple<int, double, std::string> tup(1,2.5,"hello");
auto view_rev = boost::fusion::reverse(tup);
auto reversed_tup = as_std_tuple(view_rev);
print(tup);
print(reversed_tup);
return 0;
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dXRpbGl0eT4KCiNpbmNsdWRlPGJvb3N0L2Z1c2lvbi9hZGFwdGVkL3N0ZF90dXBsZS5ocHA+CiNpbmNsdWRlIDxib29zdC9mdXNpb24vYWxnb3JpdGhtL3RyYW5zZm9ybWF0aW9uL3JldmVyc2UuaHBwPgojaW5jbHVkZSA8Ym9vc3QvZnVzaW9uL2luY2x1ZGUvcmV2ZXJzZS5ocHA+CgojaW5jbHVkZSA8Ym9vc3QvZnVzaW9uL3NlcXVlbmNlL2ludHJpbnNpYy9zaXplLmhwcD4KI2luY2x1ZGUgPGJvb3N0L2Z1c2lvbi9pbmNsdWRlL3NpemUuaHBwPgoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uIElzPgpzdHJ1Y3QgaW5kaWNlcyB7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOLCBzdGQ6OnNpemVfdC4uLiBJcz4Kc3RydWN0IGJ1aWxkX2luZGljZXMKICA6IGJ1aWxkX2luZGljZXM8Ti0xLCBOLTEsIElzLi4uPiB7fTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJcz4Kc3RydWN0IGJ1aWxkX2luZGljZXM8MCwgSXMuLi4+IDogaW5kaWNlczxJcy4uLj4ge307CiAgICAKdGVtcGxhdGU8dHlwZW5hbWUgU2VxdWVuY2UsIHN0ZDo6c2l6ZV90IC4uLklzPgphdXRvIGFzX3N0ZF90dXBsZV9pbXBsKGNvbnN0IFNlcXVlbmNlJiBzLCBpbmRpY2VzPElzLi4uPiYmKSAtPiBkZWNsdHlwZShzdGQ6OnRpZShib29zdDo6ZnVzaW9uOjphdF9jPElzPihzKS4uLikpCnsKICAgIHJldHVybiBzdGQ6OnRpZShib29zdDo6ZnVzaW9uOjphdF9jPElzPihzKS4uLik7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBTZXF1ZW5jZSwgdHlwZW5hbWUgSW5kaWNlcyA9IGJ1aWxkX2luZGljZXM8Ym9vc3Q6OmZ1c2lvbjo6cmVzdWx0X29mOjpzaXplPFNlcXVlbmNlPjo6dmFsdWU+PgphdXRvIGFzX3N0ZF90dXBsZShjb25zdCBTZXF1ZW5jZSYgcykKewogICAgICAgIHJldHVybiBhc19zdGRfdHVwbGVfaW1wbChzLCBJbmRpY2VzKCkpOwp9CgoKdGVtcGxhdGU8Y2xhc3MgVHVwbGUsIHN0ZDo6c2l6ZV90IE4+CnN0cnVjdCBUdXBsZVByaW50ZXIKewogICAgc3RhdGljIHZvaWQgcHJpbnQoY29uc3QgVHVwbGUmIHQpIAogICAgewogICAgICAgIFR1cGxlUHJpbnRlcjxUdXBsZSwgTi0xPjo6cHJpbnQodCk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICIsICIgPDwgc3RkOjpnZXQ8Ti0xPih0KTsKICAgIH0KfTsKIAp0ZW1wbGF0ZTxjbGFzcyBUdXBsZT4Kc3RydWN0IFR1cGxlUHJpbnRlcjxUdXBsZSwgMT4gCnsKICAgIHN0YXRpYyB2b2lkIHByaW50KGNvbnN0IFR1cGxlJiB0KSAKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpnZXQ8MD4odCk7CiAgICB9Cn07CiAKdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4Kdm9pZCBwcmludChjb25zdCBzdGQ6OnR1cGxlPEFyZ3MuLi4+JiB0KSAKewogICAgc3RkOjpjb3V0IDw8ICIoIjsKICAgIFR1cGxlUHJpbnRlcjxkZWNsdHlwZSh0KSwgc2l6ZW9mLi4uKEFyZ3MpPjo6cHJpbnQodCk7CiAgICBzdGQ6OmNvdXQgPDwgIilcbiI7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp0dXBsZTxpbnQsIGRvdWJsZSwgc3RkOjpzdHJpbmc+IHR1cCgxLDIuNSwiaGVsbG8iKTsKICAgIGF1dG8gdmlld19yZXYgPSBib29zdDo6ZnVzaW9uOjpyZXZlcnNlKHR1cCk7CiAgICBhdXRvIHJldmVyc2VkX3R1cCA9IGFzX3N0ZF90dXBsZSh2aWV3X3Jldik7CgogICAgcHJpbnQodHVwKTsKICAgIHByaW50KHJldmVyc2VkX3R1cCk7CiAgICByZXR1cm4gMDsKfQ==