slight changes in range interface (typeNum) + fixes in dynamic range meta/index

This commit is contained in:
Christian Zimmermann 2019-03-19 20:58:59 +01:00
parent 8ed5d01c46
commit 8a37107ac1
23 changed files with 308 additions and 84 deletions

View file

@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 2.8)
project(multi_array)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -g -Wpedantic -Ofast -march=native -faligned-new -funroll-loops -fopenmp")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -g -Wpedantic -O0 -march=native -faligned-new -funroll-loops -fopenmp")
enable_testing()

View file

@ -497,15 +497,23 @@ namespace MultiArrayTools
}
template <class MapF, SpaceType XSTYPE, class... Ranges>
size_t GenMapRange<MapF,XSTYPE,Ranges...>::typeNum() const
vector<size_t> GenMapRange<MapF,XSTYPE,Ranges...>::typeNum() const
{
return 0;
vector<size_t> o;
RPackNum<sizeof...(Ranges)-1>::getTypeNum(o,mSpace);
return o;
}
template <class MapF, SpaceType XSTYPE, class... Ranges>
size_t GenMapRange<MapF,XSTYPE,Ranges...>::cmeta(char* target, size_t pos) const
{
return RPackNum<sizeof...(Ranges)-1>::getCMeta(target,pos,mSpace);
return RPackNum<sizeof...(Ranges)-1>::getCMeta(target,pos,mSpace,cmetaSize());
}
template <class MapF, SpaceType XSTYPE, class... Ranges>
size_t GenMapRange<MapF,XSTYPE,Ranges...>::cmetaSize() const
{
return RPackNum<sizeof...(Ranges)-1>::getCMetaSize(mSpace);
}
template <class MapF, SpaceType XSTYPE, class... Ranges>

View file

