#ifndef PFOR_PFOR_EXPRESSION_TAGGER_H #define PFOR_PFOR_EXPRESSION_TAGGER_H #include "access.h" #include "algorithm.h" #include "expression.h" #include "operandtag.h" #include "op.h" #include "../mp/pack.h" namespace pfor { namespace expr { namespace impl { template struct ExpressionTagger; template struct ExpressionTagger { static constexpr Access faccess = WorstAccess::access>::value; static constexpr Access taccess = WorstAccess::access>::value; using first = typename ExpressionTagger::type; using type = typename ExpressionTagger::type; }; template struct ExpressionTagger> { using type = typename ExpressionTagger::type; }; template struct ExpressionTagger> { static constexpr Access waccess = WorstAccess::access>::value; using type = PackAppend>; }; template struct ExpressionTagger, Id, Index>> { static constexpr Access waccess = WorstAccess::access>::value; using type = PackAppend>; }; template struct ExpressionTagger> { static constexpr Access waccess = WorstAccess::access>::value; using type = PackAppend>>; }; template struct ExpressionTagger { using tagcond = typename ExpressionTagger::type; using tagtrue = typename ExpressionTagger::type; using type = typename ExpressionTagger::type; }; } template struct ExpressionTaggerImpl; template struct ExpressionTaggerImpl> { using type = typename impl::ExpressionTagger, Access::read, Op, 0, Ts...>::type; }; template using ExpressionTagger = typename ExpressionTaggerImpl::type; } } #endif