1#ifndef __DUNE_ACFEM_EXPRESSIONS_OPTIMIZATIONBASE_HH__
2#define __DUNE_ACFEM_EXPRESSIONS_OPTIMIZATIONBASE_HH__
6#include "operationtraits.hh"
7#include "optimizationprofile.hh"
39 template<std::
size_t N>
43 static constexpr std::size_t level_ = N;
49 static constexpr std::size_t level_ = 0;
52 template<
class Tag, std::
size_t Incr = 1>
53 using OptimizeNext = OptimizeTag<Tag::level_ -
Incr>;
55 template<
class Tag, std::
size_t Incr = 1>
56 using OptimizePrior = OptimizeTag<Tag::level_ + Incr>;
130 template<std::
size_t N>
133 return OptimizeTag<N-1>{};
143 template<
class F,
class... T, std::enable_if_t<IsFunctor<F>::value,
int> = 0>
144 constexpr decltype(
auto) operate(
DontOptimize, F&& f, T&&... t)
146 static_assert(IsFunctor<F>::value,
"F is not an expression functor.");
147 return std::forward<F>(f)(std::forward<T>(t)...);
150 template<
class Operation,
class... T>
151 constexpr decltype(
auto) operate(
DontOptimize, T&&... t)
153 return F<Operation>{}(std::forward<T>(t)...);
158 constexpr decltype(
auto) operate(
DontOptimize, OperationTraits<IdentityOperation>, T&& t)
160 DUNE_ACFEM_RECORD_OPTIMIZATION;
162 return forwardReturnValue<T>(t);
166 constexpr decltype(
auto) operate(
DontOptimize, OperationTraits<PlusOperation>, T&& t)
168 DUNE_ACFEM_RECORD_OPTIMIZATION;
170 return forwardReturnValue<T>(t);
176 template<
class F,
class... T, std::enable_if_t<IsFunctor<F>::value,
int> = 0>
177 constexpr decltype(
auto) operate(F&& f, T&&... t)
179#if DUNE_ACFEM_TRACE_OPTIMIZATION
180 std::clog <<
"<<<<<<<< OptmizeTop <<<<<<<<<" << std::endl;
182 return operate(
OptimizeTop{}, std::forward<F>(f), std::forward<T>(t)...);
185 template<
class Operation,
class... T>
186 constexpr decltype(
auto) operate(T&&... t)
188#if DUNE_ACFEM_TRACE_OPTIMIZATION
189 std::clog <<
"<<<<<<<< OptmizeTop <<<<<<<<<" << std::endl;
191 return operate(
OptimizeTop{}, F<Operation>{}, std::forward<T>(t)...);
196 template<
class Optimize,
class T, std::size_t... I>
197 constexpr decltype(
auto) evaluateExpander(Optimize, T&& t, IndexSequence<I...>)
199 return operate(Optimize{}, std::forward<T>(t).operation(), std::forward<T>(t).template operand<I>()...);
205 template<
class Optimize,
class T>
218 template<std::size_t N,
class F,
class... T>
219 constexpr decltype(
auto) finalize(OptimizeTag<N>, F&& f, T&&... t)
223 OptimizeTag<N>{}, std::forward<F>(f), std::forward<T>(t)...
228 template<
class F,
class... T,
229 std::enable_if_t<IsFunctor<F>::value,
int> = 0>
230 constexpr decltype(
auto) finalize(F&& f, T&&... t)
234 std::forward<F>(f), std::forward<T>(t)...
239 template<
class Operation,
class... T>
240 constexpr decltype(
auto) finalize(T&&... t)
243 operate<Operation>(std::forward<T>(t)...)
254 template<
class OptOrF,
class... Rest>
256 decltype(operate(std::declval<OptOrF>(), std::declval<Rest>()...));
261 decltype(
evaluate(std::declval<T>()));
constexpr decltype(auto) expressionClosure(T &&t)
Do-nothing default implementation for pathologic cases.
Definition: interface.hh:93
OptimizeTag< Policy::OptimizationLevelMax::value > OptimizeTop
The top-level optmization tag.
Definition: optimizationbase.hh:59
decltype(evaluate(std::declval< T >())) EvaluatedType
(Re-)evaluate a given expression or Expressions::Storage.
Definition: optimizationbase.hh:261
constexpr decltype(auto) evaluate(T &&t)
Evaluate an expression or expression Expressions::Storage container.
Definition: optimizationbase.hh:213
decltype(operate(std::declval< OptOrF >(), std::declval< Rest >()...)) ExpressionType
Generate the type of an expression by calling operate().
Definition: optimizationbase.hh:256
OptimizeTag< 0 > DontOptimize
Bottom level is overloaded to do nothing.
Definition: optimizationbase.hh:74
MakeSequence< std::size_t, N, Offset, Stride, Repeat > MakeIndexSequence
Make a sequence of std::size_t elements.
Definition: generators.hh:34
Constant< typename Const::value_type, Const::value+1 > Incr
Increment an integral_constant.
Definition: types.hh:79
Optimization pattern disambiguation struct.
Definition: optimizationbase.hh:42