2017-05-31 16:44:28 +02:00
|
|
|
// -*- C++ -*-
|
|
|
|
|
|
|
|
#ifndef __anonymous_range_h__
|
|
|
|
#define __anonymous_range_h__
|
|
|
|
|
|
|
|
#include <cstdlib>
|
|
|
|
#include "base_def.h"
|
|
|
|
|
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
|
2017-12-04 18:29:18 +01:00
|
|
|
typedef SingleIndex<size_t,RangeType::NONE> AnonymousIndex;
|
|
|
|
|
|
|
|
template <typename U, RangeType TYPE>
|
|
|
|
class AnonymousRangeFactory : public RangeFactoryBase
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2017-12-05 17:31:57 +01:00
|
|
|
typedef AnonymousRange oType;
|
2017-12-04 18:29:18 +01:00
|
|
|
|
|
|
|
AnonymousRangeFactory() = delete;
|
|
|
|
AnonymousRangeFactory(const std::shared_ptr<Ranges>... origs);
|
|
|
|
std::shared_ptr<RangeBase> create();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2017-05-31 16:44:28 +02:00
|
|
|
|
2017-12-04 18:29:18 +01:00
|
|
|
class AnonymousRange : public RangeInterface<AnonymousIndex>
|
2017-05-31 16:44:28 +02:00
|
|
|
{
|
2017-12-04 18:29:18 +01: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;
|
2017-12-04 18:29:18 +01:00
|
|
|
|
|
|
|
virtual IndexType begin() const override;
|
|
|
|
virtual IndexType end() const override;
|
|
|
|
virtual std::shared_ptr<IndexBase> index() const override;
|
|
|
|
|
|
|
|
friend AnonymousRangeFactory;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
AnonymousRange() = delete;
|
|
|
|
AnonymousRange(const AnonymousRange& in) = delete;
|
|
|
|
|
|
|
|
template <class Ranges...>
|
|
|
|
AnonymousRange(const std::shared_ptr<Ranges>... origs);
|
2017-05-31 16:44:28 +02:00
|
|
|
|
2017-12-04 18:29:18 +01:00
|
|
|
size_t mSize;
|
|
|
|
|
|
|
|
std::vector<std::shared_ptr<RangeBase> > mOrig;
|
2017-05-31 16:44:28 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-11-20 21:35:25 +01:00
|
|
|
/* ========================= *
|
|
|
|
* --- TEMPLATE CODE --- *
|
|
|
|
* ========================= */
|
|
|
|
|
2017-12-04 18:29:18 +01:00
|
|
|
namespace MultiArrayTools
|
|
|
|
{
|
|
|
|
|
2017-12-05 17:31:57 +01:00
|
|
|
/***********************
|
2017-12-04 18:29:18 +01:00
|
|
|
* AnonymousRange *
|
2017-12-05 17:31:57 +01:00
|
|
|
***********************/
|
2017-12-04 18:29:18 +01:00
|
|
|
|
|
|
|
AnonymousRangeFactory::AnonymousRangeFactory(const std::shared_ptr<Ranges>... origs)
|
|
|
|
{
|
|
|
|
mProd = std::shared_ptr<oType>( new AnonymousRange( space ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
std::shared_ptr<RangeBase> AnonymousRangeFactory::create()
|
|
|
|
{
|
|
|
|
setSelf();
|
|
|
|
return mProd;
|
|
|
|
}
|
|
|
|
|
2017-12-05 17:31:57 +01:00
|
|
|
/***********************
|
2017-12-04 18:29:18 +01:00
|
|
|
* AnonymousRange *
|
2017-12-05 17:31:57 +01:00
|
|
|
***********************/
|
|
|
|
|
|
|
|
template <class... Ranges>
|
2017-12-04 18:29:18 +01:00
|
|
|
AnonymousRange::AnonymousRange(const std::shared_ptr<Ranges>... origs) :
|
|
|
|
RangeInterface<AnonymousIndex>()
|
|
|
|
{
|
2017-12-05 17:31:57 +01:00
|
|
|
mOrig.resize(sizeof...(Ranges));
|
|
|
|
PackNum<sizeof...(Ranges)-1>::RangesToVec();
|
2017-12-04 18:29:18 +01:00
|
|
|
// mOrig !!!!
|
|
|
|
// mSize !!! = (prod origs.size...)
|
|
|
|
}
|
|
|
|
|
2017-12-05 17:31:57 +01:00
|
|
|
size_t AnonymousRange::get(size_t pos) const
|
2017-12-04 18:29:18 +01:00
|
|
|
{
|
2017-12-05 17:31:57 +01:00
|
|
|
return pos;
|
2017-12-04 18:29:18 +01:00
|
|
|
}
|
|
|
|
|
2017-12-05 17:31:57 +01:00
|
|
|
size_t AnonymousRange::getMeta(size_t metaPos) const
|
2017-12-04 18:29:18 +01:00
|
|
|
{
|
|
|
|
return metaPos;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t AnonymousRange::size() const
|
|
|
|
{
|
|
|
|
return mSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t AnonymousRange::dim() const
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
typename AnonymousRange::IndexType AnonymousRange::begin() const
|
|
|
|
{
|
|
|
|
SingleIndex i( std::dynamic_pointer_cast<AnonymousRange>
|
|
|
|
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
|
|
|
|
i = 0;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
typename AnonymousRange::IndexType AnonymousRange::end() const
|
|
|
|
{
|
|
|
|
SingleIndex i( std::dynamic_pointer_cast<AnonymousRange>
|
|
|
|
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
|
|
|
|
i = size();
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
// put this in the interface class !!!
|
|
|
|
std::shared_ptr<IndexBase> AnonymousRange::index() const
|
|
|
|
{
|
|
|
|
return std::make_shared<SingleIndex >
|
|
|
|
( std::dynamic_pointer_cast<AnonymousRange>
|
|
|
|
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
|
|
|
|
}
|
|
|
|
}
|
2017-05-31 16:44:28 +02:00
|
|
|
|
|
|
|
#endif
|