cnorxz/src/multi_range.h

141 lines
4 KiB
C
Raw Normal View History

2017-02-16 11:20:40 +01:00
// -*- C++ -*-
#ifndef __multi_range_h__
#define __multi_range_h__
#include <cstdlib>
#include <tuple>
#include <memory>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
#include "range_base.h"
#include "index_base.h"
namespace MultiArrayTools
{
template <class... Indices>
class MultiIndex : public IndexBase<MultiIndex<Indices...> >
{
public:
typedef std::tuple<std::shared_ptr<Indices>...> IndexPack;
typedef IndefinitIndexBase IIB;
typedef IndexBase<MultiIndex<std::shared_ptr<Indices>...> > IB;
typedef std::tuple<decltype(Indices().getMetaPos())...> MetaType;
protected:
virtual bool linkLower(IndefinitIndexBase* toLink);
virtual size_t evaluate(const MultiIndex& in) const override;
IndexPack mIPack;
2017-02-16 11:20:40 +01:00
public:
2017-02-28 19:29:52 +01:00
MultiIndex() = default;
// NO DEFAULT HERE !!!
// ( have to subord sub-indices (mMajor) correctly, and not only copy their mMajor pointer to 'in'
// which is not major any more in copies!! )
MultiIndex(const MultiIndex& in);
MultiIndex& operator=(const MultiIndex& in);
MultiIndex(RangeBase<MultiIndex<std::shared_ptr<Indices>...> > const* range);
2017-02-28 19:29:52 +01:00
MultiIndex(RangeBase<MultiIndex<std::shared_ptr<Indices>...> > const* range,
2017-02-21 17:41:48 +01:00
Indices&&... inds);
MultiIndex(RangeBase<MultiIndex<std::shared_ptr<Indices>...> > const* range,
2017-02-21 17:41:48 +01:00
const IndexPack& ipack);
2017-05-24 19:01:02 +02:00
MultiIndex(std::vector<std::shared_ptr<IndefinitIndexBase> >& indexList);
2017-02-16 11:20:40 +01:00
virtual MultiIndex& operator++() override;
virtual MultiIndex& operator--() override;
virtual MultiIndex& operator+=(int n) override;
virtual MultiIndex& operator-=(int n) override;
2017-02-22 00:43:38 +01:00
bool operator==(const MultiIndex& in);
bool operator!=(const MultiIndex& in);
2017-05-24 19:01:02 +02:00
virtual MultiIndex& operator=(size_t pos) override;
virtual MultiRangeType rangeType() const override;
2017-02-16 11:20:40 +01:00
template <size_t N>
2017-05-24 19:01:02 +02:00
auto getIndex() -> decltype(*std::get<N>(mIPack))&;
//typename std::tuple_element<N, std::tuple<std::shared_ptr<Indices>...> >::type& getIndex();
2017-02-16 11:20:40 +01:00
template <size_t N>
2017-05-24 19:01:02 +02:00
auto getIndex() const -> decltype(*std::get<N>(mIPack))&;
//typename std::tuple_element<N, std::tuple<std::shared_ptr<Indices>...> >::type const& getIndex() const;
2017-02-21 17:41:48 +01:00
IndefinitIndexBase& get(size_t n);
const IndefinitIndexBase& get(size_t n) const;
2017-02-16 16:06:23 +01:00
MetaType getMetaPos() const;
MultiIndex& atMeta(const MetaType& metaPos);
MultiIndex& operator()(Indices&&... inds);
2017-02-21 17:41:48 +01:00
MultiIndex& operator()(const Indices&... inds);
2017-02-16 13:12:20 +01:00
// dimension of MultiRange; includes ALL degrees of freedom
virtual size_t dim() const override;
virtual size_t giveSubStepSize(IndefinitIndexBase* subIndex) override;
2017-02-16 11:20:40 +01:00
};
2017-02-21 17:41:48 +01:00
/*****************************
* IndexGetter Functions *
****************************/
2017-02-16 11:20:40 +01:00
template <class... Ranges>
class MultiRange : public RangeBase<MultiIndex<typename Ranges::IndexType...> >
2017-02-16 11:20:40 +01:00
{
public:
typedef std::tuple<std::shared_ptr<Ranges>...> SpaceType;
typedef typename RangeBase<MultiIndex<typename Ranges::IndexType...> >::IndexType
IndexType;
static const size_t dim = sizeof...(Ranges);
2017-05-24 19:01:02 +02:00
template <size_t N> // !!! return ref to range, not the corresp. shared ptr
auto getRange() -> ;
//typename std::tuple_element<N, std::tuple<std::shared_ptr<Ranges>...> >::type& getRange();
2017-02-16 11:20:40 +01:00
template <size_t N> // !!!
auto getRange() const ->;
//typename std::tuple_element<N, std::tuple<std::shared_ptr<Ranges>...> >::type const& getRange() const;
2017-02-21 17:41:48 +01:00
size_t size() const override;
2017-02-28 19:29:52 +01:00
const SpaceType& space() const;
virtual MultiRangeType type() const override;
virtual MultiIndex<typename Ranges::IndexType...> begin() const override;
virtual MultiIndex<typename Ranges::IndexType...> end() const override;
2017-05-24 19:01:02 +02:00
virtual std::shared_ptr<IndefinitIndexBase> indexInstance() const override;
2017-02-16 11:20:40 +01:00
protected:
2017-06-01 13:19:27 +02:00
MultiRange() = delete;
MultiRange(const MultiRange& in) = delete;
MultiRange& operator=(const MultiRange& in) = delete;
MultiRange(const std::shared_ptr<Ranges>&... rs);
MultiRange(const SpaceType& space);
SpaceType mSpace;
2017-02-16 11:20:40 +01:00
};
}
template <typename... Ts>
std::ostream& operator<<(std::ostream& os,
const std::tuple<Ts...>& meta);
2017-02-16 11:20:40 +01:00
#include "multi_range.cc"
#endif