/prelude/tlists.hpp

http://github.com/Eelis/geordi · C++ Header · 38 lines · 25 code · 12 blank · 1 comment · 0 complexity · 0111ea785bd8ccf7651bfe90d55e7a09 MD5 · raw file

  1. #ifndef TLISTS_HPP
  2. #define TLISTS_HPP
  3. #include <string>
  4. namespace tlists
  5. {
  6. template <typename...> struct tlist;
  7. template <typename H, typename T> struct cons;
  8. template <typename H, typename... T> struct cons<H, tlist<T...> > { typedef tlist<H, T...> type; };
  9. template <size_t, typename> struct group;
  10. // group_successive
  11. template <typename, size_t, typename...> struct group_successive_impl;
  12. template <typename A, typename B, typename... T>
  13. struct group_successive_impl<A, 0, B, T...>
  14. { typedef typename group_successive_impl<B, 1, T...>::type type; };
  15. template <typename A, size_t N, typename... T>
  16. struct group_successive_impl<A, N, A, T...>
  17. { typedef typename group_successive_impl<A, N + 1, T...>::type type; };
  18. template <typename A, size_t N, typename B, typename... T>
  19. struct group_successive_impl<A, N, B, T...>
  20. { typedef typename cons<group<N, A>, typename group_successive_impl<B, 1, T...>::type>::type type; };
  21. template <typename A> struct group_successive_impl<A, 0> { typedef tlist<> type; };
  22. template <typename A, size_t N> struct group_successive_impl<A, N>
  23. { typedef tlist<group<N, A> > type; };
  24. template <typename... T> struct group_successive: group_successive_impl<void, 0, T...> {};
  25. }
  26. #endif // header guard