cnorxz/src/include/ranges/anonymous_range.h

123 lines
3 KiB
C
Raw Normal View History

2017-05-31 16:44:28 +02:00
// -*- C++ -*-
#ifndef __anonymous_range_h__
#define __anonymous_range_h__
#include <cstdlib>
2017-12-17 17:40:55 +01:00
//#include "base_def.h"
#include "ranges/range_base.h"
#include "ranges/rpheader.h"
2017-05-31 16:44:28 +02:00
namespace MultiArrayTools
{
2017-12-17 17:40:55 +01:00
typedef SingleIndex<size_t,SpaceType::NONE> AnonymousIndex;
class AnonymousRangeFactory : public RangeFactoryBase
{
public:
2017-12-05 17:31:57 +01:00
typedef AnonymousRange oType;
AnonymousRangeFactory() = delete;
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRangeFactory(const std::tuple<std::shared_ptr<RangeTypes>...>& origs);
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRangeFactory(std::shared_ptr<RangeTypes>... origs);
std::shared_ptr<RangeBase> create();
};
2017-05-31 16:44:28 +02:00
class AnonymousRange : public RangeInterface<AnonymousIndex>
2017-05-31 16:44:28 +02:00
{
typedef RangeBase RB;
typedef typename RangeInterface<AnonymousIndex>::IndexType IndexType;
virtual size_t size() const override;
virtual size_t dim() const override;
2017-12-05 17:31:57 +01:00
size_t get(size_t pos) const;
size_t getMeta(size_t metaPos) const;
virtual IndexType begin() const override;
virtual IndexType end() const override;
virtual std::shared_ptr<VIWB> index() const override;
friend AnonymousRangeFactory;
protected:
AnonymousRange() = delete;
AnonymousRange(const AnonymousRange& in) = delete;
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRange(const std::tuple<std::shared_ptr<RangeTypes>...>& origs);
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRange(std::shared_ptr<RangeTypes>... origs);
2017-05-31 16:44:28 +02:00
size_t mSize;
std::vector<std::shared_ptr<RangeBase> > mOrig;
2017-05-31 16:44:28 +02:00
};
}
/* ========================= *
* --- TEMPLATE CODE --- *
* ========================= */
namespace MultiArrayTools
{
2017-12-05 17:31:57 +01:00
/***********************
* AnonymousRange *
2017-12-05 17:31:57 +01:00
***********************/
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRangeFactory::AnonymousRangeFactory(const std::tuple<std::shared_ptr<RangeTypes>...>& origs)
{
mProd = std::shared_ptr<oType>( new AnonymousRange( origs ) );
}
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRangeFactory::AnonymousRangeFactory(std::shared_ptr<RangeTypes>... origs)
{
mProd = std::shared_ptr<oType>( new AnonymousRange( origs... ) );
}
2017-12-05 17:31:57 +01:00
/***********************
* AnonymousRange *
2017-12-05 17:31:57 +01:00
***********************/
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRange::AnonymousRange(const std::tuple<std::shared_ptr<RangeTypes>...>& origs) :
RangeInterface<AnonymousIndex>()
{
2017-12-17 17:40:55 +01:00
mOrig.resize(sizeof...(RangeTypes));
RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( origs, mOrig );
RPackNum<sizeof...(RangeTypes)-1>::getSize( origs );
}
2017-12-17 17:40:55 +01:00
template <class... RangeTypes>
AnonymousRange::AnonymousRange(std::shared_ptr<RangeTypes>... origs) :
RangeInterface<AnonymousIndex>()
{
auto rst = std::make_tuple(origs...);
2017-12-17 17:40:55 +01:00
mOrig.resize(sizeof...(RangeTypes));
//RPackNum<sizeof...(RangeTypes)-1>::RangesToVec( rst, mOrig );
//RPackNum<sizeof...(RangeTypes)-1>::getSize( rst );
}
/*****************
* Functions *
*****************/
std::shared_ptr<AnonymousRange> defaultRange(size_t size = 0);
}
2017-05-31 16:44:28 +02:00
#endif