Commit 14a25e76 authored by Praetorius, Simon's avatar Praetorius, Simon

Merge branch 'feature/macros' into 'develop'

introduce macros FWD and TYPEOF to reducine typing of std::forward and decltype

See merge request !90
parents 43e0a683 227d7857
Pipeline #1774 canceled with stage
...@@ -138,7 +138,7 @@ namespace AMDiS ...@@ -138,7 +138,7 @@ namespace AMDiS
template <class LocalContext, class Operator, class... Nodes> template <class LocalContext, class Operator, class... Nodes>
auto makeAssembler(Operator&& op, Nodes const&...) auto makeAssembler(Operator&& op, Nodes const&...)
{ {
return Assembler<LocalContext, Underlying_t<Operator>, Nodes...>{std::forward<Operator>(op)}; return Assembler<LocalContext, Underlying_t<Operator>, Nodes...>{FWD(op)};
} }
} // end namespace AMDiS } // end namespace AMDiS
...@@ -82,8 +82,7 @@ namespace AMDiS ...@@ -82,8 +82,7 @@ namespace AMDiS
} }
}; };
using NodeDataTransferContainer = std::decay_t<decltype( using NodeDataTransferContainer = TYPEOF(makeTreeContainer<Tree, NDT>(std::declval<const Tree&>(), NDT()));
makeTreeContainer<Tree, NDT>(std::declval<const Tree&>(), NDT()))>;
// Returns the Node's NodeElementData // Returns the Node's NodeElementData
struct NodeElementData struct NodeElementData
...@@ -97,8 +96,7 @@ namespace AMDiS ...@@ -97,8 +96,7 @@ namespace AMDiS
} }
}; };
using ElementData = std::decay_t<decltype( using ElementData = TYPEOF(makeTreeContainer<Tree, NodeElementData>(std::declval<const Tree&>(), NodeElementData()));
makeTreeContainer<Tree, NodeElementData>(std::declval<const Tree&>(), NodeElementData()))>;
public: public:
// Container with data that persists during grid adaptation // Container with data that persists during grid adaptation
......
...@@ -41,16 +41,16 @@ namespace AMDiS ...@@ -41,16 +41,16 @@ namespace AMDiS
template <class BM, class Values, template <class BM, class Values,
REQUIRES(Concepts::Functor<Values, Range(Domain)>) > REQUIRES(Concepts::Functor<Values, Range(Domain)>) >
DirichletBC(BM&& boundaryManager, BoundaryType id, Values&& values) DirichletBC(BM&& boundaryManager, BoundaryType id, Values&& values)
: Super(std::forward<BM>(boundaryManager), id) : Super(FWD(boundaryManager), id)
, values_(std::forward<Values>(values)) , values_(FWD(values))
{} {}
template <class Predicate, class Values, template <class Predicate, class Values,
REQUIRES(Concepts::Functor<Predicate, bool(Domain)>), REQUIRES(Concepts::Functor<Predicate, bool(Domain)>),
REQUIRES(Concepts::Functor<Values, Range(Domain)>)> REQUIRES(Concepts::Functor<Values, Range(Domain)>)>
DirichletBC(Predicate&& predicate, Values&& values) DirichletBC(Predicate&& predicate, Values&& values)
: predicate_(std::forward<Predicate>(predicate)) : predicate_(FWD(predicate))
, values_(std::forward<Values>(values)) , values_(FWD(values))
{} {}
template <class Intersection> template <class Intersection>
......
...@@ -70,7 +70,7 @@ namespace AMDiS ...@@ -70,7 +70,7 @@ namespace AMDiS
**/ **/
template <class GF> template <class GF>
GridFunctionOperatorBase(GF&& gridFct, int termOrder) GridFunctionOperatorBase(GF&& gridFct, int termOrder)
: gridFct_(std::forward<GF>(gridFct)) : gridFct_(FWD(gridFct))
, termOrder_(termOrder) , termOrder_(termOrder)
{} {}
...@@ -80,7 +80,7 @@ namespace AMDiS ...@@ -80,7 +80,7 @@ namespace AMDiS
{ {
using ctype = typename Geometry::ctype; using ctype = typename Geometry::ctype;
quadFactory_.emplace( quadFactory_.emplace(
makeQuadratureFactory<ctype, LocalContext::mydimension, LocalFunction>(std::forward<PreQuadFactory>(pre))); makeQuadratureFactory<ctype, LocalContext::mydimension, LocalFunction>(FWD(pre)));
} }
protected: protected:
...@@ -157,14 +157,14 @@ namespace AMDiS ...@@ -157,14 +157,14 @@ namespace AMDiS
template <class... Args, template <class... Args,
std::enable_if_t<Dune::Std::is_detected<Constructable, Transposed, Args...>::value, int> = 0> std::enable_if_t<Dune::Std::is_detected<Constructable, Transposed, Args...>::value, int> = 0>
GridFunctionOperatorTransposed(Args&&... args) GridFunctionOperatorTransposed(Args&&... args)
: transposedOp_(std::forward<Args>(args)...) : transposedOp_(FWD(args)...)
{} {}
/// Redirects the setQuadFactory call top the transposed operator /// Redirects the setQuadFactory call top the transposed operator
template <class PreQuadFactory> template <class PreQuadFactory>
void setQuadFactory(PreQuadFactory&& pre) void setQuadFactory(PreQuadFactory&& pre)
{ {
transposedOp_.setQuadFactory(std::forward<PreQuadFactory>(pre)); transposedOp_.setQuadFactory(FWD(pre));
} }
private: private:
...@@ -210,9 +210,8 @@ namespace AMDiS ...@@ -210,9 +210,8 @@ namespace AMDiS
template <class Tag, class Expr, class... QuadratureArgs> template <class Tag, class Expr, class... QuadratureArgs>
auto makeOperator(Tag tag, Expr&& expr, QuadratureArgs&&... args) auto makeOperator(Tag tag, Expr&& expr, QuadratureArgs&&... args)
{ {
auto pqf = makePreQuadratureFactory(std::forward<QuadratureArgs>(args)...); auto pqf = makePreQuadratureFactory(FWD(args)...);
using PreGridFctOp = PreGridFunctionOperator<Tag, std::decay_t<Expr>, decltype(pqf)>; return PreGridFunctionOperator<Tag, TYPEOF(expr), TYPEOF(pqf)>{tag, FWD(expr), std::move(pqf)};
return PreGridFctOp{tag, std::forward<Expr>(expr), std::move(pqf)};
} }
/** @} **/ /** @} **/
...@@ -238,9 +237,8 @@ namespace AMDiS ...@@ -238,9 +237,8 @@ namespace AMDiS
template <class Context, class Tag, class GF, class QF> template <class Context, class Tag, class GF, class QF>
auto makeGridFunctionOperator(Tag tag, GF&& gf, QF&& qf) auto makeGridFunctionOperator(Tag tag, GF&& gf, QF&& qf)
{ {
using GridFctOp = GridFunctionOperator<Tag, Context, std::decay_t<GF>>; GridFunctionOperator<Tag, Context, TYPEOF(gf)> gfo{tag, FWD(gf)};
GridFctOp gfo{tag, std::forward<GF>(gf)}; gfo.setQuadFactory(FWD(qf));
gfo.setQuadFactory(std::forward<QF>(qf));
return gfo; return gfo;
} }
......
...@@ -11,9 +11,9 @@ namespace AMDiS ...@@ -11,9 +11,9 @@ namespace AMDiS
template <class GF, class GridView, class QuadProvider> template <class GF, class GridView, class QuadProvider>
auto integrateImpl(GF&& gf, GridView const& gridView, QuadProvider makeQuad) auto integrateImpl(GF&& gf, GridView const& gridView, QuadProvider makeQuad)
{ {
auto localFct = localFunction(std::forward<GF>(gf)); auto localFct = localFunction(FWD(gf));
using GridFct = std::decay_t<GF>; using GridFct = remove_cvref_t<GF>;
using Range = typename GridFct::Range; using Range = typename GridFct::Range;
Range result(0); Range result(0);
...@@ -34,7 +34,7 @@ namespace AMDiS ...@@ -34,7 +34,7 @@ namespace AMDiS
template <class GF, class GridView, class QuadProvider> template <class GF, class GridView, class QuadProvider>
auto integrateImpl(GF&& gf, GridView const& gv, QuadProvider makeQuad, std::true_type) auto integrateImpl(GF&& gf, GridView const& gv, QuadProvider makeQuad, std::true_type)
{ {
return integrateImpl(std::forward<GF>(gf), gv, makeQuad); return integrateImpl(FWD(gf), gv, makeQuad);
} }
template <class GF, class GV, class QP> template <class GF, class GV, class QP>
...@@ -55,10 +55,10 @@ namespace AMDiS ...@@ -55,10 +55,10 @@ namespace AMDiS
template <class Expr, class GridView> template <class Expr, class GridView>
auto integrate(Expr&& expr, GridView const& gridView) auto integrate(Expr&& expr, GridView const& gridView)
{ {
auto&& gridFct = makeGridFunction(std::forward<Expr>(expr), gridView); auto&& gridFct = makeGridFunction(FWD(expr), gridView);
// test whether the gridFct model `Concepts::HasLocalFunctionOrder` // test whether the gridFct model `Concepts::HasLocalFunctionOrder`
using GF = std::decay_t<decltype(gridFct)>; using GF = TYPEOF(gridFct);
static const bool expr_has_order = Concepts::HasLocalFunctionOrder<GF>; static const bool expr_has_order = Concepts::HasLocalFunctionOrder<GF>;
static_assert(expr_has_order, static_assert(expr_has_order,
"Polynomial degree of expression can not be deduced. You need to provide an explicit value for the quadrature degree or a quadrature rule in `integrate()`."); "Polynomial degree of expression can not be deduced. You need to provide an explicit value for the quadrature degree or a quadrature rule in `integrate()`.");
...@@ -66,8 +66,7 @@ namespace AMDiS ...@@ -66,8 +66,7 @@ namespace AMDiS
using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>; using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
auto makeQuad = [](auto&& t, auto&& lf) { return Rules::rule(t, order(lf)); }; auto makeQuad = [](auto&& t, auto&& lf) { return Rules::rule(t, order(lf)); };
return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView, makeQuad, return Impl::integrateImpl(FWD(gridFct), gridView, makeQuad, bool_<expr_has_order>);
std::integral_constant<bool,expr_has_order>{});
} }
...@@ -83,9 +82,8 @@ namespace AMDiS ...@@ -83,9 +82,8 @@ namespace AMDiS
class QuadratureRule = Dune::QuadratureRule<typename GridView::ctype, GridView::dimension>> class QuadratureRule = Dune::QuadratureRule<typename GridView::ctype, GridView::dimension>>
auto integrate(Expr&& expr, GridView const& gridView, QuadratureRule const& quad) auto integrate(Expr&& expr, GridView const& gridView, QuadratureRule const& quad)
{ {
auto&& gridFct = makeGridFunction(std::forward<Expr>(expr), gridView); auto&& gridFct = makeGridFunction(FWD(expr), gridView);
return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView, return Impl::integrateImpl(FWD(gridFct), gridView, [&](auto&&, auto&&) { return quad; });
[&](auto&&, auto&&) { return quad; });
} }
...@@ -102,8 +100,8 @@ namespace AMDiS ...@@ -102,8 +100,8 @@ namespace AMDiS
{ {
using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>; using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
auto&& gridFct = makeGridFunction(std::forward<Expr>(expr), gridView); auto&& gridFct = makeGridFunction(FWD(expr), gridView);
return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView, return Impl::integrateImpl(FWD(gridFct), gridView,
[&](auto const& type, auto&&) { return Rules::rule(type, degree, qt); }); [&](auto const& type, auto&&) { return Rules::rule(type, degree, qt); });
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <dune/grid/common/grid.hh> #include <dune/grid/common/grid.hh>
#include <amdis/common/ConceptsBase.hpp> #include <amdis/common/ConceptsBase.hpp>
#include <amdis/common/TypeTraits.hpp>
#include <amdis/gridfunctions/GridFunctionConcepts.hpp> #include <amdis/gridfunctions/GridFunctionConcepts.hpp>
...@@ -382,7 +383,7 @@ namespace AMDiS ...@@ -382,7 +383,7 @@ namespace AMDiS
template <class GF> template <class GF>
GridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid, GF&& gf) GridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid, GF&& gf)
: Super{name, grid} : Super{name, grid}
, gridFct_{makeGridFunction(std::forward<GF>(gf), grid->leafGridView())} , gridFct_{makeGridFunction(FWD(gf), grid->leafGridView())}
{} {}
/// \brief Implementation of \ref Marker::markElement. Does nothing since marking is /// \brief Implementation of \ref Marker::markElement. Does nothing since marking is
...@@ -402,11 +403,10 @@ namespace AMDiS ...@@ -402,11 +403,10 @@ namespace AMDiS
#if DUNE_HAVE_CXX_CLASS_TEMPLATE_ARGUMENT_DEDUCTION #if DUNE_HAVE_CXX_CLASS_TEMPLATE_ARGUMENT_DEDUCTION
// Deduction guide for GridFunctionMarker class // Deduction guide for GridFunctionMarker class
template <class Grid, class PreGridFct> template <class Grid, class GF>
GridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid, GridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid, GF&& gf)
PreGridFct&& preGridFct)
-> GridFunctionMarker<Grid, -> GridFunctionMarker<Grid,
std::decay_t<decltype(makeGridFunction(std::forward<PreGridFct>(preGridFct), grid->leafGridView()))>>; TYPEOF( makeGridFunction(FWD(gf), grid->leafGridView()) )>;
#endif #endif
// Generator function for GridFunctionMarker class // Generator function for GridFunctionMarker class
...@@ -414,9 +414,8 @@ namespace AMDiS ...@@ -414,9 +414,8 @@ namespace AMDiS
auto makeGridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid, auto makeGridFunctionMarker(std::string const& name, std::shared_ptr<Grid> const& grid,
PreGridFct&& preGridFct) PreGridFct&& preGridFct)
{ {
auto gridFct = makeGridFunction(std::forward<PreGridFct>(preGridFct), grid->leafGridView()); auto gridFct = makeGridFunction(FWD(preGridFct), grid->leafGridView());
using GridFct = decltype(gridFct); return GridFunctionMarker<Grid,TYPEOF(gridFct)>{name, grid, std::move(gridFct)};
return GridFunctionMarker<Grid,GridFct>{name, grid, gridFct};
} }
} // end namespace AMDiS } // end namespace AMDiS
......
...@@ -76,19 +76,19 @@ namespace AMDiS ...@@ -76,19 +76,19 @@ namespace AMDiS
template <class Op> template <class Op>
void push(tag::element_operator<Element>, Op&& op) void push(tag::element_operator<Element>, Op&& op)
{ {
element_.emplace_back(std::forward<Op>(op)); element_.emplace_back(FWD(op));
} }
template <class Op> template <class Op>
void push(tag::intersection_operator<Intersection>, Op&& op) void push(tag::intersection_operator<Intersection>, Op&& op)
{ {
intersection_.emplace_back(std::forward<Op>(op)); intersection_.emplace_back(FWD(op));
} }
template <class Op> template <class Op>
void push(tag::boundary_operator<Intersection> b, Op&& op) void push(tag::boundary_operator<Intersection> b, Op&& op)
{ {
boundary_.push_back({std::forward<Op>(op), b}); boundary_.push_back({FWD(op), b});
} }
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <fmt/core.h> #include <fmt/core.h>
#include <fmt/ostream.h> #include <fmt/ostream.h>
#include <amdis/common/TypeTraits.hpp>
/** /**
* \def AMDIS_ENABLE_MSG_DBG * \def AMDIS_ENABLE_MSG_DBG
* \brief The preprocessor constant enables the functions \ref AMDiS::MSG_DBG * \brief The preprocessor constant enables the functions \ref AMDiS::MSG_DBG
...@@ -66,12 +68,12 @@ namespace AMDiS ...@@ -66,12 +68,12 @@ namespace AMDiS
MPI_Comm_size(MPI_COMM_WORLD, &num_ranks); MPI_Comm_size(MPI_COMM_WORLD, &num_ranks);
if (num_ranks > 1 && rank == 0) { if (num_ranks > 1 && rank == 0) {
out << "[0] "; out << "[0] ";
fmt::print(out, std::forward<Args>(args)...); fmt::print(out, FWD(args)...);
} else if (num_ranks == 1) { } else if (num_ranks == 1) {
fmt::print(out, std::forward<Args>(args)...); fmt::print(out, FWD(args)...);
} }
#else #else
fmt::print(out, std::forward<Args>(args)...); fmt::print(out, FWD(args)...);
#endif #endif
return out; return out;
} }
...@@ -89,7 +91,7 @@ namespace AMDiS ...@@ -89,7 +91,7 @@ namespace AMDiS
template <class... Args> template <class... Args>
void msg(Args&&... args) void msg(Args&&... args)
{ {
Impl::msg(std::cout, std::forward<Args>(args)...) << std::endl; Impl::msg(std::cout, FWD(args)...) << std::endl;
} }
...@@ -103,7 +105,7 @@ namespace AMDiS ...@@ -103,7 +105,7 @@ namespace AMDiS
template <class... Args> template <class... Args>
void msg_(Args&&... args) void msg_(Args&&... args)
{ {
Impl::msg(std::cout, std::forward<Args>(args)...); Impl::msg(std::cout, FWD(args)...);
} }
...@@ -117,14 +119,14 @@ namespace AMDiS ...@@ -117,14 +119,14 @@ namespace AMDiS
void error_exit(Args&&... args) void error_exit(Args&&... args)
{ {
#ifdef AMDIS_NO_THROW #ifdef AMDIS_NO_THROW
Impl::msg(std::cerr << "ERROR: ", std::forward<Args>(args)...) << std::endl; Impl::msg(std::cerr << "ERROR: ", FWD(args)...) << std::endl;
#ifndef NDEBUG #ifndef NDEBUG
assert(false); assert(false);
#else #else
std::exit(EXIT_FAILURE); std::exit(EXIT_FAILURE);
#endif #endif
#else #else
throw std::runtime_error( std::string("ERROR: ") + fmt::format(std::forward<Args>(args)...)); throw std::runtime_error( std::string("ERROR: ") + fmt::format(FWD(args)...));
#endif #endif
} }
...@@ -141,14 +143,14 @@ namespace AMDiS ...@@ -141,14 +143,14 @@ namespace AMDiS
template <class... Args> template <class... Args>
void test_exit(bool condition, Args&&... args) void test_exit(bool condition, Args&&... args)
{ {
if (!condition) { error_exit(std::forward<Args>(args)...); } if (!condition) { error_exit(FWD(args)...); }
} }
template <class... Args> template <class... Args>
void warning(Args&&... args) void warning(Args&&... args)
{ {
Impl::msg(std::cout << "WARNING: ", std::forward<Args>(args)...) << std::endl; Impl::msg(std::cout << "WARNING: ", FWD(args)...) << std::endl;
} }
...@@ -161,7 +163,7 @@ namespace AMDiS ...@@ -161,7 +163,7 @@ namespace AMDiS
template <class... Args> template <class... Args>
void test_warning(bool condition, Args&&... args) void test_warning(bool condition, Args&&... args)
{ {
if (!condition) { warning(std::forward<Args>(args)...); } if (!condition) { warning(FWD(args)...); }
} }
...@@ -172,7 +174,7 @@ namespace AMDiS ...@@ -172,7 +174,7 @@ namespace AMDiS
* \ref AMDIS_ENABLE_MSG_DBG is set to 1, otherwise the function is empty. * \ref AMDIS_ENABLE_MSG_DBG is set to 1, otherwise the function is empty.
**/ **/
template <class... Args> template <class... Args>
void msg_dbg(Args&&... args) { msg(std::forward<Args>(args)...); } void msg_dbg(Args&&... args) { msg(FWD(args)...); }
/// \brief call assert_msg, in debug mode only /// \brief call assert_msg, in debug mode only
...@@ -183,7 +185,7 @@ namespace AMDiS ...@@ -183,7 +185,7 @@ namespace AMDiS
template <class... Args> template <class... Args>
void test_exit_dbg(bool condition, Args&&... args) void test_exit_dbg(bool condition, Args&&... args)
{ {
test_exit(condition, std::forward<Args>(args)...); test_exit(condition, FWD(args)...);
} }
#else #else
template <class... Args> template <class... Args>
......
...@@ -54,7 +54,7 @@ namespace AMDiS ...@@ -54,7 +54,7 @@ namespace AMDiS
public: public:
template <class BM> template <class BM>
PeriodicBC(BM&& boundaryManager, BoundaryType id, FaceTrafo faceTrafo) PeriodicBC(BM&& boundaryManager, BoundaryType id, FaceTrafo faceTrafo)
: Super(std::forward<BM>(boundaryManager), id) : Super(FWD(boundaryManager), id)
, faceTrafo_(std::move(faceTrafo)) , faceTrafo_(std::move(faceTrafo))
{} {}
......
...@@ -202,7 +202,7 @@ coords(Node const& tree, std::vector<std::size_t> const& localIndices) const ...@@ -202,7 +202,7 @@ coords(Node const& tree, std::vector<std::size_t> const& localIndices) const
auto geometry = node.element().geometry(); auto geometry = node.element().geometry();
auto const& localInterpol = node.finiteElement().localInterpolation(); auto const& localInterpol = node.finiteElement().localInterpolation();
using FiniteElement = std::decay_t<decltype(node.finiteElement())>; using FiniteElement = TYPEOF(node.finiteElement());
using DomainType = typename FiniteElement::Traits::LocalBasisType::Traits::DomainType; using DomainType = typename FiniteElement::Traits::LocalBasisType::Traits::DomainType;
using RangeType = typename FiniteElement::Traits::LocalBasisType::Traits::RangeType; using RangeType = typename FiniteElement::Traits::LocalBasisType::Traits::RangeType;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <utility> #include <utility>
#include <amdis/common/Mpl.hpp> #include <amdis/common/Mpl.hpp>
#include <amdis/common/TypeTraits.hpp>
namespace AMDiS namespace AMDiS
{ {
...@@ -15,7 +16,7 @@ namespace AMDiS ...@@ -15,7 +16,7 @@ namespace AMDiS
template <class F, class Tuple, std::size_t... I> template <class F, class Tuple, std::size_t... I>
constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>) constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
{ {
return f(std::get<I>(std::forward<Tuple>(t))...); return f(std::get<I>(FWD(t))...);
} }
template <class F, std::size_t I0, std::size_t... I> template <class F, std::size_t I0, std::size_t... I>
...@@ -28,31 +29,27 @@ namespace AMDiS ...@@ -28,31 +29,27 @@ namespace AMDiS
template <class F, class Tuple> template <class F, class Tuple>
constexpr decltype(auto) apply(F&& f, Tuple&& t) constexpr decltype(auto) apply(F&& f, Tuple&& t)
{ {
return Impl_::apply_impl( return Impl_::apply_impl(FWD(f), FWD(t),
std::forward<F>(f), std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>::value>{}); std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>::value>{});
} }
template <class F, class... Args> template <class F, class... Args>
constexpr decltype(auto) apply_variadic(F&& f, Args&&... args) constexpr decltype(auto) apply_variadic(F&& f, Args&&... args)
{ {
return apply(std::forward<F>(f), std::forward_as_tuple(args...)); return apply(FWD(f), std::forward_as_tuple(args...));
} }
template <class F, std::size_t N> template <class F, std::size_t N>
constexpr decltype(auto) apply_indices(F&& f, index_t<N>) constexpr decltype(auto) apply_indices(F&& f, index_t<N>)
{ {
return Impl_::apply_indices_impl( return Impl_::apply_indices_impl(FWD(f), index_t<0>{},
std::forward<F>(f),
index_t<0>{},
std::make_index_sequence<N>{}); std::make_index_sequence<N>{});
} }
template <class F, std::size_t I0, std::size_t I1> template <class F, std::size_t I0, std::size_t I1>
constexpr decltype(auto) apply_indices(F&& f, index_t<I0>, index_t<I1>) constexpr decltype(auto) apply_indices(F&& f, index_t<I0>, index_t<I1>)
{ {
return Impl_::apply_indices_impl( return Impl_::apply_indices_impl(FWD(f), index_t<I0>{},
std::forward<F>(f), index_t<I0>{},
std::make_index_sequence<I1-I0>{}); std::make_index_sequence<I1-I0>{});
} }
} }
......
...@@ -20,7 +20,7 @@ namespace AMDiS ...@@ -20,7 +20,7 @@ namespace AMDiS
{ {
template <class A, class B> template <class A, class B>
struct IsSimilar struct IsSimilar
: std::is_same<std::decay_t<A>, std::decay_t<B>> {}; : std::is_same<remove_cvref_t<A>, remove_cvref_t<B>> {};
template <class A, class B> template <class A, class B>
struct IsSimilar<Types<A>, Types<B>> struct IsSimilar<Types<A>, Types<B>>
...@@ -52,7 +52,7 @@ namespace AMDiS ...@@ -52,7 +52,7 @@ namespace AMDiS
struct Callable struct Callable
{ {
template <class F, class... Args> template <class F, class... Args>
auto requires_(F&& f, Args&&... args) -> decltype( f(std::forward<Args>(args)...)); auto requires_(F&& f, Args&&... args) -> decltype(f(FWD(args)...));
}; };
// idx[0] // idx[0]
......
...@@ -78,8 +78,7 @@ namespace AMDiS ...@@ -78,8 +78,7 @@ namespace AMDiS
template <class F, class... Args> template <class F, class... Args>
data_type const& get_or_init(key_type const& key, F&& f, Args&&... args) const data_type const& get_or_init(key_type const& key, F&& f, Args&&... args) const
{ {
return impl(std::is_default_constructible<data_type>{}, return impl(std::is_default_constructible<data_type>{}, key, FWD(f), FWD(args)...);
key, std::forward<F>(f), std::forward<Args>(args)...);
} }
private: private:
...@@ -90,7 +89,7 @@ namespace AMDiS ...@@ -90,7 +89,7 @@ namespace AMDiS
data_type empty; data_type empty;
auto it = cachedData_.emplace(key, std::move(empty)); auto it = cachedData_.emplace(key, std::move(empty));
if (it.second) { if (it.second) {
data_type data = f(key, std::forward<Args>(args)...); data_type data = f(key, FWD(args)...);
it.first->second = std::move(data); it.first->second = std::move(data);
} }
return it.first->second; return it.first->second;
...@@ -104,7 +103,7 @@ namespace AMDiS ...@@ -104,7 +103,7 @@ namespace AMDiS
if (it != cachedData_.end()) if (it != cachedData_.end())
return it->second; return it->second;
else { else {
data_type data = f(key, std::forward<Args>(args)...); data_type data = f(key, FWD(args)...);
auto it = cachedData_.emplace(key, std::move(data)); auto it = cachedData_.emplace(key, std::move(data));
return it.first->second; return it.first->second;
} }
...@@ -125,8 +124,7 @@ namespace AMDiS ...@@ -125,8 +124,7 @@ namespace AMDiS
template <class F, class... Args> template <class F, class... Args>
static data_type const& get_or_init(key_type const& key, F&& f, Args&&... args) static data_type const& get_or_init(key_type const& key, F&& f, Args&&... args)
{ {
return impl(std::is_default_constructible<data_type>{}, return impl(std::is_default_constructible<data_type>{}, key, FWD(f), FWD(args)...);
key, std::forward<F>(f), std::forward<Args>(args)...);
} }