diff options
Diffstat (limited to 'compat')
-rw-r--r-- | compat/meta.hpp | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/compat/meta.hpp b/compat/meta.hpp index a116cebc..4dec8bbb 100644 --- a/compat/meta.hpp +++ b/compat/meta.hpp @@ -7,20 +7,13 @@ * copyright notice and this permission notice appear in all copies. */ -#define OTR_META_INST_FAIL(x) \ - static_assert(sizeof...(x) == ~0ul); \ - static_assert(sizeof...(x) == 0u) - namespace meta::detail { template<typename... xs> struct tuple; template<typename... xs> - struct reverse_ - { - OTR_META_INST_FAIL(xs); - }; + struct reverse_; template<typename x0, typename... xs, template<typename...> class x, typename... ys> struct reverse_<x<x0, xs...>, x<ys...>> @@ -34,11 +27,7 @@ namespace meta::detail { using type = x<ys...>; }; - template<template<typename...> class inst, typename... xs> - struct lift_ - { - OTR_META_INST_FAIL(xs); - }; + template<template<typename...> class, typename, typename...> struct lift_; template<template<typename...> class to, template<typename...> class from, typename... xs> struct lift_<to, from<xs...>> @@ -46,18 +35,60 @@ namespace meta::detail { using type = to<xs...>; }; - template<typename...> struct cons_; + template<typename> struct append_helper; + + template<typename, typename> struct cons_; template<template<typename...> class t, typename x, typename... xs> - struct cons_<t<xs...>, x> + struct cons_<x, t<xs...>> { using type = t<x, xs...>; }; + template<typename> struct append2; + + template<template<typename...> class t, typename... xs> + struct append2<t<xs...>> + { + template<typename> struct append1; + + template<template<typename...> class u, typename... ys> + struct append1<u<ys...>> + { + using type = t<xs..., ys...>; + }; + }; + + template<typename, typename...> struct list__; + + template<typename rest, typename... first> + struct list__ + { + template<typename> struct list1; + + template<template<typename...> class t, typename... xs> + struct list1<t<xs...>> + { + using type = t<first..., xs...>; + }; + + using type = typename list1<rest>::type; + }; + + template<typename xs, typename ys> + struct append_ + { + using t1 = append2<xs>; + using type = typename t1::template append1<ys>::type; + }; + } // ns meta::detail namespace meta { template<typename... xs> + using tuple_ = detail::tuple<xs...>; + + template<typename... xs> using reverse = typename detail::reverse_<detail::tuple<xs...>, detail::tuple<>>::type; // the to/from order is awkward but mimics function composition @@ -76,8 +107,14 @@ namespace meta { template<typename... xs> using last = lift<first, reverse<xs...>>; - template<typename... xs> - using cons = detail::cons_<xs...>; + template<typename x, typename rest> + using cons = typename detail::cons_<x, rest>::type; + + template<typename xs, typename ys> + using append = typename detail::append_<xs, ys>; + + template<typename rest, typename... xs> + using list_ = typename detail::list__<rest, xs...>; } // ns meta |