@ -231,7 +231,7 @@ namespace MultiArrayTools
GenMapRange(const MapF& mapf, const Space& space);
Space mSpace;
const MapF& mMapf;
MapF mMapf;
std::shared_ptr<ORType> mOutRange;
MultiArray<size_t,ORType> mMapMult;
@ -257,8 +257,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -80,8 +80,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -176,13 +176,16 @@ namespace MultiArrayTools
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::operator++()
{
size_t ipos = mIVec.size()-1;
auto& ii = mIVec[ipos].first;
auto& jj = mIVec[ipos-1].first;
while(ii->pos() == ii->max()-1 and ipos != 0) {
(*ii) = 0;
++(*jj);
--ipos;
++IB::mPos;
if(mIvecInit){
size_t ipos = mIVec.size()-1;
auto& ii = mIVec[ipos].first;
auto& jj = mIVec[ipos-1].first;
while(ii->pos() == ii->max()-1 and ipos != 0) {
(*ii) = 0;
++(*jj);
--ipos;
}
}
return *this;
}
@ -190,13 +193,16 @@ namespace MultiArrayTools
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::operator--()
{
size_t ipos = mIVec.size()-1;
auto& ii = mIVec[ipos].first;
auto& jj = mIVec[ipos-1].first;
while(ii->pos() == 0 and ipos != 0) {
(*ii) = ii->max()-1;
--(*jj);
--ipos;
--IB::mPos;
if(mIvecInit){
size_t ipos = mIVec.size()-1;
auto& ii = mIVec[ipos].first;
auto& jj = mIVec[ipos-1].first;
while(ii->pos() == 0 and ipos != 0) {
(*ii) = ii->max()-1;
--(*jj);
--ipos;
}
}
return *this;
}
@ -204,6 +210,7 @@ namespace MultiArrayTools
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::sync()
{
assert(mIvecInit);
size_t sv = 1;
IB::mPos = 0;
for(size_t i = 0; i != mIVec.size(); ++i){
@ -217,6 +224,7 @@ namespace MultiArrayTools
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::operator()(const IVecT& ivec)
{
mIvecInit = true;
mIVec = ivec;
sync();
return *this;
@ -225,6 +233,7 @@ namespace MultiArrayTools
template <class EC>
DynamicIndex<EC>& DynamicIndex<EC>::operator()(const vector<std::shared_ptr<IndexW<EC>>>& ivec)
{
mIvecInit = true;
assert(mIVec.size() == ivec.size());
for(size_t i = 0; i != mIVec.size(); ++i){
mIVec[i].first = ivec[i];
@ -237,6 +246,7 @@ namespace MultiArrayTools
template <class... Indices>
DynamicIndex<EC>& DynamicIndex<EC>::operator()(const std::shared_ptr<Indices>&... is)
{
mIvecInit = true;
vector<std::shared_ptr<IndexW<EC>>> tmp =
{ std::make_shared<IndexWrapper<Indices,EC>>(is)... };
@ -320,6 +330,7 @@ namespace MultiArrayTools
template <class EC>
const IndexW<EC>& DynamicIndex<EC>::get(size_t n) const
{
assert(mIvecInit);
return *mIVec[n].first;
}
@ -439,7 +450,7 @@ namespace MultiArrayTools
template <class EC>
typename DynamicRange<EC>::MetaType DynamicRange<EC>::get(size_t pos) const
{
vector<char> out(cmeta(nullptr,0));
vector<char> out(cmetaSize());
cmeta(out.data(),pos);
return out;
}
@ -475,22 +486,42 @@ namespace MultiArrayTools
}
template <class EC>
size_t DynamicRange<EC>::typeNum() const
vector<size_t> DynamicRange<EC>::typeNum() const
{
return 0;
vector<size_t> o;
for(auto& x: mOrig){
auto tn = x->typeNum();
o.insert(o.end(), tn.begin(), tn.end());
}
return o;
}
template <class EC>
size_t DynamicRange<EC>::cmeta(char* target, size_t pos) const
{
size_t out = 0;
size_t off = cmetaSize();
for(size_t i = mOrig.size(); i != 0; --i) {
auto& x = mOrig[i-1];
const size_t redpos = pos % x->size();
const size_t offset = x->cmeta(target+out,redpos);
out += offset;
const size_t s = x->cmetaSize();
out += s;
off -= s;
pos -= redpos;
pos /= x->size();
x->cmeta(target+off,redpos);
}
assert(off == 0);
return out;
}
template <class EC>
size_t DynamicRange<EC>::cmetaSize() const
{
size_t out = 0;
for(size_t i = mOrig.size(); i != 0; --i) {
auto& x = mOrig[i-1];
out += x->cmetaSize();
}
return out;
}

View file

@ -177,7 +177,8 @@ namespace MultiArrayTools
typedef vector<std::pair<std::shared_ptr<IndexW<EC>>,size_t>> IVecT;
IVecT mIVec;
bool mIvecInit = false;
public:
typedef IndexInterface<DynamicIndex<EC>,vector<char>> IB;
typedef vector<char> MetaType;
@ -322,8 +323,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -200,8 +200,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;
@ -584,17 +585,26 @@ namespace MultiArrayTools
}
template <class... Ranges>
size_t MultiRange<Ranges...>::typeNum() const
vector<size_t> MultiRange<Ranges...>::typeNum() const
{
return 0;
vector<size_t> o;
RPackNum<sizeof...(Ranges)-1>::getTypeNum(o,mSpace);
return o;
}
template <class... Ranges>
size_t MultiRange<Ranges...>::cmeta(char* target, size_t pos) const
{
return RPackNum<sizeof...(Ranges)-1>::getCMeta(target,pos,mSpace);
const size_t off = cmetaSize();
return RPackNum<sizeof...(Ranges)-1>::getCMeta(target,pos,mSpace,off);
}
template <class... Ranges>
size_t MultiRange<Ranges...>::cmetaSize() const
{
return RPackNum<sizeof...(Ranges)-1>::getCMetaSize(mSpace);
}
template <class... Ranges>
std::string MultiRange<Ranges...>::stringMeta(size_t pos) const
{

View file

@ -80,8 +80,9 @@ namespace MultiArrayTools
std::intptr_t id() const;
virtual size_t typeNum() const = 0;
virtual vector<size_t> typeNum() const = 0;
virtual size_t cmeta(char* target, size_t pos) const = 0;
virtual size_t cmetaSize() const = 0;
virtual std::string stringMeta(size_t pos) const = 0;
virtual vector<char> data() const = 0; // usefull when writing to files, etc...

View file

@ -42,8 +42,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -46,8 +46,9 @@ namespace MultiArrayTools
virtual size_t size() const final;
virtual size_t dim() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -38,8 +38,9 @@ namespace MultiArrayTools
virtual size_t size() const final;
virtual size_t dim() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -39,8 +39,9 @@ namespace MultiArrayTools
virtual size_t size() const final;
virtual size_t dim() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;

View file

@ -371,13 +371,33 @@ namespace MultiArrayHelper
}
template <class... Ranges>
static inline size_t getCMeta(char* target, size_t pos, const std::tuple<std::shared_ptr<Ranges>...>& stp)
static inline size_t getCMeta(char* target, size_t pos, const std::tuple<std::shared_ptr<Ranges>...>& stp,
size_t off)
{
//constexpr size_t NN = sizeof...(Ranges);
auto& r = *std::get<N>(stp);
const size_t ownPos = pos % r.size();
const size_t s = r.cmetaSize();
off -= s;
r.cmeta(target+off,ownPos);
return s + RPackNum<N-1>::getCMeta(target, (pos - ownPos) / r.size(), stp, off);
}
template <class... Ranges>
static inline size_t getCMetaSize(const std::tuple<std::shared_ptr<Ranges>...>& stp)
{
constexpr size_t NN = sizeof...(Ranges);
auto& r = *std::get<NN-N-1>(stp);
const size_t ownPos = pos % r.size();
const size_t offset = r.cmeta(target,ownPos);
return offset + RPackNum<N-1>::getCMeta(target + offset , (pos - ownPos) / r.size(), stp);
return r.cmetaSize() + RPackNum<N-1>::getCMetaSize(stp);
}
template <class... Ranges>
static inline void getTypeNum(vector<size_t>& res, const std::tuple<std::shared_ptr<Ranges>...>& stp)
{
auto& r = *std::get<N>(stp);
auto tn = r.typeNum();
res.insert(res.begin(), tn.begin(), tn.end());
RPackNum<N-1>::getTypeNum(res, stp);
}
};
@ -649,12 +669,33 @@ namespace MultiArrayHelper
}
template <class... Ranges>
static inline size_t getCMeta(char* target, size_t pos, const std::tuple<std::shared_ptr<Ranges>...>& stp)
static inline size_t getCMeta(char* target, size_t pos, const std::tuple<std::shared_ptr<Ranges>...>& stp,
size_t off)
{
//constexpr size_t NN = sizeof...(Ranges);
auto& r = *std::get<0>(stp);
const size_t ownPos = pos % r.size();
const size_t s = r.cmetaSize();
off -= s;
assert(off == 0);
r.cmeta(target,ownPos);
return s;
}
template <class... Ranges>
static inline size_t getCMetaSize(const std::tuple<std::shared_ptr<Ranges>...>& stp)
{
constexpr size_t NN = sizeof...(Ranges);
auto& r = *std::get<NN-1>(stp);
const size_t ownPos = pos % r.size();
return r.cmeta(target,ownPos);
return r.cmetaSize();
}
template <class... Ranges>
static inline void getTypeNum(vector<size_t>& res, const std::tuple<std::shared_ptr<Ranges>...>& stp)
{
auto& r = *std::get<0>(stp);
auto tn = r.typeNum();
res.insert(res.begin(), tn.begin(), tn.end());
}
};

View file

@ -232,8 +232,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;
@ -582,17 +583,21 @@ namespace MultiArrayTools
}
template <typename U, SpaceType TYPE, size_t S>
size_t GenSingleRange<U,TYPE,S>::typeNum() const
vector<size_t> GenSingleRange<U,TYPE,S>::typeNum() const
{
return NumTypeMap<U>::num;
return {NumTypeMap<U>::num};
}
template <typename U, SpaceType TYPE, size_t S>
size_t GenSingleRange<U,TYPE,S>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<U*>(target) = mSpace[pos];
}
*reinterpret_cast<U*>(target) = mSpace[pos];
return sizeof(U);
}
template <typename U, SpaceType TYPE, size_t S>
size_t GenSingleRange<U,TYPE,S>::cmetaSize() const
{
return sizeof(U);
}

