OpCont + adapt ifor memeber functions
This commit is contained in:
parent
c9f69ad25d
commit
6b2bbc3020
19 changed files with 159 additions and 54 deletions
|
@ -106,6 +106,60 @@ namespace CNORXZ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/****************
|
||||||
|
* OpCont *
|
||||||
|
****************/
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
constexpr OpCont<T,IndexT>::OpCont(const Sptr<Index>& ind) :
|
||||||
|
mIndex(ind),
|
||||||
|
mC(mIndex.max())
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
template <class PosT>
|
||||||
|
constexpr decltype(auto) OpCont<T,IndexT>::operator()(const PosT& pos) const
|
||||||
|
{
|
||||||
|
if constexpr(is_epos_type<PosT>::value){
|
||||||
|
if constexpr(pos_type_is_consecutive<PosT>::value){
|
||||||
|
return vreg(mC.data(),pos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// non-consecutive data cannot be directly accessed
|
||||||
|
// so there is no non-const (write) access!
|
||||||
|
return vreg(const_cast<const T*>(mData),pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return mC[pos.val()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
constexpr decltype(auto) OpCont<T,IndexT>::operator()() const
|
||||||
|
{
|
||||||
|
return mC[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
template <SizeT I>
|
||||||
|
constexpr decltype(auto) OpCont<T,IndexT>::rootSteps(const IndexId<I>& id) const
|
||||||
|
{
|
||||||
|
return mIndex->stepSize(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
T* OpCont<T,IndexT>::data()
|
||||||
|
{
|
||||||
|
return mC.data();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
const T* OpCont<T,IndexT>::data() const
|
||||||
|
{
|
||||||
|
return mC.data();
|
||||||
|
}
|
||||||
|
|
||||||
/****************
|
/****************
|
||||||
* OpRoot *
|
* OpRoot *
|
||||||
****************/
|
****************/
|
||||||
|
@ -139,7 +193,7 @@ namespace CNORXZ
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class IndexT>
|
template <typename T, class IndexT>
|
||||||
constexpr OpRoot<T,IndexT>& OpRoot<T,IndexT>::operator=(const OpRoot<T,IndexT>& in)
|
constexpr OpRoot<T,IndexT>& OpRoot<T,IndexT>::operator=(const OpRoot<T,IndexT>& o)
|
||||||
{
|
{
|
||||||
a(mInd, [](auto& a, const auto& b) { a = b; }, o)
|
a(mInd, [](auto& a, const auto& b) { a = b; }, o)
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -177,6 +231,11 @@ namespace CNORXZ
|
||||||
return mIndex->stepSize(id);
|
return mIndex->stepSize(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, class IndexT>
|
||||||
|
T* OpRoot<T,IndexT>::data() const
|
||||||
|
{
|
||||||
|
return mData;
|
||||||
|
}
|
||||||
|
|
||||||
/*******************
|
/*******************
|
||||||
* Operation *
|
* Operation *
|
||||||
|
|
|
@ -56,8 +56,6 @@ namespace CNORXZ
|
||||||
class COpRoot : public COpInterface<COpRoot<T,IndexT>>
|
class COpRoot : public COpInterface<COpRoot<T,IndexT>>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef T value_type;
|
|
||||||
typedef OpInterface<T,COpRoot<T,IndexT>> OI;
|
typedef OpInterface<T,COpRoot<T,IndexT>> OI;
|
||||||
|
|
||||||
constexpr COpRoot(const DArrayBase<T>& a, const Sptr<IndexT>& ind);
|
constexpr COpRoot(const DArrayBase<T>& a, const Sptr<IndexT>& ind);
|
||||||
|
@ -83,6 +81,25 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
// operation container (intermediate operation results)
|
// operation container (intermediate operation results)
|
||||||
// TO BE IMPLEMENTED!!!
|
// TO BE IMPLEMENTED!!!
|
||||||
|
public:
|
||||||
|
typedef OpInterface<OpCont<T,IndexT>> OI;
|
||||||
|
|
||||||
|
constexpr OpCont(const Sptr<Index>& ind);
|
||||||
|
|
||||||
|
template <class PosT>
|
||||||
|
constexpr decltype(auto) operator()(const PosT& pos) const;
|
||||||
|
|
||||||
|
constexpr decltype(auto) operator()() const;
|
||||||
|
|
||||||
|
template <SizeT I>
|
||||||
|
constexpr decltype(auto) rootSteps(const IndexId<I>& id) const;
|
||||||
|
|
||||||
|
T* data();
|
||||||
|
const T* data() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sptr<IndexT> mIndex;
|
||||||
|
Vector<T> mC;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -90,7 +107,6 @@ namespace CNORXZ
|
||||||
class OpRoot : public OpInterface<OpRoot<T,IndexT>>
|
class OpRoot : public OpInterface<OpRoot<T,IndexT>>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef T value_type;
|
|
||||||
typedef OpInterface<OpRoot<T,IndexT>> OI;
|
typedef OpInterface<OpRoot<T,IndexT>> OI;
|
||||||
|
|
||||||
constexpr OpRoot(MDArrayBase<T>& a, const Sptr<IndexT>& ind);
|
constexpr OpRoot(MDArrayBase<T>& a, const Sptr<IndexT>& ind);
|
||||||
|
|
|
@ -6,10 +6,10 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
template <class Xpr>
|
template <class Xpr, class F>
|
||||||
decltype(auto) CIndex::ifor(const Xpr& xpr) const
|
decltype(auto) CIndex::ifor(const Xpr& xpr, F&& f) const
|
||||||
{
|
{
|
||||||
return For<0,Xpr>(this->max(), this->id(), xpr, NoF());
|
return For<0,Xpr,F>(this->max(), this->id(), xpr, std::forward<F>(f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,8 @@ namespace CNORXZ
|
||||||
SizeT meta() const;
|
SizeT meta() const;
|
||||||
CIndex& at(const SizeT& metaPos);
|
CIndex& at(const SizeT& metaPos);
|
||||||
|
|
||||||
template <class Xpr>
|
template <class Xpr, class F = NoF>
|
||||||
decltype(auto) ifor(const Xpr& xpr) const;
|
decltype(auto) ifor(const Xpr& xpr, F&& f) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Sptr<RangeType> mRangePtr;
|
Sptr<RangeType> mRangePtr;
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace CNORXZ
|
||||||
DType meta() const;
|
DType meta() const;
|
||||||
DIndex& at(const DType& meta);
|
DIndex& at(const DType& meta);
|
||||||
|
|
||||||
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr) const;
|
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
XIndexPtr mI;
|
XIndexPtr mI;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "range_base.h"
|
#include "range_base.h"
|
||||||
#include "xpr/index_id.h"
|
#include "xpr/index_id.h"
|
||||||
#include "xpr/xpr_base.h"
|
#include "xpr/xpr_base.h"
|
||||||
|
#include "xpr/func.h"
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
|
@ -55,8 +56,9 @@ namespace CNORXZ
|
||||||
decltype(auto) meta() const { return THIS().meta(); }
|
decltype(auto) meta() const { return THIS().meta(); }
|
||||||
I& at(const MetaType& meta) { return THIS().at(meta); }
|
I& at(const MetaType& meta) { return THIS().at(meta); }
|
||||||
|
|
||||||
template <class Xpr>
|
template <class Xpr, class F = NoF>
|
||||||
decltype(auto) ifor(const Xpr& xpr) const { return THIS().ifor(xpr); }
|
decltype(auto) ifor(const Xpr& xpr, F&& f) const
|
||||||
|
{ return THIS().ifor(xpr,std::forward<F>(f)); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SizeT mPos = 0;
|
SizeT mPos = 0;
|
||||||
|
|
|
@ -145,10 +145,10 @@ namespace CNORXZ
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename MetaType>
|
template <typename MetaType>
|
||||||
template <class Xpr>
|
template <class Xpr, class F>
|
||||||
decltype(auto) UIndex<MetaType>::ifor(const Xpr& xpr) const
|
decltype(auto) UIndex<MetaType>::ifor(const Xpr& xpr, F&& f) const
|
||||||
{
|
{
|
||||||
return For<0,Xpr>(this->max(), this->id(), xpr);
|
return For<0,Xpr>(this->max(), this->id(), xpr, std::forward<F>(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
|
|
|
@ -48,8 +48,8 @@ namespace CNORXZ
|
||||||
const MetaType& meta() const;
|
const MetaType& meta() const;
|
||||||
UIndex& at(const MetaType& metaPos);
|
UIndex& at(const MetaType& metaPos);
|
||||||
|
|
||||||
template <class Xpr>
|
template <class Xpr, class F>
|
||||||
decltype(auto) ifor(const Xpr& xpr) const;
|
decltype(auto) ifor(const Xpr& xpr, F&& f) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Sptr<RangeType> mRangePtr;
|
Sptr<RangeType> mRangePtr;
|
||||||
|
|
|
@ -155,9 +155,10 @@ namespace CNORXZ
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Index, typename Meta>
|
template <class Index, typename Meta>
|
||||||
DXpr<SizeT> XIndex<Index,Meta>::ifor(const DXpr<SizeT>& xpr) const
|
DXpr<SizeT> XIndex<Index,Meta>::ifor(const DXpr<SizeT>& xpr,
|
||||||
|
std::function<SizeT(SizeT,SizeT)>&& f) const
|
||||||
{
|
{
|
||||||
return DXpr<SizeT>(mI->ifor(xpr));
|
return DXpr<SizeT>(mI->ifor(xpr, std::forward<std::function<SizeT(SizeT,SizeT)>>(f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,8 @@ namespace CNORXZ
|
||||||
virtual DType meta() const = 0;
|
virtual DType meta() const = 0;
|
||||||
virtual XIndexBase& at(const DType& meta) = 0;
|
virtual XIndexBase& at(const DType& meta) = 0;
|
||||||
|
|
||||||
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr) const = 0;
|
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr,
|
||||||
|
std::function<SizeT(SizeT,SizeT)>&& f) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
//Sptr<XIndexBase>& operator++(Sptr<XIndexBase>& i);
|
//Sptr<XIndexBase>& operator++(Sptr<XIndexBase>& i);
|
||||||
|
@ -91,7 +92,8 @@ namespace CNORXZ
|
||||||
virtual DType meta() const override final;
|
virtual DType meta() const override final;
|
||||||
virtual XIndexBase& at(const DType& meta) override final;
|
virtual XIndexBase& at(const DType& meta) override final;
|
||||||
|
|
||||||
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr) const override final;
|
virtual DXpr<SizeT> ifor(const DXpr<SizeT>& xpr,
|
||||||
|
std::function<SizeT(SizeT,SizeT)>&& f) const override final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IndexPtr<Index,Meta> mI;
|
IndexPtr<Index,Meta> mI;
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace CNORXZ
|
||||||
DType meta() const;
|
DType meta() const;
|
||||||
YIndex& at(const DType& meta);
|
YIndex& at(const DType& meta);
|
||||||
|
|
||||||
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr) const;
|
DXpr<SizeT> ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -8,21 +8,6 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
/*************
|
|
||||||
* ZeroF *
|
|
||||||
*************/
|
|
||||||
|
|
||||||
template <typename... T>
|
|
||||||
constexpr decltype(auto) ZeroF::operator()(const T&... as) const
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename... T>
|
|
||||||
constexpr decltype(auto) NoF::operator()(const T&... as) const
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********
|
/***********
|
||||||
* For *
|
* For *
|
||||||
|
|
|
@ -4,22 +4,10 @@
|
||||||
|
|
||||||
#include "base/base.h"
|
#include "base/base.h"
|
||||||
#include "xpr_base.h"
|
#include "xpr_base.h"
|
||||||
|
#include "func.h"
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
class ZeroF
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename... T>
|
|
||||||
constexpr decltype(auto) operator()(const T&... as) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class NoF
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename... T>
|
|
||||||
constexpr decltype(auto) operator()(const T&... as) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <SizeT L, class Xpr, class F = NoF>
|
template <SizeT L, class Xpr, class F = NoF>
|
||||||
class For : public XprInterface<For<L,Xpr,F>>
|
class For : public XprInterface<For<L,Xpr,F>>
|
||||||
|
|
24
src/include/xpr/func.cc.h
Normal file
24
src/include/xpr/func.cc.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
#ifndef __cxz_func_cc_h__
|
||||||
|
#define __cxz_func_cc_h__
|
||||||
|
|
||||||
|
#include "func.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename... T>
|
||||||
|
constexpr decltype(auto) ZeroF::operator()(const T&... as) const
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... T>
|
||||||
|
constexpr decltype(auto) NoF::operator()(const T&... as) const
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
25
src/include/xpr/func.h
Normal file
25
src/include/xpr/func.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
|
||||||
|
#ifndef __cxz_func_h__
|
||||||
|
#define __cxz_func_h__
|
||||||
|
|
||||||
|
#include "base/base.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
class ZeroF
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename... T>
|
||||||
|
constexpr decltype(auto) operator()(const T&... as) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NoF
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename... T>
|
||||||
|
constexpr decltype(auto) operator()(const T&... as) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,3 +4,4 @@
|
||||||
#include "xpr_base.cc.h"
|
#include "xpr_base.cc.h"
|
||||||
#include "for.cc.h"
|
#include "for.cc.h"
|
||||||
#include "index_id.cc.h"
|
#include "index_id.cc.h"
|
||||||
|
#include "func.cc.h"
|
||||||
|
|
|
@ -4,5 +4,6 @@
|
||||||
#include "xpr_base.h"
|
#include "xpr_base.h"
|
||||||
#include "for.h"
|
#include "for.h"
|
||||||
#include "index_id.h"
|
#include "index_id.h"
|
||||||
|
#include "func.h"
|
||||||
|
|
||||||
#include "xpr.cc.h"
|
#include "xpr.cc.h"
|
||||||
|
|
|
@ -138,9 +138,9 @@ namespace CNORXZ
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DXpr<SizeT> DIndex::ifor(const DXpr<SizeT>& xpr) const
|
DXpr<SizeT> DIndex::ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const
|
||||||
{
|
{
|
||||||
return DXpr<SizeT>(mI->ifor(xpr));
|
return DXpr<SizeT>(mI->ifor(xpr, std::forward<std::function<SizeT(SizeT,SizeT)>>(f)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,9 +171,10 @@ namespace CNORXZ
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DXpr<SizeT> YIndex::ifor(const DXpr<SizeT>& xpr) const
|
DXpr<SizeT> YIndex::ifor(const DXpr<SizeT>& xpr, std::function<SizeT(SizeT,SizeT)>&& f) const
|
||||||
{
|
{
|
||||||
assert(0);
|
assert(0);
|
||||||
|
f(0,0);
|
||||||
return DXpr<SizeT>();
|
return DXpr<SizeT>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue