cnorxz/src/single_range.h

282 lines
6.7 KiB
C
Raw Normal View History

2017-02-16 11:20:40 +01:00
// -*- C++ -*-
#ifndef __single_range_h__
#define __single_range_h__
#include <cstdlib>
#include <vector>
2017-06-01 13:19:27 +02:00
#include <memory>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
#include "index_base.h"
#include "range_base.h"
namespace MultiArrayTools
{
2017-08-04 11:27:47 +02:00
template <typename U, RangeType TYPE>
class SingleIndex : public IndexInterface<U>
2017-02-16 11:20:40 +01:00
{
public:
2017-08-04 11:27:47 +02:00
typedef IndexBase IB;
2017-08-04 14:57:19 +02:00
typedef U MetaType;
2017-08-11 15:26:10 +02:00
typedef SingleRange<U,TYPE> RangeType;
2017-08-04 11:27:47 +02:00
//DEFAULT_MEMBERS_X(SingleIndex);
2017-08-04 11:27:47 +02:00
SingleIndex(const std::shared_ptr<SingleRange<U,TYPE> >& range);
virtual IndexType type() const override;
virtual SingleIndex& operator=(size_t pos) override;
virtual SingleIndex& operator++() override;
virtual SingleIndex& operator--() override;
virtual int pp(std::shared_ptr<IndexBase>& idxPtr) override;
virtual int mm(std::shared_ptr<IndexBase>& idxPtr) override;
2017-08-30 17:56:38 +02:00
2017-08-04 14:57:19 +02:00
virtual U meta() const override;
virtual SingleIndex& at(const U& metaPos) override;
2017-02-16 11:20:40 +01:00
virtual size_t dim() const override; // = 1
virtual bool last() const override;
virtual bool first() const override;
virtual std::shared_ptr<IndexBase> getPtr(size_t n) const override;
virtual size_t getStepSize(size_t n) const override;
virtual std::string id() const override { return std::string("sin") + std::to_string(IB::mId); }
2017-02-16 11:20:40 +01:00
};
2017-07-28 11:33:31 +02:00
template <typename U, RangeType TYPE>
class SingleRangeFactory : public RangeFactoryBase
{
public:
typedef SingleRange<U,TYPE> oType;
SingleRangeFactory() = delete;
SingleRangeFactory(const std::vector<U>& space);
std::shared_ptr<RangeBase> create();
};
2017-02-16 11:20:40 +01:00
template <typename U, RangeType TYPE>
2017-08-04 11:27:47 +02:00
class SingleRange : public RangeInterface<SingleIndex<U,TYPE> >
2017-02-16 11:20:40 +01:00
{
public:
2017-08-04 11:27:47 +02:00
typedef RangeBase RB;
typedef typename RangeInterface<SingleIndex<U,TYPE> >::IndexType IndexType;
2017-02-16 16:06:23 +01:00
virtual size_t size() const override;
2017-08-04 11:27:47 +02:00
virtual size_t dim() const override;
2017-02-16 11:20:40 +01:00
const U& get(size_t pos) const;
size_t getMeta(const U& metaPos) const;
2017-08-04 14:57:19 +02:00
virtual IndexType begin() const override;
virtual IndexType end() const override;
virtual std::shared_ptr<IndexBase> index() const override;
friend SingleRangeFactory<U,TYPE>;
2017-02-16 11:20:40 +01:00
protected:
SingleRange() = delete;
SingleRange(const SingleRange& in) = delete;
2017-06-01 13:19:27 +02:00
SingleRange(const std::vector<U>& space);
2017-02-16 11:20:40 +01:00
std::vector<U> mSpace;
};
2017-03-14 23:00:41 +01:00
}
/* ========================= *
* --- TEMPLATE CODE --- *
* ========================= */
2017-03-14 23:00:41 +01:00
namespace MultiArrayTools
{
/******************
* SingleIndex *
******************/
template <typename U, RangeType TYPE>
SingleIndex<U,TYPE>::SingleIndex(const std::shared_ptr<SingleRange<U,TYPE> >& range) :
IndexInterface<U>(range, 0) {}
template <typename U, RangeType TYPE>
IndexType SingleIndex<U,TYPE>::type() const
{
return IndexType::SINGLE;
}
2017-06-01 13:19:27 +02:00
template <typename U, RangeType TYPE>
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::operator=(size_t pos)
{
IB::mPos = pos;
return *this;
}
template <typename U, RangeType TYPE>
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::operator++()
{
++IB::mPos;
return *this;
}
2017-06-01 13:19:27 +02:00
template <typename U, RangeType TYPE>
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::operator--()
{
--IB::mPos;
return *this;
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
int SingleIndex<U,TYPE>::pp(std::shared_ptr<IndexBase>& idxPtr)
2017-03-24 15:05:02 +01:00
{
++(*this);
return 1;
}
template <typename U, RangeType TYPE>
int SingleIndex<U,TYPE>::mm(std::shared_ptr<IndexBase>& idxPtr)
{
--(*this);
return 1;
}
template <typename U, RangeType TYPE>
U SingleIndex<U,TYPE>::meta() const
{
return std::dynamic_pointer_cast<SingleRange<U,TYPE> const>( IB::mRangePtr )->get( IB::pos() );
}
2017-03-24 15:05:02 +01:00
template <typename U, RangeType TYPE>
SingleIndex<U,TYPE>& SingleIndex<U,TYPE>::at(const U& metaPos)
{
operator=( std::dynamic_pointer_cast<SingleRange<U,TYPE> const>( IB::mRangePtr )->getMeta( metaPos ) );
return *this;
}
2017-06-01 13:19:27 +02:00
template <typename U, RangeType TYPE>
size_t SingleIndex<U,TYPE>::dim() const
{
return 1;
}
2017-03-24 15:05:02 +01:00
template <typename U, RangeType TYPE>
bool SingleIndex<U,TYPE>::last() const
2017-03-14 23:00:41 +01:00
{
return IB::mPos == IB::mRangePtr->size() - 1;
}
template <typename U, RangeType TYPE>
bool SingleIndex<U,TYPE>::first() const
{
return IB::mPos == 0;
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
std::shared_ptr<IndexBase> SingleIndex<U,TYPE>::getPtr(size_t n) const
{
return std::shared_ptr<IndexBase>();
}
2017-06-01 13:19:27 +02:00
template <typename U, RangeType TYPE>
size_t SingleIndex<U,TYPE>::getStepSize(size_t n) const
{
return 1;
}
/********************
* SingleRange *
********************/
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
SingleRangeFactory<U,TYPE>::SingleRangeFactory(const std::vector<U>& space)
2017-03-14 23:00:41 +01:00
{
mProd = std::shared_ptr<oType>( new SingleRange<U,TYPE>( space ) );
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
std::shared_ptr<RangeBase> SingleRangeFactory<U,TYPE>::create()
{
setSelf();
return mProd;
}
/********************
* SingleRange *
********************/
template <typename U, RangeType TYPE>
SingleRange<U,TYPE>::SingleRange(const std::vector<U>& space) : RangeInterface<SingleIndex<U,TYPE> >(),
mSpace(space) {}
template <typename U, RangeType TYPE>
const U& SingleRange<U,TYPE>::get(size_t pos) const
2017-03-14 23:00:41 +01:00
{
return mSpace[pos];
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
size_t SingleRange<U,TYPE>::getMeta(const U& metaPos) const
{
size_t cnt = 0;
for(auto& x: mSpace){
if(x == metaPos){
return cnt;
}
++cnt;
}
return cnt;
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
size_t SingleRange<U,TYPE>::size() const
{
return mSpace.size();
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
size_t SingleRange<U,TYPE>::dim() const
2017-03-14 23:00:41 +01:00
{
return 1;
}
2017-03-14 23:00:41 +01:00
template <typename U, RangeType TYPE>
typename SingleRange<U,TYPE>::IndexType SingleRange<U,TYPE>::begin() const
{
SingleIndex<U,TYPE> i( std::dynamic_pointer_cast<SingleRange<U,TYPE> >
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
i = 0;
return i;
}
template <typename U, RangeType TYPE>
typename SingleRange<U,TYPE>::IndexType SingleRange<U,TYPE>::end() const
{
SingleIndex<U,TYPE> i( std::dynamic_pointer_cast<SingleRange<U,TYPE> >
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
i = size();
return i;
}
2017-03-14 23:00:41 +01:00
// put this in the interface class !!!
template <typename U, RangeType TYPE>
std::shared_ptr<IndexBase> SingleRange<U,TYPE>::index() const
{
return std::make_shared<SingleIndex<U,TYPE> >
( std::dynamic_pointer_cast<SingleRange<U,TYPE> >
( std::shared_ptr<RangeBase>( RB::mThis ) ) );
}
2017-02-16 11:20:40 +01:00
}
2017-02-16 11:20:40 +01:00
#include "range_types/header.h"
2017-02-16 11:20:40 +01:00
#endif