various improvements regarding static pos evaluation

This commit is contained in:
Christian Zimmermann 2024-10-27 00:47:53 -07:00
parent a549fb6b9c
commit ee3e1b5d4f
4 changed files with 32 additions and 3 deletions

View file

@ -49,7 +49,13 @@ namespace CNORXZ
template <class Xpr, class F> template <class Xpr, class F>
decltype(auto) LIndex<Index,L>::ifor(const Xpr& xpr, F&& f) const decltype(auto) LIndex<Index,L>::ifor(const Xpr& xpr, F&& f) const
{ {
return For<L,Xpr,F>(this->pmax().val(), this->id(), xpr, std::forward<F>(f)); if constexpr(index_has_const_size<Index>::value){
constexpr SizeT S = index_const_size<Index>::value;
return SFor<S,L,Xpr,F>(this->id(), xpr, std::forward<F>(f));
}
else {
return For<L,Xpr,F>(this->pmax().val(), this->id(), xpr, std::forward<F>(f));
}
} }
template <class Index, SizeT L, class I1> template <class Index, SizeT L, class I1>

View file

@ -247,6 +247,22 @@ namespace CNORXZ
{ {
static constexpr bool value = true; static constexpr bool value = true;
}; };
/** ***
SIndex has static range size
@see index_expression_exists
*/
template <typename MetaT, SizeT S>
struct index_has_const_size<SIndex<MetaT,S>>
{ static constexpr bool value = true; };
/** ***
SIndex has static range size
@see index_expression_exists
*/
template <typename MetaT, SizeT S>
struct index_const_size<SIndex<MetaT,S>>
{ static constexpr SizeT value = S; };
} }
#endif #endif

View file

@ -480,13 +480,19 @@ namespace CNORXZ
return mNext; return mNext;
} }
template <class BPosT, class NPosT>
constexpr const BPosT& MPos<BPosT,NPosT>::bpos() const
{
return *this;
}
template <class BPosT, class NPosT> template <class BPosT, class NPosT>
template <class PosT> template <class PosT>
constexpr decltype(auto) MPos<BPosT,NPosT>::operator+(const PosT& a) const constexpr decltype(auto) MPos<BPosT,NPosT>::operator+(const PosT& a) const
{ {
typedef decltype(BPosT::operator+(a)) OBPosT; typedef decltype(BPosT::operator+(a.bpos())) OBPosT;
typedef decltype(mNext + a.next()) ONPosT; typedef decltype(mNext + a.next()) ONPosT;
return MPos<OBPosT,ONPosT>( BPosT::operator+(a), mNext + a.next() ); return MPos<OBPosT,ONPosT>( BPosT::operator+(a.bpos()), mNext + a.next() );
} }
template <class BPosT, class NPosT> template <class BPosT, class NPosT>

View file

@ -177,6 +177,7 @@ namespace CNORXZ
constexpr SizeT size() const; constexpr SizeT size() const;
constexpr const NPosT& next() const; constexpr const NPosT& next() const;
constexpr const BPosT& bpos() const;
template <class PosT> template <class PosT>
constexpr decltype(auto) operator+(const PosT& a) const; constexpr decltype(auto) operator+(const PosT& a) const;