2017-07-27 14:48:41 +02:00
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
#ifndef __container_range_h__
|
|
|
|
#define __container_range_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
2017-07-28 14:02:44 +02:00
|
|
|
#include <tuple>
|
|
|
|
#include <memory>
|
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
#include "base_def.h"
|
2017-07-28 14:02:44 +02:00
|
|
|
#include "range_base.h"
|
|
|
|
#include "index_base.h"
|
2017-07-27 14:48:41 +02:00
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
2017-08-25 22:03:20 +02:00
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
template <class... Indices>
|
2017-08-11 15:26:10 +02:00
|
|
|
class ContainerIndex : public IndexInterface<std::tuple<typename Indices::MetaType...> >
|
2017-08-04 16:19:50 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
typedef IndexBase IB;
|
2017-08-11 15:26:10 +02:00
|
|
|
typedef std::tuple<typename Indices::MetaType...> MetaType;
|
2017-08-04 16:19:50 +02:00
|
|
|
typedef std::tuple<std::shared_ptr<Indices>...> IndexPack;
|
2017-08-11 15:26:10 +02:00
|
|
|
typedef IndexInterface<std::tuple<typename Indices::MetaType...> > IndexI;
|
|
|
|
typedef ContainerRange<typename Indices::RangeType...> RangeType;
|
2017-08-04 16:19:50 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
bool mExternControl = false;
|
|
|
|
IndexPack mIPack;
|
|
|
|
|
|
|
|
public:
|
2017-08-11 15:26:10 +02:00
|
|
|
ContainerIndex() = delete;
|
2017-08-04 16:19:50 +02:00
|
|
|
|
2017-08-11 16:45:03 +02:00
|
|
|
//ContainerIndex(const ContainerIndex& in);
|
|
|
|
//ContainerIndex& operator=(const ContainerIndex& in);
|
2017-08-04 16:19:50 +02:00
|
|
|
|
|
|
|
template <class MRange>
|
|
|
|
ContainerIndex(const std::shared_ptr<MRange>& range);
|
|
|
|
|
2017-08-28 18:28:43 +02:00
|
|
|
virtual IndexType type() const override;
|
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
virtual ContainerIndex& operator++() override;
|
|
|
|
virtual ContainerIndex& operator--() override;
|
|
|
|
virtual ContainerIndex& operator=(size_t pos) override;
|
|
|
|
|
|
|
|
virtual MetaType meta() const override;
|
|
|
|
virtual ContainerIndex& at(const MetaType& metaPos) override;
|
|
|
|
|
|
|
|
virtual bool first() const override;
|
|
|
|
virtual bool last() const override;
|
|
|
|
|
|
|
|
virtual size_t dim() const override;
|
2017-08-07 17:11:03 +02:00
|
|
|
|
|
|
|
ContainerIndex& sync(); // recalculate 'IB::mPos' when externalControl == true
|
2017-08-04 16:19:50 +02:00
|
|
|
|
2017-08-07 17:11:03 +02:00
|
|
|
template <size_t N>
|
|
|
|
auto get() const -> decltype( *std::get<N>( mIPack ) )&;
|
2017-08-04 16:19:50 +02:00
|
|
|
|
2017-08-11 15:26:10 +02:00
|
|
|
template <size_t N>
|
|
|
|
auto getPtr() const -> decltype( std::get<N>( mIPack ) )&;
|
2017-08-28 18:28:43 +02:00
|
|
|
|
|
|
|
virtual std::shared_ptr<const IndexBase> getPtr(size_t n) const override;
|
2017-08-11 15:26:10 +02:00
|
|
|
|
2017-08-07 17:11:03 +02:00
|
|
|
ContainerIndex& operator()(const std::shared_ptr<Indices>&... inds); // control via external indices
|
|
|
|
|
|
|
|
ContainerIndex& operator()(); // -> sync; just to shorten the code
|
|
|
|
|
2017-08-11 16:45:03 +02:00
|
|
|
std::shared_ptr<RangeType> range() const;
|
2017-08-25 22:03:20 +02:00
|
|
|
virtual std::string id() const override { return std::string("con") + std::to_string(IB::mId); }
|
2017-08-04 16:19:50 +02:00
|
|
|
};
|
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
|
|
|
|
template <class... Ranges>
|
|
|
|
class ContainerRangeFactory : public RangeFactoryBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2017-07-28 11:33:31 +02:00
|
|
|
typedef ContainerRange<Ranges...> oType;
|
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
ContainerRangeFactory() = delete;
|
2017-07-27 20:34:14 +02:00
|
|
|
ContainerRangeFactory(const std::shared_ptr<Ranges>&... rs);
|
2017-08-04 11:27:47 +02:00
|
|
|
ContainerRangeFactory(const typename ContainerRange<Ranges...>::SpaceType& space);
|
2017-07-27 20:34:14 +02:00
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
virtual std::shared_ptr<RangeBase> create() override;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
template <class... Ranges>
|
|
|
|
class ContainerRange : public RangeInterface<ContainerIndex<typename Ranges::IndexType...> >
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2017-08-04 11:27:47 +02:00
|
|
|
typedef RangeBase RB;
|
2017-07-27 14:48:41 +02:00
|
|
|
typedef std::tuple<std::shared_ptr<Ranges>...> SpaceType;
|
|
|
|
typedef typename RangeInterface<ContainerIndex<typename Ranges::IndexType...> >::IndexType IndexType;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
ContainerRange() = default;
|
|
|
|
ContainerRange(const ContainerRange& in) = delete;
|
2017-08-04 16:19:50 +02:00
|
|
|
ContainerRange& operator=(const ContainerRange& in) = delete;
|
|
|
|
|
2017-07-27 20:34:14 +02:00
|
|
|
ContainerRange(const std::shared_ptr<Ranges>&... rs);
|
2017-07-27 14:48:41 +02:00
|
|
|
ContainerRange(const SpaceType& space);
|
|
|
|
|
|
|
|
SpaceType mSpace;
|
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
public:
|
|
|
|
static const size_t sdim = sizeof...(Ranges);
|
2017-07-27 14:48:41 +02:00
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
virtual size_t dim() const override;
|
|
|
|
virtual size_t size() const override;
|
2017-07-27 14:48:41 +02:00
|
|
|
|
2017-08-07 17:11:03 +02:00
|
|
|
template <size_t N>
|
|
|
|
auto get() const -> decltype( *std::get<N>( mSpace ) )&;
|
|
|
|
|
|
|
|
template <size_t N>
|
|
|
|
auto getPtr() const -> decltype( std::get<N>( mSpace ) )&;
|
2017-08-11 15:26:10 +02:00
|
|
|
|
|
|
|
const SpaceType& space() const;
|
2017-08-07 17:11:03 +02:00
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
virtual IndexType begin() const override;
|
|
|
|
virtual IndexType end() const override;
|
2017-08-07 17:11:03 +02:00
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
virtual std::shared_ptr<IndexBase> index() const override;
|
2017-07-27 14:48:41 +02:00
|
|
|
|
2017-08-04 16:19:50 +02:00
|
|
|
friend ContainerRangeFactory<Ranges...>;
|
2017-07-27 20:34:14 +02:00
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
};
|
2017-08-04 16:19:50 +02:00
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
} // end namespace MultiArrayTools
|
|
|
|
|
|
|
|
#include "container_range.cc"
|
|
|
|
|
|
|
|
#endif
|