View file

@ -120,8 +120,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;
@ -404,7 +405,7 @@ namespace MultiArrayTools
}
template <class Range>
size_t SubRange<Range>::typeNum() const
vector<size_t> SubRange<Range>::typeNum() const
{
return mFullRange->typeNum();
}
@ -415,6 +416,12 @@ namespace MultiArrayTools
return mFullRange->cmeta(target, mSubSet[pos]);
}
template <class Range>
size_t SubRange<Range>::cmetaSize() const
{
return mFullRange->cmetaSize();
}
template <class Range>
std::string SubRange<Range>::stringMeta(size_t pos) const
{

View file

@ -16,6 +16,7 @@ namespace MultiArrayTools
struct TypeMap
{
typedef void type;
static constexpr size_t size = 0;
};
template <typename T>
@ -85,7 +86,7 @@ namespace MultiArrayTools
#define XCOMMAX() ,
#define include_type(t,n) template <> struct TypeMap<n> { typedef t type; };\
#define include_type(t,n) template <> struct TypeMap<n> { typedef t type; static constexpr size_t size = sizeof(t); }; \
template <> struct NumTypeMap<t> { static constexpr size_t num = n; };
include_type(size_t,1)
@ -110,11 +111,26 @@ namespace MultiArrayTools
include_type(std::array<int XCOMMAX() 9>,902)
#undef include_type
inline size_t sizeFromTypeNum(size_t tn)
{
if(tn == 1){ return sizeof(size_t); }
else if(tn == 2){ return sizeof(int); }
else if(tn == 3){ return sizeof(char); }
else if(tn == 4){ return sizeof(float); }
else if(tn == 5){ return sizeof(double); }
else if(tn == 6){ return sizeof(std::string); }
else if(tn > 6 and tn < 100){ assert(0); }
else if(tn >= 100 and tn < 200) { return sizeof(std::vector<char>); }
else { const size_t nx = tn % 100; return sizeFromTypeNum(nx)*(tn-nx)/100; }
}
}
#endif
#undef XCOMMAX
#define register_all_types \
register_type(1) \
register_type(2) \

