change operator* for index shared ptrs -> creates index packs instead of m/yindices
This commit is contained in:
parent
6bd7140ae3
commit
e8c8e519dc
8 changed files with 86 additions and 62 deletions
|
@ -104,6 +104,21 @@ namespace CNORXZ
|
|||
return coproot(*this, i);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template <class... Indices>
|
||||
inline decltype(auto) CArrayBase<T>::operator()(const SPack<Indices...>& pack) const
|
||||
{
|
||||
CXZ_WARNING("FORMAT / BLOCKSIZES!!!");
|
||||
return coproot(*this, mindexPtr(pack));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline decltype(auto) CArrayBase<T>::operator()(const DPack& pack) const
|
||||
{
|
||||
CXZ_WARNING("FORMAT / BLOCKSIZES!!!");
|
||||
return coproot(*this, yindexPtr(pack));
|
||||
}
|
||||
|
||||
/******************************
|
||||
* CArrayBase (protected) *
|
||||
******************************/
|
||||
|
@ -210,6 +225,21 @@ namespace CNORXZ
|
|||
return oproot(*this, i);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template <class... Indices>
|
||||
inline decltype(auto) ArrayBase<T>::operator()(const SPack<Indices...>& pack)
|
||||
{
|
||||
CXZ_WARNING("FORMAT / BLOCKSIZES!!!");
|
||||
return oproot(*this, mindexPtr(pack));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
inline decltype(auto) ArrayBase<T>::operator()(const DPack& pack)
|
||||
{
|
||||
CXZ_WARNING("FORMAT / BLOCKSIZES!!!");
|
||||
return oproot(*this, yindexPtr(pack));
|
||||
}
|
||||
|
||||
/*****************************
|
||||
* ArrayBase (protected) *
|
||||
*****************************/
|
||||
|
|
|
@ -41,7 +41,15 @@ namespace CNORXZ
|
|||
|
||||
template <typename I, typename M>
|
||||
Sptr<CArrayBase<T>> sl(const IndexInterface<I,M>& i) const;
|
||||
|
||||
|
||||
template <class Index>
|
||||
COpRoot<T,Index> operator()(const Sptr<Index>& i) const;
|
||||
|
||||
template <class... Indices>
|
||||
inline decltype(auto) operator()(const SPack<Indices...>& pack) const;
|
||||
|
||||
inline decltype(auto) operator()(const DPack& pack) const;
|
||||
|
||||
virtual const T* data() const = 0;
|
||||
virtual SizeT size() const;
|
||||
virtual RangePtr range() const;
|
||||
|
@ -53,9 +61,6 @@ namespace CNORXZ
|
|||
|
||||
virtual bool isView() const = 0;
|
||||
|
||||
template <class Index>
|
||||
COpRoot<T,Index> operator()(const Sptr<Index>& i) const;
|
||||
|
||||
protected:
|
||||
RangePtr mRange;
|
||||
|
||||
|
@ -101,6 +106,14 @@ namespace CNORXZ
|
|||
T& operator[](const DPack& pack);
|
||||
T& at(const DPack& pack);
|
||||
|
||||
template <class Index>
|
||||
OpRoot<T,Index> operator()(const Sptr<Index>& i);
|
||||
|
||||
template <class... Indices>
|
||||
inline decltype(auto) operator()(const SPack<Indices...>& pack);
|
||||
|
||||
inline decltype(auto) operator()(const DPack& pack);
|
||||
|
||||
template <typename I, typename M>
|
||||
Sptr<ArrayBase<T>> sl(const IndexInterface<I,M>& i);
|
||||
|
||||
|
@ -109,9 +122,6 @@ namespace CNORXZ
|
|||
virtual iterator begin();
|
||||
virtual iterator end();
|
||||
|
||||
template <class Index>
|
||||
OpRoot<T,Index> operator()(const Sptr<Index>& i);
|
||||
|
||||
protected:
|
||||
|
||||
template <class Acc>
|
||||
|
|
|
@ -72,6 +72,22 @@ namespace CNORXZ
|
|||
return a.rmul(std::make_shared<I2>(b.THIS()));
|
||||
}
|
||||
|
||||
template <class Index, class... Indices>
|
||||
inline decltype(auto) operator*(const Sptr<Index>& a,
|
||||
const SPack<Indices...>& b)
|
||||
{
|
||||
static_assert(is_index<Index>::value, "got non-index type");
|
||||
return b.lmul(a);
|
||||
}
|
||||
|
||||
template <class Index, class... Indices>
|
||||
inline decltype(auto) operator*(const SPack<Indices...>& a,
|
||||
const Sptr<Index>& b)
|
||||
{
|
||||
static_assert(is_index<Index>::value, "got non-index type");
|
||||
return a.rmul(b);
|
||||
}
|
||||
|
||||
template <class... Indices1, class... Indices2>
|
||||
inline decltype(auto) operator*(const SPack<Indices1...>& a, const SPack<Indices2...>& b)
|
||||
{
|
||||
|
@ -102,48 +118,13 @@ namespace CNORXZ
|
|||
template <class I1, class I2>
|
||||
decltype(auto) iptrMul(const Sptr<I1>& a, const Sptr<I2>& b)
|
||||
{
|
||||
if constexpr(std::is_same<I1,DIndex>::value){
|
||||
if constexpr(std::is_same<I2,DIndex>::value){
|
||||
return std::make_shared<YIndex>({ a->xptr(), b->xptr() });
|
||||
}
|
||||
else if constexpr(std::is_same<I2,YIndex>::value){
|
||||
auto p = b->pack();
|
||||
p.insert(0, a->xptr());
|
||||
return std::make_shared<YIndex>(p);
|
||||
}
|
||||
}
|
||||
else if constexpr(std::is_same<I1,YIndex>::value){
|
||||
if constexpr(std::is_same<I2,DIndex>::value){
|
||||
auto p = a->pack();
|
||||
p.push_back(b->xptr());
|
||||
return std::make_shared<YIndex>(p);
|
||||
}
|
||||
else if constexpr(std::is_same<I2,YIndex>::value){
|
||||
auto p = a->pack();
|
||||
p.insert(p.end(), b->pack().begin(), b->pack().end());
|
||||
return std::make_shared<YIndex>(p);
|
||||
}
|
||||
static_assert(is_index<I1>::value and is_index<I2>::value, "got non-index type");
|
||||
if constexpr(std::is_same<I1,YIndex>::value or std::is_same<I2,YIndex>::value or
|
||||
std::is_same<I1,DIndex>::value or std::is_same<I2,DIndex>::value) {
|
||||
return dpackp(a, b);
|
||||
}
|
||||
else {
|
||||
constexpr SizeT I1D = index_dim<I1>::value;
|
||||
constexpr SizeT I2D = index_dim<I2>::value;
|
||||
if constexpr(I1D == 1){
|
||||
if constexpr(index_dim<I2>::value == 1){
|
||||
return std::make_shared<MIndex<I1,I2>>(a, b);
|
||||
}
|
||||
else {
|
||||
return MIndexSptrMul::evalXM(a, b, std::make_index_sequence<I1D>{});
|
||||
}
|
||||
}
|
||||
else {
|
||||
if constexpr(index_dim<I2>::value == 1){
|
||||
return MIndexSptrMul::evalMX(a, b, std::make_index_sequence<I2D>{});
|
||||
}
|
||||
else {
|
||||
return MIndexSptrMul::evalMM(a, b, std::make_index_sequence<I1D>{},
|
||||
std::make_index_sequence<I2D>{});
|
||||
}
|
||||
}
|
||||
return spackp(a, b);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -472,12 +472,6 @@ namespace CNORXZ
|
|||
( bs1, e... ); } );
|
||||
}
|
||||
|
||||
template <class BT1, class... Is1, class BT2, class... Is2>
|
||||
decltype(auto) operator*(const Sptr<GMIndex<BT1,Is1...>>& a, const Sptr<GMIndex<BT2,Is2...>>& b)
|
||||
{
|
||||
return iptrMul(a, b);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
constexpr decltype(auto) mindex(const Sptr<Indices>&... is)
|
||||
{
|
||||
|
@ -490,6 +484,12 @@ namespace CNORXZ
|
|||
return MIndex<Indices...>(pack);
|
||||
}
|
||||
|
||||
template <class... Indices>
|
||||
constexpr decltype(auto) mindexPtr(const SPack<Indices...>& pack)
|
||||
{
|
||||
return std::make_shared<MIndex<Indices...>>(pack);
|
||||
}
|
||||
|
||||
template <class FormatT, class... Indices>
|
||||
constexpr decltype(auto) gmindexPtr(const FormatT& bs, const Sptr<Indices>&... is)
|
||||
{
|
||||
|
|
|
@ -105,7 +105,6 @@ namespace CNORXZ
|
|||
typedef RemoveRef<decltype(mkLexFormat(mIPack,Isqr<0,NI-1>{}))> LexFormatT;
|
||||
LexFormatT mLexFormat;
|
||||
FormatT mFormat;
|
||||
//BlockType mFormat; // -> FormatT
|
||||
SizeT mLex;
|
||||
typedef RemoveRef<decltype(mkLMax(mIPack))> LMaxT;
|
||||
LMaxT mLMax;
|
||||
|
@ -116,11 +115,6 @@ namespace CNORXZ
|
|||
template <class BT1, class BT2, class... Indices>
|
||||
decltype(auto) replaceFormat(const BT1& bs1, const Sptr<GMIndex<BT2,Indices...>>& gmi);
|
||||
|
||||
template <class BT1, class... Is1, class BT2, class... Is2>
|
||||
decltype(auto) operator*(const Sptr<GMIndex<BT1,Is1...>>& a, const Sptr<GMIndex<BT2,Is2...>>& b);
|
||||
|
||||
//template <class... Indices>
|
||||
//using MIndex = GMIndex<None,Indices...>;
|
||||
template <class... Indices>
|
||||
struct index_has_const_size<MIndex<Indices...>>
|
||||
{ static constexpr bool value = (index_has_const_size<Indices>::value and ...); };
|
||||
|
@ -146,7 +140,10 @@ namespace CNORXZ
|
|||
|
||||
template <class... Indices>
|
||||
constexpr decltype(auto) mindex(const SPack<Indices...>& pack);
|
||||
|
||||
|
||||
template <class... Indices>
|
||||
constexpr decltype(auto) mindexPtr(const SPack<Indices...>& pack);
|
||||
|
||||
template <class FormatT, class... Indices>
|
||||
constexpr decltype(auto) gmindexPtr(const FormatT& bs, const Sptr<Indices>&... is);
|
||||
|
||||
|
|
|
@ -89,6 +89,7 @@ namespace CNORXZ
|
|||
|
||||
YIndex yindex(const DPack& pack);
|
||||
YIndex yindex(const Vector<XIndexPtr>& is);
|
||||
Sptr<YIndex> yindexPtr(const DPack& is);
|
||||
Sptr<YIndex> yindexPtr(const Vector<XIndexPtr>& is);
|
||||
Sptr<YIndex> yindexPtr(const Vector<SizeT>& bs, const Vector<XIndexPtr>& is);
|
||||
|
||||
|
|
|
@ -392,6 +392,11 @@ namespace CNORXZ
|
|||
return YIndex(is);
|
||||
}
|
||||
|
||||
Sptr<YIndex> yindexPtr(const DPack& pack)
|
||||
{
|
||||
return std::make_shared<YIndex>(pack.all());
|
||||
}
|
||||
|
||||
Sptr<YIndex> yindexPtr(const Vector<XIndexPtr>& is)
|
||||
{
|
||||
return std::make_shared<YIndex>(is);
|
||||
|
|
|
@ -63,8 +63,8 @@ namespace
|
|||
mCIa2 = std::make_shared<CIndex>(cra);
|
||||
mCIb1 = std::make_shared<CIndex>(crb);
|
||||
mCIb2 = std::make_shared<CIndex>(crb);
|
||||
mCCa1a2 = mCIa1*mCIa2;
|
||||
mCCa2a1 = mCIa2*mCIa1;
|
||||
mCCa1a2 = mindexPtr(mCIa1*mCIa2);
|
||||
mCCa2a1 = mindexPtr(mCIa2*mCIa1);
|
||||
mOCa1a2.init(mCCa1a2);
|
||||
mORa2a1.init(mData12.data(), mCCa2a1);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue