add srange.h
This commit is contained in:
parent
1610084abd
commit
3c98377e2d
1 changed files with 124 additions and 0 deletions
124
src/include/ranges/srange.h
Normal file
124
src/include/ranges/srange.h
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __cxz_srange_h__
|
||||||
|
#define __cxz_srange_h__
|
||||||
|
|
||||||
|
#include "base/base.h"
|
||||||
|
#include "ranges/index_base.h"
|
||||||
|
#include "ranges/range_base.h"
|
||||||
|
#include "xpr/xpr.h"
|
||||||
|
|
||||||
|
namespace CNORXZ
|
||||||
|
{
|
||||||
|
template <typename Meta, SizeT S>
|
||||||
|
class SIndex : public IndexInterface<SIndex<MetaT,S>,MetaT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef IndexInterface<SIndex<MetaT,S>,MetaT> IB;
|
||||||
|
typedef SRange<MetaT,S> RangeType;
|
||||||
|
typedef MetaT MetaType;
|
||||||
|
|
||||||
|
SIndex(const RangePtr& range, SizeT pos = 0);
|
||||||
|
|
||||||
|
SIndex& operator=(SizeT lexpos);
|
||||||
|
SIndex& operator++();
|
||||||
|
SIndex& operator--();
|
||||||
|
SIndex operator+(Int n) const;
|
||||||
|
SIndex operator-(Int n) const;
|
||||||
|
SIndex& operator+=(Int n);
|
||||||
|
SIndex& operator-=(Int n);
|
||||||
|
|
||||||
|
SizeT lex() const;
|
||||||
|
SPos<S> pmax() const;
|
||||||
|
SPos<S> lmax() const;
|
||||||
|
IndexId<0> id() const;
|
||||||
|
|
||||||
|
const MetaT& operator*() const;
|
||||||
|
|
||||||
|
SizeT dim() const; // = 1
|
||||||
|
Sptr<RangeType> range() const;
|
||||||
|
|
||||||
|
template <SizeT I>
|
||||||
|
UPos stepSize(const IndexId<I>& id) const;
|
||||||
|
|
||||||
|
String stringMeta() const;
|
||||||
|
const MetaT& meta() const;
|
||||||
|
SIndex& at(const MetaT& metaPos);
|
||||||
|
decltype(auto) xpr(const Sptr<SIndex<MetaType,S>>& _this) const;
|
||||||
|
|
||||||
|
template <class Index>
|
||||||
|
decltype(auto) format(const Sptr<Index>& ind) const;
|
||||||
|
|
||||||
|
template <class Index>
|
||||||
|
decltype(auto) slice(const Sptr<Index>& ind) const;
|
||||||
|
|
||||||
|
template <class Xpr, class F>
|
||||||
|
decltype(auto) ifor(const Xpr& xpr, F&& f) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Sptr<RangeType> mRangePtr;
|
||||||
|
const MetaT* mMetaPtr;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S, class I1>
|
||||||
|
decltype(auto) operator*(const Sptr<SIndex<MetaType,S>>& a, const Sptr<I1>& b);
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
class SRangeFactory : public RangeFactoryBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SRangeFactory(const Arr<MetaType,S>& space);
|
||||||
|
SRangeFactory(Arr<MetaType,S>&& space);
|
||||||
|
SRangeFactory(const Arr<MetaType,S>& space, const RangePtr& ref);
|
||||||
|
SRangeFactory(Arr<MetaType,S>&& space, const RangePtr& ref);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SRangeFactory() = default;
|
||||||
|
virtual void make() override final;
|
||||||
|
|
||||||
|
Arr<MetaType,S> mSpace;
|
||||||
|
RangePtr mRef;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
class SRange : public RangeInterface<SRange<MetaType,S>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef RangeBase RB;
|
||||||
|
typedef SIndex<MetaType,S> IndexType;
|
||||||
|
|
||||||
|
friend SRangeFactory<MetaType,S>;
|
||||||
|
|
||||||
|
virtual SizeT size() const override final;
|
||||||
|
virtual SizeT dim() const override final;
|
||||||
|
virtual String stringMeta(SizeT pos) const override final;
|
||||||
|
virtual const TypeInfo& type() const override final;
|
||||||
|
virtual const TypeInfo& metaType() const override final;
|
||||||
|
virtual RangePtr extend(const RangePtr& r) const override final;
|
||||||
|
|
||||||
|
const MetaType& get(SizeT pos) const;
|
||||||
|
const MetaType* get() const;
|
||||||
|
SizeT getMeta(const MetaType& metaPos) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SRange() = default;
|
||||||
|
SRange(const SRange& in) = delete;
|
||||||
|
SRange(const Arr<MetaType,S>& space);
|
||||||
|
SRange(Arr<MetaType,S>&& space);
|
||||||
|
|
||||||
|
Arr<MetaType,S> mSpace;
|
||||||
|
|
||||||
|
virtual Vector<Uuid> key() const override final;
|
||||||
|
|
||||||
|
SERIALIZATION_FUNCTIONS_NOPUB;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename MetaType, SizeT S>
|
||||||
|
struct RangeCast<SRange<MetaType,S>>
|
||||||
|
{
|
||||||
|
static Sptr<SRange<MetaType,S>> func(const RangePtr& r);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue