2017-02-16 11:20:40 +01:00
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
#ifndef __multi_range_h__
|
|
|
|
#define __multi_range_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <tuple>
|
2017-05-22 13:39:37 +02:00
|
|
|
#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-07-25 17:46:59 +02:00
|
|
|
class MultiIndex : public IndexInterface<std::tuple<decltype(Indices().meta())...> >
|
2017-02-16 11:20:40 +01:00
|
|
|
{
|
2017-02-20 17:18:53 +01:00
|
|
|
public:
|
|
|
|
|
2017-08-04 11:27:47 +02:00
|
|
|
typedef IndexBase IB;
|
2017-07-25 17:46:59 +02:00
|
|
|
typedef std::tuple<std::shared_ptr<Indices>...> IndexPack;
|
|
|
|
typedef std::tuple<decltype(Indices().meta())...> MetaType;
|
2017-07-26 16:45:09 +02:00
|
|
|
typedef IndexInterface<MetaType> IndexI;
|
2017-08-04 11:27:47 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
IndexPack mIPack;
|
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
public:
|
2017-02-28 19:29:52 +01:00
|
|
|
MultiIndex() = default;
|
|
|
|
// NO DEFAULT HERE !!!
|
2017-07-26 16:45:09 +02:00
|
|
|
// ( have to assign sub-indices (ptr!) correctly )
|
2017-02-28 19:29:52 +01:00
|
|
|
MultiIndex(const MultiIndex& in);
|
|
|
|
MultiIndex& operator=(const MultiIndex& in);
|
2017-05-24 19:01:02 +02:00
|
|
|
|
2017-07-25 17:46:59 +02:00
|
|
|
template <class MRange>
|
|
|
|
MultiIndex(const std::shared_ptr<MRange>& range);
|
2017-02-22 19:06:23 +01:00
|
|
|
|
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-07-26 16:45:09 +02:00
|
|
|
|
|
|
|
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 ) )&;
|
2017-07-26 16:45:09 +02:00
|
|
|
|
2017-07-25 17:46:59 +02:00
|
|
|
const IndexBase& get(size_t n) const;
|
|
|
|
|
|
|
|
virtual MetaType meta() const override;
|
2017-07-26 16:45:09 +02:00
|
|
|
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-20 17:18:53 +01:00
|
|
|
|
2017-02-16 13:12:20 +01:00
|
|
|
virtual size_t dim() const override;
|
2017-02-16 11:20:40 +01:00
|
|
|
};
|
|
|
|
|
2017-07-26 18:38:11 +02:00
|
|
|
/*************************
|
|
|
|
* MultiRangeFactory *
|
|
|
|
*************************/
|
|
|
|
|
|
|
|
template <class... Ranges>
|
2017-07-27 14:48:41 +02:00
|
|
|
class MultiRangeFactory : public RangeFactoryBase
|
2017-07-26 18:38:11 +02:00
|
|
|
{
|
|
|
|
public:
|
2017-07-28 11:33:31 +02:00
|
|
|
typedef MultiRange<Ranges...> oType;
|
|
|
|
|
2017-07-26 18:38:11 +02:00
|
|
|
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-07-26 18:38:11 +02:00
|
|
|
|
|
|
|
virtual std::shared_ptr<RangeBase> create() override;
|
|
|
|
};
|
2017-02-21 17:41:48 +01:00
|
|
|
|
2017-07-26 18:38:11 +02:00
|
|
|
/******************
|
|
|
|
* MultiRange *
|
|
|
|
******************/
|
|
|
|
|
2017-02-16 11:20:40 +01:00
|
|
|
template <class... Ranges>
|
2017-07-25 17:46:59 +02:00
|
|
|
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;
|
2017-05-22 13:39:37 +02:00
|
|
|
typedef std::tuple<std::shared_ptr<Ranges>...> SpaceType;
|
2017-07-27 14:48:41 +02:00
|
|
|
typedef typename RangeInterface<MultiIndex<typename Ranges::IndexType...> >::IndexType IndexType;
|
2017-02-20 17:18:53 +01:00
|
|
|
|
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 ) )&;
|
2017-07-25 17:46:59 +02:00
|
|
|
|
2017-07-27 14:48:41 +02:00
|
|
|
virtual size_t dim() const override;
|
|
|
|
virtual size_t size() const override;
|
2017-02-28 19:29:52 +01:00
|
|
|
|
2017-07-25 17:46:59 +02:00
|
|
|
const SpaceType& space() const;
|
2017-02-17 18:10:03 +01:00
|
|
|
|
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
|
|
|
|
2017-07-25 17:46:59 +02:00
|
|
|
virtual std::shared_ptr<IndexBase> index() const override;
|
2017-07-26 18:38:11 +02:00
|
|
|
|
|
|
|
friend MultiRangeFactory<Ranges...>;
|
2017-02-16 11:20:40 +01:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "multi_range.cc"
|
|
|
|
|
|
|
|
#endif
|