From 66e75860d0c54baa39ed789442b09b96eeebe2e6 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Mon, 2 Jul 2018 05:07:09 +0200 Subject: compat/meta: try make usable --- compat/meta.hpp | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/compat/meta.hpp b/compat/meta.hpp index b02029a7..8682fdc8 100644 --- a/compat/meta.hpp +++ b/compat/meta.hpp @@ -7,17 +7,22 @@ * copyright notice and this permission notice appear in all copies. */ -#if 0 - -#include -#include +#define OTR_META_INST_FAIL(x) \ + static_assert(sizeof...(x) == ~0ul); \ + static_assert(sizeof...(x) == 0u) namespace meta { namespace detail { - template - struct reverse_; + template + struct tuple; + + template + struct reverse_ + { + OTR_META_INST_FAIL(xs); + }; template class x, typename... ys> struct reverse_, x> @@ -31,28 +36,32 @@ namespace detail { using type = x; }; - template class inst, typename x> - struct lift_; + template class inst, typename... xs> + struct lift_ + { + OTR_META_INST_FAIL(xs); + }; - template class inst, template class x, typename... xs> - struct lift_> + template class to, template class from, typename... xs> + struct lift_> { - using type = inst; + using type = to; }; } // ns detail template -using reverse = typename detail::reverse_, std::tuple<>>::type; +using reverse = typename detail::reverse_, detail::tuple<>>::type; -template class inst, class x> -using lift = typename detail::lift_::type; +// the to/from order is awkward but mimics function composition +template class to, typename from> +using lift = typename detail::lift_::type; template using first = x; template -using rest = std::tuple; +using rest = detail::tuple; template using butlast = reverse>>; @@ -60,9 +69,5 @@ using butlast = reverse>>; template using last = lift>; -template -using index_sequence = typename detail::index_sequence_::type; - } // ns meta -#endif -- cgit v1.2.3