View file

@ -112,8 +112,9 @@ namespace MultiArrayTools
virtual SpaceType spaceType() const final;
virtual DataHeader dataHeader() const final;
virtual size_t typeNum() const final;
virtual vector<size_t> typeNum() const final;
virtual size_t cmeta(char* target, size_t pos) const final;
virtual size_t cmetaSize() const final;
virtual std::string stringMeta(size_t pos) const final;
virtual vector<char> data() const final;
@ -352,17 +353,21 @@ namespace MultiArrayTools
}
template <typename U>
size_t ValueRange<U>::typeNum() const
vector<size_t> ValueRange<U>::typeNum() const
{
return NumTypeMap<U>::num;
return {NumTypeMap<U>::num};
}
template <typename U>
size_t ValueRange<U>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<U*>(target) = *mMeta;
}
*reinterpret_cast<U*>(target) = *mMeta;
return sizeof(U);
}
template <typename U>
size_t ValueRange<U>::cmetaSize() const
{
return sizeof(U);
}

View file

@ -93,21 +93,39 @@ namespace MultiArrayTools
return mEmpty;
}
size_t AnonymousRange::typeNum() const
vector<size_t> AnonymousRange::typeNum() const
{
return 0;
vector<size_t> o;
for(auto& x: mOrig){
auto tn = x->typeNum();
o.insert(o.end(), tn.begin(), tn.end());
}
return o;
}
size_t AnonymousRange::cmeta(char* target, size_t pos) const
{
size_t out = 0;
size_t off = cmetaSize();
for(size_t i = mOrig.size(); i != 0; --i) {
auto& x = mOrig[i-1];
const size_t redpos = pos % x->size();
const size_t offset = x->cmeta(target+out, redpos);
out += offset;
const size_t s = x->cmetaSize();
out += s;
off -= s;
pos -= redpos;
pos /= x->size();
x->cmeta(target+off,redpos);
}
return out;
}
size_t AnonymousRange::cmetaSize() const
{
size_t out = 0;
for(size_t i = mOrig.size(); i != 0; --i) {
auto& x = mOrig[i-1];
out += x->cmetaSize();
}
return out;
}

View file

@ -53,16 +53,19 @@ namespace MultiArrayTools
return SpaceType::NONE;
}
size_t GenSingleRange<size_t,SpaceType::NONE,-1>::typeNum() const
vector<size_t> GenSingleRange<size_t,SpaceType::NONE,-1>::typeNum() const
{
return NumTypeMap<size_t>::num;
return {NumTypeMap<size_t>::num};
}
size_t GenSingleRange<size_t,SpaceType::NONE,-1>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<size_t*>(target) = pos;
}
*reinterpret_cast<size_t*>(target) = pos;
return sizeof(size_t);
}
size_t GenSingleRange<size_t,SpaceType::NONE,-1>::cmetaSize() const
{
return sizeof(size_t);
}

View file

@ -76,16 +76,19 @@ namespace MultiArrayTools
return SpaceType::NUL;
}
size_t GenSingleRange<size_t,SpaceType::NUL,0>::typeNum() const
vector<size_t> GenSingleRange<size_t,SpaceType::NUL,0>::typeNum() const
{
return NumTypeMap<size_t>::num;
return {NumTypeMap<size_t>::num};
}
size_t GenSingleRange<size_t,SpaceType::NUL,0>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<size_t*>(target) = 0;
}
*reinterpret_cast<size_t*>(target) = 0;
return sizeof(size_t);
}
size_t GenSingleRange<size_t,SpaceType::NUL,0>::cmetaSize() const
{
return sizeof(size_t);
}

