#ifndef PFOR_PFOR_CLUSTERS_H #define PFOR_PFOR_CLUSTERS_H #include "comparators.h" #include "conditions.h" #include "expression/algorithm.h" #include "expression/tuple.h" #include "expression/info.h" #include "expression/subexpression.h" #include "mp/pack.h" #include "mp/tuple.h" #include "parallelizable.h" namespace pfor { /** */ template struct ClusterExpressionIdsImpl; template struct ClusterExpressionIdsImpl, Ts...>> { using type = PackPrepend>::type, I>; }; template<> struct ClusterExpressionIdsImpl> { using type = Pack<>; }; template using ClusterExpressionIds = typename ClusterExpressionIdsImpl::type; /** */ template struct ClustersExpressionIdsImpl; template struct ClustersExpressionIdsImpl> { using type = PackPrepend>::type, ClusterExpressionIds>; }; template<> struct ClustersExpressionIdsImpl> { using type = Pack<>; }; template using ClustersExpressionIds = typename ClustersExpressionIdsImpl::type; /** */ template> struct ClustersInsertImpl; template struct ClustersInsertImpl, E, IndependantClusters, CurrentCluster> { static constexpr bool depends = clusterDepends; using next_clusters = Pack; using tmp_independant_clusters = PackRemove; using new_independant_clusters = If; using tmp_current_cluster = PackSort>; using new_current_cluster = If; using type = typename ClustersInsertImpl::type; }; template struct ClustersInsertImpl, E, IndependantClusters, CurrentCluster> { using type = PackAppend; }; template using ClustersInsert = typename ClustersInsertImpl::type; /** */ namespace impl { template struct ClustersGenImpl; template struct ClustersGenImpl> { using tmp_out = ClustersInsert; using type = typename ClustersGenImpl>::type; }; template struct ClustersGenImpl> { using type = Clusters; }; template using ClustersGen = typename ClustersGenImpl, ExprInfo>::type; } template struct ClustersGen { using comma_splitted_expr = expr::SplitComma; using expr_info = expr::ExpressionInfo; using clusters = impl::ClustersGen; using clusters_ids = ClustersExpressionIds; using type = PackSort; }; /** */ template struct FilterClustersImpl; template struct FilterClustersImpl> { using expr_type = expr::ExpressionsTuple; using tuple_type = SubTuple; using subexpr_type = expr::SubExpression; using merge_cluster = If, Cluster, Pack<>>; using next = typename FilterClustersImpl>::type; using type = PackMerge; }; template struct FilterClustersImpl> { using type = Pack<>; }; template using FilterClusters = typename FilterClustersImpl::type; /** */ template using SequentialCluster = typename FilterClustersImpl::type; /** */ template using ParallelCluster = typename FilterClustersImpl::type; /** */ template struct ExpressionFromClusters; } #endif