DXpr: consistent handling of pos types
This commit is contained in:
parent
8d7511b6c6
commit
1743fd196a
4 changed files with 91 additions and 2 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include "wrange.cc.h"
|
#include "wrange.cc.h"
|
||||||
#include "srange.cc.h"
|
#include "srange.cc.h"
|
||||||
#include "crange.cc.h"
|
#include "crange.cc.h"
|
||||||
|
#include "yrange.cc.h"
|
||||||
#include "prange.cc.h"
|
#include "prange.cc.h"
|
||||||
#include "dindex.cc.h"
|
#include "dindex.cc.h"
|
||||||
#include "lindex.cc.h"
|
#include "lindex.cc.h"
|
||||||
|
|
34
src/include/ranges/yrange.cc.h
Normal file
34
src/include/ranges/yrange.cc.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
/**
|
||||||
|
|
||||||
|
@file include/ranges/yrange.cc.h
|
||||||
|
@brief YRange and YIndex template implementations.
|
||||||
|
|
||||||
|
Copyright (c) 2024 Christian Zimmermann. All rights reserved.
|
||||||
|
Mail: chizeta@f3l.de
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef __cxz_yrange_cc_h__
|
||||||
|
#define __cxz_yrange_cc_h__
|
||||||
|
|
||||||
|
#include "yrange.h"
|
||||||
|
#include "index_mul.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
template <class Xpr>
|
||||||
|
DXpr<None> YIndex::ifor(const Xpr& xpr, NoF&& f) const
|
||||||
|
{
|
||||||
|
return this->ifor( DXpr<None>(xpr), std::forward<NoF>(f) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class I>
|
||||||
|
decltype(auto) operator*(const Sptr<YIndex>& a, const Sptr<I>& b)
|
||||||
|
{
|
||||||
|
return iptrMul(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -154,6 +154,10 @@ namespace CNORXZ
|
||||||
/** @copydoc IndexInterface::ifor() */
|
/** @copydoc IndexInterface::ifor() */
|
||||||
DXpr<None> ifor(const DXpr<None>& xpr, NoF&& f) const;
|
DXpr<None> ifor(const DXpr<None>& xpr, NoF&& f) const;
|
||||||
|
|
||||||
|
/** @copydoc IndexInterface::ifor() */
|
||||||
|
template <class Xpr>
|
||||||
|
DXpr<None> ifor(const Xpr& xpr, NoF&& f) const;
|
||||||
|
|
||||||
/** @copydoc IndexInterface::formatIsTrivial() */
|
/** @copydoc IndexInterface::formatIsTrivial() */
|
||||||
bool formatIsTrivial() const;
|
bool formatIsTrivial() const;
|
||||||
|
|
||||||
|
@ -361,6 +365,12 @@ namespace CNORXZ
|
||||||
static Sptr<YRange> func(const RangePtr& r);
|
static Sptr<YRange> func(const RangePtr& r);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Make index pack of a YIndex and another index.
|
||||||
|
@param a pointer to YIndex.
|
||||||
|
@param b pointer to another index.
|
||||||
|
*/
|
||||||
|
template <class I>
|
||||||
|
decltype(auto) operator*(const Sptr<YIndex>& a, const Sptr<I>& b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,35 @@
|
||||||
|
|
||||||
namespace CNORXZ
|
namespace CNORXZ
|
||||||
{
|
{
|
||||||
|
// TODO: move to a better place!!!
|
||||||
|
template <class PosT>
|
||||||
|
struct PosFromDPos
|
||||||
|
{
|
||||||
|
static constexpr decltype(auto) mk(const DPos& pos)
|
||||||
|
{
|
||||||
|
if constexpr(std::is_same<PosT,DPos>::value or std::is_same<PosT,DPosRef>::value){
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return UPos(pos.val());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class BPosT, class NPosT>
|
||||||
|
struct PosFromDPos<MPos<BPosT,NPosT>>
|
||||||
|
{
|
||||||
|
static constexpr decltype(auto) mk(const DPos& pos)
|
||||||
|
{
|
||||||
|
return mkMPos( PosFromDPos<BPosT>::mk(pos), PosFromDPos<NPosT>::mk( pos.sub() ) );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class PosT>
|
||||||
|
constexpr decltype(auto) mkMPosFromDPos(const DPos& pos)
|
||||||
|
{
|
||||||
|
return PosFromDPos<PosT>::mk(pos);
|
||||||
|
}
|
||||||
|
|
||||||
/*==========+
|
/*==========+
|
||||||
| VXpr |
|
| VXpr |
|
||||||
|
@ -35,14 +64,29 @@ namespace CNORXZ
|
||||||
template <typename T, class Xpr>
|
template <typename T, class Xpr>
|
||||||
T VXpr<T,Xpr>::vexec(const DPos& last) const
|
T VXpr<T,Xpr>::vexec(const DPos& last) const
|
||||||
{
|
{
|
||||||
return (*this)(last);
|
typedef typename std::remove_reference<decltype(this->rootSteps(IndexId<0>{}))>::type Ext;
|
||||||
|
typedef decltype((*this)()) RetT;
|
||||||
|
if constexpr(std::is_same<RetT,void>::value){
|
||||||
|
(*this)(mkMPosFromDPos<Ext>(last));
|
||||||
|
return None {};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return (*this)(mkMPosFromDPos<Ext>(last));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T, class Xpr>
|
template <typename T, class Xpr>
|
||||||
T VXpr<T,Xpr>::vexec() const
|
T VXpr<T,Xpr>::vexec() const
|
||||||
{
|
{
|
||||||
|
typedef decltype((*this)()) RetT;
|
||||||
|
if constexpr(std::is_same<RetT,void>::value){
|
||||||
|
(*this)();
|
||||||
|
return None {};
|
||||||
|
}
|
||||||
|
else {
|
||||||
return (*this)();
|
return (*this)();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
template <typename T, class Xpr>
|
template <typename T, class Xpr>
|
||||||
DPos VXpr<T,Xpr>::vrootSteps(const IndexId<0>& id) const
|
DPos VXpr<T,Xpr>::vrootSteps(const IndexId<0>& id) const
|
||||||
|
|
Loading…
Reference in a new issue