View file

@ -59,16 +59,19 @@ namespace MultiArrayTools
return SpaceType::PSPACE;
}
size_t GenSingleRange<int,SpaceType::PSPACE,-1>::typeNum() const
vector<size_t> GenSingleRange<int,SpaceType::PSPACE,-1>::typeNum() const
{
return NumTypeMap<int>::num;
return {NumTypeMap<int>::num};
}
size_t GenSingleRange<int,SpaceType::PSPACE,-1>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<int*>(target) = get(pos);
}
*reinterpret_cast<int*>(target) = get(pos);
return sizeof(int);
}
size_t GenSingleRange<int,SpaceType::PSPACE,-1>::cmetaSize() const
{
return sizeof(int);
}

View file

@ -56,16 +56,19 @@ namespace MultiArrayTools
return SpaceType::SPIN;
}
size_t GenSingleRange<size_t,SpaceType::SPIN,4>::typeNum() const
vector<size_t> GenSingleRange<size_t,SpaceType::SPIN,4>::typeNum() const
{
return NumTypeMap<size_t>::num;
return {NumTypeMap<size_t>::num};
}
size_t GenSingleRange<size_t,SpaceType::SPIN,4>::cmeta(char* target, size_t pos) const
{
if(target){
*reinterpret_cast<size_t*>(target) = pos;
}
*reinterpret_cast<size_t*>(target) = pos;
return sizeof(size_t);
}
size_t GenSingleRange<size_t,SpaceType::SPIN,4>::cmetaSize() const
{
return sizeof(size_t);
}

View file

@ -5,7 +5,8 @@
#include <iostream>
#include "ranges/rheader.h"
#include "expressions.h"
#include "ranges/dynamic_range.cc.h"
//#include "multi_array_header.h"
namespace MAT = MultiArrayTools;
@ -34,6 +35,44 @@ namespace {
{
return std::make_tuple(ts...);
}
class DynIndexTest : public ::testing::Test
{
protected:
typedef DynamicRangeFactory<Expressions1> DRF;
typedef DRF::oType DR;
typedef SingleRangeFactory<char,SpaceType::ANY> SRF;
typedef SRF::oType SRange;
typedef MultiRangeFactory<SRange,SRange,SRange> M3RF;
typedef M3RF::oType M3Range;
DynIndexTest()
{
SRF srf({'e', 'b', 'n'});
sr = std::dynamic_pointer_cast<SRange>( srf.create() );
SRF srf1({'a', 'b'});
SRF srf2({'1'});
SRF srf3({'0', '7'});
auto sr1 = std::dynamic_pointer_cast<SRange>( srf1.create() );
auto sr2 = std::dynamic_pointer_cast<SRange>( srf2.create() );
auto sr3 = std::dynamic_pointer_cast<SRange>( srf3.create() );
M3RF mrf(sr1,sr2,sr3);
mr = std::dynamic_pointer_cast<M3Range>( mrf.create() );
vector<std::shared_ptr<RangeBase>> rv(2);
rv[0] = sr;
rv[1] = mr;
DRF drf(rv);
dr = std::dynamic_pointer_cast<DR>( drf.create() );
}
std::shared_ptr<DR> dr;
std::shared_ptr<SRange> sr;
std::shared_ptr<M3Range> mr;
};
class IndexTest : public ::testing::Test
{
@ -211,6 +250,28 @@ namespace {
EXPECT_EQ(ci1().pos(), ci1.max()-1);
EXPECT_EQ(ci2().pos(), ci2.max()-1);
}
TEST_F(DynIndexTest, Iterate)
{
for(auto i = dr->begin(); i.pos() != i.max(); ++i){
EXPECT_EQ(i.meta().size(), 4*sizeof(char));
}
auto j = dr->begin();
EXPECT_EQ(j.meta(), vector<char>({'e','a','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'e','a','1','7'}));
EXPECT_EQ((++j).meta(), vector<char>({'e','b','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'e','b','1','7'}));
EXPECT_EQ((++j).meta(), vector<char>({'b','a','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'b','a','1','7'}));
EXPECT_EQ((++j).meta(), vector<char>({'b','b','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'b','b','1','7'}));
EXPECT_EQ((++j).meta(), vector<char>({'n','a','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'n','a','1','7'}));
EXPECT_EQ((++j).meta(), vector<char>({'n','b','1','0'}));
EXPECT_EQ((++j).meta(), vector<char>({'n','b','1','7'}));
}
} // end namespace