cnorxz/src/multi_range.h

158 lines
4.2 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>
2017-08-11 15:26:10 +02:00
class MultiIndex : public IndexInterface<std::tuple<typename Indices::MetaType...> >
2017-02-16 11:20:40 +01:00
{
public:
2017-08-04 11:27:47 +02:00
typedef IndexBase IB;
typedef std::tuple<std::shared_ptr<Indices>...> IndexPack;
2017-08-11 15:26:10 +02:00
typedef std::tuple<typename Indices::MetaType...> MetaType;
typedef IndexInterface<MetaType> IndexI;
2017-08-11 15:26:10 +02:00
typedef MultiRange<typename Indices::RangeType...> RangeType;
2017-08-04 11:27:47 +02:00
protected:
IndexPack mIPack;
2017-08-29 17:52:08 +02:00
std::array<size_t,sizeof...(Indices)+1> mBlockSizes;
2017-02-16 11:20:40 +01:00
public:
2017-08-11 15:26:10 +02:00
MultiIndex() = delete;
2017-02-28 19:29:52 +01:00
// NO DEFAULT HERE !!!
// ( have to assign sub-indices (ptr!) correctly )
//MultiIndex(const MultiIndex& in);
//MultiIndex& operator=(const MultiIndex& in);
2017-08-11 15:26:10 +02:00
MultiIndex& operator=(ContainerIndex<Indices...>& ci);
2017-05-24 19:01:02 +02:00
template <class MRange>
MultiIndex(const std::shared_ptr<MRange>& range);
virtual IndexType type() const override;
2017-02-16 11:20:40 +01:00
virtual MultiIndex& operator++() override;
virtual MultiIndex& operator--() override;
2017-05-24 19:01:02 +02:00
virtual MultiIndex& operator=(size_t pos) override;
2017-08-30 17:56:38 +02:00
virtual size_t pp(std::shared_ptr<const IndexBase>& idxPtr) override;
virtual size_t mm(std::shared_ptr<const IndexBase>& idxPtr) override;
template <size_t DIR>
MultiIndex& up();
template <size_t DIR>
MultiIndex& down();
2017-02-16 11:20:40 +01:00
template <size_t N>
2017-08-04 11:27:47 +02:00
auto get() const -> decltype( *std::get<N>( mIPack ) )&;
template <size_t N>
auto getPtr() const -> decltype( std::get<N>( mIPack ) )&;
const IndexBase& get(size_t n) const;
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const override;
2017-08-30 17:56:38 +02:00
virtual size_t getStepSize(size_t n) const override;
virtual MetaType meta() const override;
virtual MultiIndex& at(const MetaType& metaPos) override;
2017-08-04 14:57:19 +02:00
virtual bool first() const override;
virtual bool last() const override;
2017-02-16 13:12:20 +01:00
virtual size_t dim() const override;
2017-08-11 15:26:10 +02:00
std::shared_ptr<RangeType> range() const;
2017-08-30 17:56:38 +02:00
//virtual MultiIndex& lock(std::shared_ptr<const IndexBase>& idx) override;
2017-08-29 17:52:08 +02:00
2017-08-26 16:45:46 +02:00
// raplace instances (in contrast to its analogon in ContainerIndex
// MultiIndices CANNOT be influences be its subindices, so there is
// NO foreign/external controll)
// Do NOT share index instances between two or more MultiIndex instances
MultiIndex& operator()(std::shared_ptr<Indices>&... indices);
virtual std::string id() const override { return std::string("mul") + std::to_string(IB::mId); }
2017-02-16 11:20:40 +01:00
};
/*************************
* MultiRangeFactory *
*************************/
template <class... Ranges>
class MultiRangeFactory : public RangeFactoryBase
{
public:
2017-07-28 11:33:31 +02:00
typedef MultiRange<Ranges...> oType;
MultiRangeFactory() = delete;
MultiRangeFactory(const std::shared_ptr<Ranges>&... rs);
2017-08-04 11:27:47 +02:00
MultiRangeFactory(const typename MultiRange<Ranges...>::SpaceType& space);
2017-08-11 15:26:10 +02:00
MultiRangeFactory(const std::shared_ptr<ContainerRange<Ranges...> >& cr);
virtual std::shared_ptr<RangeBase> create() override;
};
2017-02-21 17:41:48 +01:00
/******************
* MultiRange *
******************/
2017-02-16 11:20:40 +01:00
template <class... Ranges>
class MultiRange : public RangeInterface<MultiIndex<typename Ranges::IndexType...> >
2017-02-16 11:20:40 +01:00
{
public:
2017-08-04 11:27:47 +02:00
typedef RangeBase RB;
typedef std::tuple<std::shared_ptr<Ranges>...> SpaceType;
typedef typename RangeInterface<MultiIndex<typename Ranges::IndexType...> >::IndexType IndexType;
2017-08-04 11:27:47 +02:00
protected:
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;
public:
static const size_t sdim = sizeof...(Ranges);
2017-02-16 11:20:40 +01:00
2017-08-04 11:27:47 +02:00
template <size_t N>
auto get() const -> decltype( *std::get<N>( mSpace ) )&;
2017-08-04 14:57:19 +02:00
template <size_t N>
auto getPtr() const -> decltype( std::get<N>( mSpace ) )&;
virtual size_t dim() const override;
virtual size_t size() const override;
2017-02-28 19:29:52 +01:00
const SpaceType& space() const;
2017-08-04 11:27:47 +02:00
virtual IndexType begin() const override;
virtual IndexType end() const override;
2017-05-24 19:01:02 +02:00
virtual std::shared_ptr<IndexBase> index() const override;
friend MultiRangeFactory<Ranges...>;
2017-02-16 11:20:40 +01:00
};
}
#include "multi_range.cc"
#endif