replace/remove static for macros
This commit is contained in:
parent
53362be499
commit
c26fb133ae
8 changed files with 54 additions and 94 deletions
|
@ -6,7 +6,7 @@ namespace MultiArrayTools
|
||||||
template <typename... T>
|
template <typename... T>
|
||||||
std::ostream& operator<<(std::ostream& out, const std::tuple<T...>& tp)
|
std::ostream& operator<<(std::ostream& out, const std::tuple<T...>& tp)
|
||||||
{
|
{
|
||||||
MA_SFOR(i,0,sizeof...(T)-1,i+1, out << std::get<i>(tp) << ", ";);
|
sfor_pn<0,sizeof...(T)-1>( [&](auto i){ out << std::get<i>(tp) << ", "; return 0; } );
|
||||||
out << std::get<sizeof...(T)-1>(tp);
|
out << std::get<sizeof...(T)-1>(tp);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,7 @@ namespace MultiArrayTools
|
||||||
auto getIndex()
|
auto getIndex()
|
||||||
-> std::shared_ptr<typename RangeType::IndexType>
|
-> std::shared_ptr<typename RangeType::IndexType>
|
||||||
{
|
{
|
||||||
static_assert( RangeType::defaultable,
|
static_assert( RangeType::defaultable, "Range not defaultable" );
|
||||||
/*typeid(typename RangeType).name() + */" is not defaultable" );
|
|
||||||
static auto f = RangeType::factory();
|
static auto f = RangeType::factory();
|
||||||
static auto r = std::dynamic_pointer_cast<RangeType>( f.create() );
|
static auto r = std::dynamic_pointer_cast<RangeType>( f.create() );
|
||||||
return std::make_shared<typename RangeType::IndexType>(r);
|
return std::make_shared<typename RangeType::IndexType>(r);
|
||||||
|
|
|
@ -206,9 +206,9 @@ namespace MultiArrayTools
|
||||||
(*this) = in;
|
(*this) = in;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MA_SCFOR2(i,0,sizeof...(SRanges),i+1,
|
sfor_p<0,sizeof...(SRanges),0>
|
||||||
std::get<i>(MAB::mRange->space()).get() == std::get<i>(in.mRange->space()).get(),
|
( [&](auto i) { return std::get<i>(MAB::mRange->space()).get() == std::get<i>(in.mRange->space()).get(); },
|
||||||
operator&&);
|
[&](auto a, auto b) { return a and b; });
|
||||||
for(size_t i = 0; i != mCont.size(); ++i){
|
for(size_t i = 0; i != mCont.size(); ++i){
|
||||||
mCont[i] += in.mCont[i];
|
mCont[i] += in.mCont[i];
|
||||||
}
|
}
|
||||||
|
@ -223,9 +223,9 @@ namespace MultiArrayTools
|
||||||
(*this) = in;
|
(*this) = in;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MA_SCFOR2(i,0,sizeof...(SRanges),i+1,
|
sfor_p<0,sizeof...(SRanges),0>
|
||||||
std::get<i>(MAB::mRange->space()).get() == std::get<i>(in.mRange->space()).get(),
|
( [&](auto i) { return std::get<i>(MAB::mRange->space()).get() == std::get<i>(in.mRange->space()).get(); },
|
||||||
operator&&);
|
[&](auto a, auto b) { return a and b; });
|
||||||
for(size_t i = 0; i != mCont.size(); ++i){
|
for(size_t i = 0; i != mCont.size(); ++i){
|
||||||
mCont[i] -= in.mCont[i];
|
mCont[i] -= in.mCont[i];
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,7 +216,6 @@ namespace MultiArrayTools
|
||||||
template <typename T, class IOp, class Target, class OpClass, OpIndexAff OIA>
|
template <typename T, class IOp, class Target, class OpClass, OpIndexAff OIA>
|
||||||
inline DExt AssignmentExpr<T,IOp,Target,OpClass,OIA>::dExtension() const
|
inline DExt AssignmentExpr<T,IOp,Target,OpClass,OIA>::dExtension() const
|
||||||
{
|
{
|
||||||
CHECK;
|
|
||||||
return nullptr; //???!!!
|
return nullptr; //???!!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +242,10 @@ namespace MultiArrayTools
|
||||||
template <class Expr>
|
template <class Expr>
|
||||||
auto MOp<T,Ops...>::loop(Expr exp) const
|
auto MOp<T,Ops...>::loop(Expr exp) const
|
||||||
{
|
{
|
||||||
return MA_SCRAFOR(i,sizeof...(Ops),0,i-1,std::get<i>(mOps.mOps),loop,exp);
|
return sfor_m<sizeof...(Ops),0>
|
||||||
|
( [&](auto i){ return std::get<i>(mOps.mOps); },
|
||||||
|
[&](auto f, auto next) { return f.loop(next); },
|
||||||
|
exp );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ops>
|
template <typename T, class... Ops>
|
||||||
|
@ -331,7 +333,6 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
mIndex(indices...);
|
mIndex(indices...);
|
||||||
mDataPtr = mOrigDataPtr + mIndex.pos();
|
mDataPtr = mOrigDataPtr + mIndex.pos();
|
||||||
//mOff = mIndex.pos();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
|
@ -342,21 +343,19 @@ namespace MultiArrayTools
|
||||||
mIndex( ind )
|
mIndex( ind )
|
||||||
{
|
{
|
||||||
mDataPtr = mOrigDataPtr + mIndex.pos();
|
mDataPtr = mOrigDataPtr + mIndex.pos();
|
||||||
//mOff = mIndex.pos();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
template <class ET>
|
template <class ET>
|
||||||
inline const T& ConstOperationRoot<T,Ranges...>::get(ET pos) const
|
inline const T& ConstOperationRoot<T,Ranges...>::get(ET pos) const
|
||||||
{
|
{
|
||||||
return mDataPtr[pos.val()/*+mOff*/];
|
return mDataPtr[pos.val()];
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
template <typename V, class ET>
|
template <typename V, class ET>
|
||||||
inline const V& ConstOperationRoot<T,Ranges...>::vget(ET pos) const
|
inline const V& ConstOperationRoot<T,Ranges...>::vget(ET pos) const
|
||||||
{
|
{
|
||||||
//VCHECK(pos.val());
|
|
||||||
return *(reinterpret_cast<const V*>(mDataPtr+pos.val()));
|
return *(reinterpret_cast<const V*>(mDataPtr+pos.val()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,8 +363,6 @@ namespace MultiArrayTools
|
||||||
template <class ET>
|
template <class ET>
|
||||||
inline ConstOperationRoot<T,Ranges...>& ConstOperationRoot<T,Ranges...>::set(ET pos)
|
inline ConstOperationRoot<T,Ranges...>& ConstOperationRoot<T,Ranges...>::set(ET pos)
|
||||||
{
|
{
|
||||||
//mIndex = pos.val();
|
|
||||||
//mDataPtr = mOrigDataPtr + mIndex.pos();
|
|
||||||
mDataPtr = mOrigDataPtr + pos.val();
|
mDataPtr = mOrigDataPtr + pos.val();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -373,8 +370,6 @@ namespace MultiArrayTools
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
const T* ConstOperationRoot<T,Ranges...>::data() const
|
const T* ConstOperationRoot<T,Ranges...>::data() const
|
||||||
{
|
{
|
||||||
//auto i = mIndex;
|
|
||||||
//return mOrigDataPtr/* + i().pos()*/;
|
|
||||||
return mDataPtr;
|
return mDataPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,9 +447,6 @@ namespace MultiArrayTools
|
||||||
inline typename MetaOperationRoot<Range>::value_type
|
inline typename MetaOperationRoot<Range>::value_type
|
||||||
MetaOperationRoot<Range>::get(ET pos) const
|
MetaOperationRoot<Range>::get(ET pos) const
|
||||||
{
|
{
|
||||||
//VCHECK(pos.val());
|
|
||||||
//VCHECK(mDataPtr);
|
|
||||||
//VCHECK(mDataPtr[pos.val()])
|
|
||||||
return (mWorkIndex = pos.val()).meta();
|
return (mWorkIndex = pos.val()).meta();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -471,7 +463,6 @@ namespace MultiArrayTools
|
||||||
template <class ET>
|
template <class ET>
|
||||||
inline MetaOperationRoot<Range>& MetaOperationRoot<Range>::set(ET pos)
|
inline MetaOperationRoot<Range>& MetaOperationRoot<Range>::set(ET pos)
|
||||||
{
|
{
|
||||||
//(*mIndex) = pos.val();
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -646,7 +637,6 @@ namespace MultiArrayTools
|
||||||
OperationRoot<T,Ranges...>& OperationRoot<T,Ranges...>::operator+=(const OpClass& in)
|
OperationRoot<T,Ranges...>& OperationRoot<T,Ranges...>::operator+=(const OpClass& in)
|
||||||
{
|
{
|
||||||
VExec<OpClass::VABLE>::template exec<xxxplus>(*this,in);
|
VExec<OpClass::VABLE>::template exec<xxxplus>(*this,in);
|
||||||
//plus(in)();
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -673,7 +663,6 @@ namespace MultiArrayTools
|
||||||
template <typename V, class ET>
|
template <typename V, class ET>
|
||||||
inline V& OperationRoot<T,Ranges...>::vget(ET pos) const
|
inline V& OperationRoot<T,Ranges...>::vget(ET pos) const
|
||||||
{
|
{
|
||||||
//VCHECK(pos.val());
|
|
||||||
return *(reinterpret_cast<V*>(mDataPtr+pos.val()));
|
return *(reinterpret_cast<V*>(mDataPtr+pos.val()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,8 +670,6 @@ namespace MultiArrayTools
|
||||||
template <class ET>
|
template <class ET>
|
||||||
inline OperationRoot<T,Ranges...>& OperationRoot<T,Ranges...>::set(ET pos)
|
inline OperationRoot<T,Ranges...>& OperationRoot<T,Ranges...>::set(ET pos)
|
||||||
{
|
{
|
||||||
//mIndex = pos.val();
|
|
||||||
//mDataPtr = mOrigDataPtr + mIndex.pos();
|
|
||||||
mDataPtr = mOrigDataPtr + pos.val();
|
mDataPtr = mOrigDataPtr + pos.val();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -703,8 +690,6 @@ namespace MultiArrayTools
|
||||||
template <typename T, class... Ranges>
|
template <typename T, class... Ranges>
|
||||||
T* OperationRoot<T,Ranges...>::data() const
|
T* OperationRoot<T,Ranges...>::data() const
|
||||||
{
|
{
|
||||||
//auto i = mIndex;
|
|
||||||
//return mOrigDataPtr/* + i().pos()*/;
|
|
||||||
return mDataPtr;
|
return mDataPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,7 +1048,10 @@ namespace MultiArrayTools
|
||||||
template <class Expr>
|
template <class Expr>
|
||||||
auto Operation<T,OpFunction,Ops...>::loop(Expr exp) const
|
auto Operation<T,OpFunction,Ops...>::loop(Expr exp) const
|
||||||
{
|
{
|
||||||
return MA_SCRAFOR(i,sizeof...(Ops),0,i-1,std::get<i>(mOps.mOps),loop,exp);
|
return sfor_m<sizeof...(Ops),0>
|
||||||
|
( [&](auto i){ return std::get<i>(mOps.mOps); },
|
||||||
|
[&](auto f, auto next) { return f.loop(next); },
|
||||||
|
exp );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -310,7 +310,9 @@ namespace MultiArrayTools
|
||||||
template <class... Ops>
|
template <class... Ops>
|
||||||
auto OperationTuple<Ops...>::rootSteps(std::intptr_t iPtrNum) const
|
auto OperationTuple<Ops...>::rootSteps(std::intptr_t iPtrNum) const
|
||||||
{
|
{
|
||||||
return MA_SCFOR(i,0,sizeof...(Ops),i+1,std::get<i>(mOps).rootSteps(iPtrNum),extend);
|
return sfor_p<0,sizeof...(Ops)>
|
||||||
|
( [&](auto i){ return std::get<i>(mOps).rootSteps(iPtrNum); },
|
||||||
|
[&](auto f, auto next) { return f.extend(next); } );
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class... Ops>
|
template <typename T, class... Ops>
|
||||||
|
@ -778,42 +780,6 @@ namespace MultiArrayTools
|
||||||
T const** data() const { assert(0); return nullptr; }
|
T const** data() const { assert(0); return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
template <typename T>
|
|
||||||
struct TFold
|
|
||||||
{
|
|
||||||
TFold() = default;
|
|
||||||
TFold(const TFold& in) = default;
|
|
||||||
TFold& operator=(const TFold& in) = default;
|
|
||||||
TFold(TFold&& in) = default;
|
|
||||||
TFold& operator=(TFold&& in) = default;
|
|
||||||
explicit TFold(const T v) : val(v) {}
|
|
||||||
|
|
||||||
T val;
|
|
||||||
inline T& operator*() { return val; }
|
|
||||||
inline const T& operator*() const { return val; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
inline std::tuple<TFold<T1>,TFold<T2>> operator,(const TFold<T1>& a1, const TFold<T2>& a2)
|
|
||||||
{
|
|
||||||
return std::make_tuple(a1,a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T1, typename T2...>
|
|
||||||
inline std::tuple<TFold<T1>,TFold<T2>> operator,(const TFold<T1>& a1,
|
|
||||||
const std::tuple<TFold<T2>...>& a2)
|
|
||||||
{
|
|
||||||
return std::tuple_cat(std::make_tuple(a1),a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T2, typename T1...>
|
|
||||||
inline std::tuple<TFold<T1>,TFold<T2>> operator,(const std::tuple<TFold<T1>...>& a1,
|
|
||||||
const TFold<T2>& a2)
|
|
||||||
{
|
|
||||||
return std::tuple_cat(a1,std::make_tuple(a2));
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
template <typename T, class OpFunction, class... Ops>
|
template <typename T, class OpFunction, class... Ops>
|
||||||
class Operation : public OperationTemplate<T,Operation<T,OpFunction,Ops...> >
|
class Operation : public OperationTemplate<T,Operation<T,OpFunction,Ops...> >
|
||||||
{
|
{
|
||||||
|
|
|
@ -243,9 +243,12 @@ namespace MultiArrayTools
|
||||||
SliceDef<T,SRanges...>& SliceDef<T,SRanges...>::operator=(const OperationRoot<T,ORanges...>& op)
|
SliceDef<T,SRanges...>& SliceDef<T,SRanges...>::operator=(const OperationRoot<T,ORanges...>& op)
|
||||||
{
|
{
|
||||||
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
||||||
MA_SFOR(i,0,sizeof...(SRanges),i+1,
|
sfor_pn<0,sizeof...(SRanges)>
|
||||||
std::get<i+1>(blocks) = op.rootSteps(reinterpret_cast<std::intptr_t>
|
( [&](auto i) {
|
||||||
( mIndex.template getPtr<i>().get())).val(););
|
std::get<i+1>(blocks) =
|
||||||
|
op.rootSteps(reinterpret_cast<std::intptr_t>
|
||||||
|
( mIndex.template getPtr<i>().get())).val();
|
||||||
|
return 0; } );
|
||||||
mSl.format(blocks);
|
mSl.format(blocks);
|
||||||
mSl.mData = op.data();
|
mSl.mData = op.data();
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -265,9 +268,12 @@ namespace MultiArrayTools
|
||||||
ConstSliceDef<T,SRanges...>& ConstSliceDef<T,SRanges...>::operator=(const ConstOperationRoot<T,ORanges...>& op)
|
ConstSliceDef<T,SRanges...>& ConstSliceDef<T,SRanges...>::operator=(const ConstOperationRoot<T,ORanges...>& op)
|
||||||
{
|
{
|
||||||
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
||||||
MA_SFOR(i,0,sizeof...(SRanges),i+1,
|
sfor_pn<0,sizeof...(SRanges)>
|
||||||
std::get<i+1>(blocks) = op.rootSteps(reinterpret_cast<std::intptr_t>
|
( [&](auto i) {
|
||||||
( mIndex.template getPtr<i>().get())).val(););
|
std::get<i+1>(blocks) =
|
||||||
|
op.rootSteps(reinterpret_cast<std::intptr_t>
|
||||||
|
( mIndex.template getPtr<i>().get())).val();
|
||||||
|
return 0; } );
|
||||||
mSl.format(blocks);
|
mSl.format(blocks);
|
||||||
mSl.mData = op.data();
|
mSl.mData = op.data();
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -278,9 +284,12 @@ namespace MultiArrayTools
|
||||||
ConstSliceDef<T,SRanges...>& ConstSliceDef<T,SRanges...>::operator=(const OperationRoot<T,ORanges...>& op)
|
ConstSliceDef<T,SRanges...>& ConstSliceDef<T,SRanges...>::operator=(const OperationRoot<T,ORanges...>& op)
|
||||||
{
|
{
|
||||||
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
std::array<size_t,sizeof...(SRanges)+1> blocks;
|
||||||
MA_SFOR(i,0,sizeof...(SRanges),i+1,
|
sfor_pn<0,sizeof...(SRanges)>
|
||||||
std::get<i+1>(blocks) = op.rootSteps(reinterpret_cast<std::intptr_t>
|
( [&](auto i) {
|
||||||
( mIndex.template getPtr<i>().get())).val(););
|
std::get<i+1>(blocks) =
|
||||||
|
op.rootSteps(reinterpret_cast<std::intptr_t>
|
||||||
|
( mIndex.template getPtr<i>().get())).val();
|
||||||
|
return 0; } );
|
||||||
mSl.format(blocks);
|
mSl.format(blocks);
|
||||||
mSl.mData = op.data();
|
mSl.mData = op.data();
|
||||||
return *this;
|
return *this;
|
||||||
|
|
|
@ -112,9 +112,12 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
Slice<T,SRanges...> out(ind->range()->space(), &*ind);
|
Slice<T,SRanges...> out(ind->range()->space(), &*ind);
|
||||||
std::array<size_t,sizeof...(SRanges)+1> ff;
|
std::array<size_t,sizeof...(SRanges)+1> ff;
|
||||||
MA_SFOR(i,0,sizeof...(SRanges),i+1,
|
sfor_pn<0,sizeof...(SRanges)>
|
||||||
std::get<i+1>(ff) = op.rootSteps(reinterpret_cast<std::intptr_t>
|
( [&](auto i) {
|
||||||
( ind.template getPtr<i>().get())).val(););
|
std::get<i+1>(ff) =
|
||||||
|
op.rootSteps(reinterpret_cast<std::intptr_t>
|
||||||
|
( ind.template getPtr<i>().get())).val();
|
||||||
|
return 0; } );
|
||||||
out.format(ff);
|
out.format(ff);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -145,9 +148,12 @@ namespace MultiArrayTools
|
||||||
{
|
{
|
||||||
ConstSlice<T,SRanges...> out(ind->range()->space(), &*ind);
|
ConstSlice<T,SRanges...> out(ind->range()->space(), &*ind);
|
||||||
std::array<size_t,sizeof...(SRanges)+1> ff;
|
std::array<size_t,sizeof...(SRanges)+1> ff;
|
||||||
MA_SFOR(i,0,sizeof...(SRanges),i+1,
|
sfor_pn<0,sizeof...(SRanges)>
|
||||||
std::get<i+1>(ff) = op.rootSteps(reinterpret_cast<std::intptr_t>
|
( [&](auto i) {
|
||||||
( ind.template getPtr<i>().get())).val(););
|
std::get<i+1>(ff) =
|
||||||
|
op.rootSteps(reinterpret_cast<std::intptr_t>
|
||||||
|
( ind.template getPtr<i>().get())).val();
|
||||||
|
return 0; } );
|
||||||
out.format(ff);
|
out.format(ff);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,15 +169,4 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MA_SFOR(i,beg,end,incr,expr) sfor<beg,end,0>([&](auto i) constexpr { return incr; }, [&](auto i){ expr return 0; }, [&](auto f, auto next) { return 0; })
|
|
||||||
#define MA_SCFOR(i,beg,end,incr,expr,conc) sfor<beg,end,0>([&](auto i) constexpr { return incr; }, [&](auto i){ return expr; }, [&](auto f, auto next) { return f.conc(next); })
|
|
||||||
#define MA_SCFOR2(i,beg,end,incr,expr,conc) sfor<beg,end,0>([&](auto i) constexpr { return incr; }, [&](auto i){ return expr; }, [&](auto a, auto b) { return conc(a,b); })
|
|
||||||
#define MA_SCFOR3(i,beg,end,incr,expr,conc) sfor<beg,end,0>([&](auto i) constexpr { return incr; }, [&](auto i){ return expr; }, conc)
|
|
||||||
#define MA_SRFOR(i,beg,end,decr,expr) sfor<beg,end,-1>([&](auto i) constexpr { return decr; }, [&](auto i){ expr return 0; }, [&](auto f, auto next) { return 0; })
|
|
||||||
#define MA_SCRFOR(i,beg,end,decr,expr,conc) sfor<beg,end,-1>([&](auto i) constexpr { return decr; }, [&](auto i){ return expr; }, [&](auto f, auto next) { return f.conc(next); })
|
|
||||||
#define MA_SCRAFOR(i,beg,end,decr,expr,conc,arg) sfor<beg,end,-1>([&](auto i) constexpr { return decr; }, [&](auto i){ return expr; }, [&](auto f, auto next) { return f.conc(next); }, arg)
|
|
||||||
#define MA_CFOR(i,beg,end,incr,expr,cre) unpack<beg,end,0>([&](auto i) constexpr { return incr; }, [&](auto i){ expr }, [&](auto... args) { return cre(args...); })
|
|
||||||
|
|
||||||
#define MA_SCFOR_X(i,beg,end,incr,expr,conc) sfor<beg,end,0>([](auto i) constexpr { return incr; }, [](auto i){ return expr; }, [](auto f, auto next) { return f.conc(next); })
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -33,7 +33,10 @@ namespace MultiArrayTools
|
||||||
inline auto apply(const MultiArray<T,Ranges...>& ma)
|
inline auto apply(const MultiArray<T,Ranges...>& ma)
|
||||||
-> OperationRoot<T,Ranges...>
|
-> OperationRoot<T,Ranges...>
|
||||||
{
|
{
|
||||||
return MA_CFOR(i,0,sizeof...(Ranges),i+1,return std::get<i>(ituple);,ma);
|
return unpack<0,sizeof...(Ranges),0>
|
||||||
|
( [&](auto i) constexpr { return i+1; },
|
||||||
|
[&](auto i){ return std::get<i>(ituple); },
|
||||||
|
[&](auto... args) { return ma(args...); });
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue