commit 60c88ce3709a6586b40f143082c0790889166610
parent 904d3ff9a6e83ad394234290e317eea8f45e160c
Author: d.levin256@gmail.com <d.levin256@gmail.com>
Date: Tue, 26 Jul 2016 13:15:08 +0300
CoMeta: faster compilation of cforeach
Diffstat:
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/include/kfr/cometa.hpp b/include/kfr/cometa.hpp
@@ -1167,18 +1167,6 @@ CID_INTRIN void cforeach(cvals_t<T, v0, values...>, Fn&& fn)
cforeach(cvals_t<T, values...>(), std::forward<Fn>(fn));
}
-template <typename Fn>
-CID_INTRIN void cforeach(ctypes_t<>, Fn&&)
-{
-}
-
-template <typename T0, typename... types, typename Fn>
-CID_INTRIN void cforeach(ctypes_t<T0, types...>, Fn&& fn)
-{
- fn(ctype<T0>);
- cforeach(ctypes_t<types...>(), std::forward<Fn>(fn));
-}
-
template <typename T, typename Fn, CMT_ENABLE_IF(has_begin_end<T>::value)>
CID_INTRIN void cforeach(T&& list, Fn&& fn)
{
@@ -1204,6 +1192,17 @@ CID_INTRIN void cforeach_tuple_impl(const std::tuple<Ts...>& tuple, Fn&& fn, csi
{
swallow{ (fn(std::get<indices>(tuple)), void(), 0)... };
}
+template <typename T0, typename... types, typename Fn, size_t... indices>
+CID_INTRIN void cforeach_types_impl(ctypes_t<T0, types...>, Fn&& fn, csizes_t<indices...>)
+{
+ swallow{ (fn(ctype<type_of<details::get_nth_type<indices, T0, types...>>>), void(), 0)... };
+}
+}
+
+template <typename... Ts, typename Fn>
+CID_INTRIN void cforeach(ctypes_t<Ts...> types, Fn&& fn)
+{
+ details::cforeach_types_impl(types, std::forward<Fn>(fn), csizeseq<sizeof...(Ts)>);
}
template <typename... Ts, typename Fn>