From 876dc58918c174d9b2d3b20092bdd42b73d951d5 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Tue, 21 Feb 2017 17:41:48 +0100 Subject: [PATCH] OneDim and TwoDim - Tests work --- src/base_def.h | 15 +++++++++++ src/index_base.cc | 22 ++++++++++++++++ src/index_base.h | 13 +++++++--- src/multi_range.cc | 63 ++++++++++++++++++++++++++++++++++++++------- src/multi_range.h | 23 ++++++++++++----- src/single_range.cc | 19 ++++++++------ src/single_range.h | 9 ++++--- src/unit_test.cc | 42 ++++++++++++++++-------------- 8 files changed, 158 insertions(+), 48 deletions(-) diff --git a/src/base_def.h b/src/base_def.h index 9be6977..b503e87 100644 --- a/src/base_def.h +++ b/src/base_def.h @@ -9,6 +9,21 @@ __class_name__(__class_name__&& in) = default; \ __class_name__& operator=(__class_name__&& in) = default +//#define DEBUG_MODE_X + +#ifdef DEBUG_MODE_X + +#include +#define CHECK std::cout << __FILE__ << ": @" << __LINE__ << " in " << __func__ << std::endl; +#define VCHECK(a) std::cout << __FILE__ << ": @" << __LINE__ \ + << " in " << __func__ << ": " << #a << " = " << a << std::endl; + +#else +#define CHECK +#define VCHECK(a) + +#endif + namespace MultiArrayTools { /*********************** diff --git a/src/index_base.cc b/src/index_base.cc index fd884f5..f52aa3d 100644 --- a/src/index_base.cc +++ b/src/index_base.cc @@ -81,14 +81,36 @@ namespace MultiArrayTools int res = pos() - max(); return res > 0 ? static_cast(res) : 0; } + + bool IndefinitIndexBase::toNull() const + { + return true; + } /************** * IndexBase * **************/ + template + IndexBase::IndexBase(RangeBase const* range) : mRange(range) {} + template size_t IndexBase::max() const { return mRange->size(); } + + template + bool IndexBase::toNull() const + { + return mRange == nullptr; + } + + template + void IndexBase::assignRange(RangeBase const* range) + { + if(toNull()){ + mRange = range; + } + } } diff --git a/src/index_base.h b/src/index_base.h index 7466107..c930051 100644 --- a/src/index_base.h +++ b/src/index_base.h @@ -29,7 +29,7 @@ namespace MultiArrayTools //virtual bool operator!=(const IndefinitIndexBase& i) = 0; virtual size_t dim() const = 0; - virtual size_t pos() const; // = mPos; implement !!! + virtual size_t pos() const; virtual const std::string& name() const; virtual void name(const std::string& str); @@ -46,6 +46,8 @@ namespace MultiArrayTools virtual size_t max() const; virtual size_t outOfRange() const; + + virtual bool toNull() const; protected: @@ -54,7 +56,7 @@ namespace MultiArrayTools std::string mName; size_t mPos; - IndefinitIndexBase* mLinked; + IndefinitIndexBase* mLinked = nullptr; }; template @@ -64,14 +66,19 @@ namespace MultiArrayTools //virtual size_t pos() const override; // = mPos; implement !!! virtual size_t max() const override; + virtual bool toNull() const override; + + virtual void assignRange(RangeBase const* range); protected: DEFAULT_MEMBERS(IndexBase); + + IndexBase(RangeBase const* range); // translate index into position virtual size_t evaluate(const Index& in) const = 0; - RangeBase* mRange; + RangeBase const* mRange; }; } diff --git a/src/multi_range.cc b/src/multi_range.cc index 9f377b6..f93d9e3 100644 --- a/src/multi_range.cc +++ b/src/multi_range.cc @@ -57,7 +57,7 @@ namespace MultiArrayTools template static size_t evaluate(const MultiIndex& index) { - const IndefinitIndexBase& subIndex = IndexGetter::getIndex(index, N); + const auto& subIndex = index.template getIndex(); return Evaluation::evaluate(index) * subIndex.max() + subIndex.pos(); } }; @@ -68,7 +68,7 @@ namespace MultiArrayTools template static size_t evaluate(const MultiIndex& index) { - const IndefinitIndexBase& subIndex = IndexGetter<0>::getIndex(index, 0); + const auto& subIndex = index.template getIndex<0>(); return subIndex.pos(); } }; @@ -108,13 +108,17 @@ namespace MultiArrayTools } template - MultiIndex::MultiIndex(Indices&&... inds) : mIPack(std::make_tuple(inds...)) + MultiIndex::MultiIndex(RangeBase > const* range, + Indices&&... inds) : IndexBase >(range), + mIPack(std::make_tuple(inds...)) { IIB::mPos = evaluate(*this); } template - MultiIndex::MultiIndex(const IndexPack& ipack) : mIPack(ipack) + MultiIndex::MultiIndex(RangeBase > const* range, + const IndexPack& ipack) : IndexBase >(range), + mIPack(ipack) { IIB::mPos = evaluate(*this); } @@ -193,6 +197,14 @@ namespace MultiArrayTools IIB::mPos = evaluate(*this); return *this; } + + template + MultiIndex& MultiIndex::operator()(const Indices&... inds) + { + mIPack = std::make_tuple(Indices(inds)...); + IIB::mPos = evaluate(*this); + return *this; + } template size_t MultiIndex::dim() const @@ -230,15 +242,14 @@ namespace MultiArrayTools template template - auto MultiIndex::getIndex() -> decltype(std::get(mIPack)) + typename std::tuple_element >::type& MultiIndex::getIndex() { return std::get(mIPack); } template template - auto MultiIndex::getIndex() const -> - const decltype(std::get(mIPack)) + typename std::tuple_element >::type const& MultiIndex::getIndex() const { return std::get(mIPack); } @@ -281,7 +292,41 @@ namespace MultiArrayTools get(i).linkTo(target); } } + /* + template + struct RangeAssigner + { + template + static void assignRange(const RangeBase >& multiRange, + MultiIndex& multiIndex) + { + multiIndex.template getIndex().assignRange(nullptr &multiRange.template getRange()); + RangeAssigner::assignRange(multiRange, multiIndex); + } + }; + template <> + struct RangeAssigner<0> + { + template + static void assignRange(const RangeBase >& multiRange, + MultiIndex& multiIndex) + { + multiIndex.template getIndex<0>().assignRange(nullptr &multiRange.template getRange<0>()); + } + }; + + template + void MultiIndex::assignRange(RangeBase > const* range) + { + if(IB::toNull()){ + IB::mRange = range; + } + MultiIndex& thisRef = *this; + RangeAssigner::assignRange(*range, thisRef); + }*/ + + /****************** * MultiRange * ******************/ @@ -396,7 +441,7 @@ namespace MultiArrayTools { std::tuple is; IndexSetter::setBegin(is,mSpace); - return MultiIndex(is); + return MultiIndex(this, is); } template @@ -404,6 +449,6 @@ namespace MultiArrayTools { std::tuple is; IndexSetter::setEnd(is,mSpace); - return MultiIndex(is); + return MultiIndex(this, is); } } diff --git a/src/multi_range.h b/src/multi_range.h index d3493cc..15bddc6 100644 --- a/src/multi_range.h +++ b/src/multi_range.h @@ -32,8 +32,11 @@ namespace MultiArrayTools DEFAULT_MEMBERS(MultiIndex); - MultiIndex(Indices&&... inds); - MultiIndex(const IndexPack& ipack); + MultiIndex(RangeBase > const* range, + Indices&&... inds); + + MultiIndex(RangeBase > const* range, + const IndexPack& ipack); virtual MultiIndex& operator++() override; virtual MultiIndex& operator--() override; @@ -44,15 +47,16 @@ namespace MultiArrayTools virtual MultiRangeType rangeType() const override; template - auto getIndex() -> decltype(std::get(mIPack)); + typename std::tuple_element >::type& getIndex(); template - auto getIndex() const -> const decltype(std::get(mIPack)); - + typename std::tuple_element >::type const& getIndex() const; + IndefinitIndexBase& get(size_t n); const IndefinitIndexBase& get(size_t n) const; MultiIndex& operator()(Indices&&... inds); + MultiIndex& operator()(const Indices&... inds); virtual void name(const Name& nm) override; @@ -61,8 +65,15 @@ namespace MultiArrayTools virtual bool link(IndefinitIndexBase* toLink) override; virtual void linkTo(IndefinitIndexBase* target) override; + + //virtual void assignRange(RangeBase > const* range) override; }; + /***************************** + * IndexGetter Functions * + ****************************/ + + template class MultiRange : public RangeBase > { @@ -81,7 +92,7 @@ namespace MultiArrayTools template auto getRange() const -> decltype( std::get(SpaceType()) ); - + size_t size() const override; virtual MultiRangeType type() const override; diff --git a/src/single_range.cc b/src/single_range.cc index f5bae4a..e60160f 100644 --- a/src/single_range.cc +++ b/src/single_range.cc @@ -45,13 +45,13 @@ namespace MultiArrayTools template SingleIndex SingleRange::begin() const { - return SingleIndex(0); + return SingleIndex(this, 0); } template SingleIndex SingleRange::end() const { - return SingleIndex(mSpace.size()); + return SingleIndex(this, mSpace.size()); } /****************** @@ -59,13 +59,15 @@ namespace MultiArrayTools ******************/ template - SingleIndex::SingleIndex(const U& upos, size_t disambig) : IndexBase >() + SingleIndex::SingleIndex(RangeBase > const* range, + const U& upos, size_t disambig) : IndexBase >(range) { - IIB::setPos( dynamic_cast*>( IB::mRange )->get(upos) ); + IIB::setPos( dynamic_cast const*>( IB::mRange )->get(upos) ); } template - SingleIndex::SingleIndex(size_t pos) : IndexBase >() + SingleIndex::SingleIndex(RangeBase > const* range, + size_t pos) : IndexBase >(range) { IIB::setPos( pos ); } @@ -126,7 +128,7 @@ namespace MultiArrayTools template const U& SingleIndex::getMetaPos() const { - return dynamic_cast*>( IB::mRange )->get(IIB::pos()); + return dynamic_cast const*>( IB::mRange )->get(IIB::pos()); } template @@ -147,11 +149,12 @@ namespace MultiArrayTools target->link(this); } + /* template SingleIndex& SingleIndex::operator=(const U& upos) { - IIB::setPos( dynamic_cast*>( IB::mRange )->get(upos) ); + IIB::setPos( dynamic_cast const*>( IB::mRange )->get(upos) ); return *this; - } + }*/ } diff --git a/src/single_range.h b/src/single_range.h index cdb6248..4077892 100644 --- a/src/single_range.h +++ b/src/single_range.h @@ -24,10 +24,13 @@ namespace MultiArrayTools DEFAULT_MEMBERS(SingleIndex); // find better solution !!! - SingleIndex(const U& upos, size_t disambig); - SingleIndex(size_t pos); + SingleIndex(RangeBase > const* range, + const U& upos, size_t disambig); - virtual SingleIndex& operator=(const U& upos); + SingleIndex(RangeBase > const* range, + size_t pos); + + //virtual SingleIndex& operator=(const U& upos); virtual SingleIndex& operator=(size_t pos) override; virtual SingleIndex& operator++() override; diff --git a/src/unit_test.cc b/src/unit_test.cc index 6e9dec4..e94e054 100644 --- a/src/unit_test.cc +++ b/src/unit_test.cc @@ -55,11 +55,12 @@ namespace { TEST_F(OneDimTest, CorrectAssigned) { - EXPECT_EQ(ma[0], -5); - EXPECT_EQ(ma[1], 6); - EXPECT_EQ(ma[2], 2); - EXPECT_EQ(ma[3], 1); - EXPECT_EQ(ma[4], 9); + auto i = ma.begin(); + EXPECT_EQ(ma[i = 0], -5); + EXPECT_EQ(ma[i = 1], 6); + EXPECT_EQ(ma[i = 2], 2); + EXPECT_EQ(ma[i = 3], 1); + EXPECT_EQ(ma[i = 4], 9); } TEST_F(TwoDimTest, CorrectExtensions) @@ -67,23 +68,26 @@ namespace { EXPECT_EQ(ma.size(), 12); } + TEST_F(TwoDimTest, CorrectAssigned) - { + { auto i = ma.begin(); - EXPECT_EQ(ma[i(0,0)], -5); - EXPECT_EQ(ma[i(0,1)], 6); - EXPECT_EQ(ma[i(0,2)], 2); - EXPECT_EQ(ma[i(0,3)], 1); - EXPECT_EQ(ma[i(1,0)], 9); - EXPECT_EQ(ma[i(1,1)], 54); - EXPECT_EQ(ma[i(1,2)], 27); - EXPECT_EQ(ma[i(1,3)], -7); - EXPECT_EQ(ma[i(2,0)], -13); - EXPECT_EQ(ma[i(2,1)], 32); - EXPECT_EQ(ma[i(2,2)], 90); - EXPECT_EQ(ma[i(2,3)], -67); + auto i1 = i.template getIndex<0>(); + auto i2 = i.template getIndex<1>(); + + EXPECT_EQ(ma[i(i1 = 0, i2 = 0)], -5); + EXPECT_EQ(ma[i(i1 = 0, i2 = 1)], 6); + EXPECT_EQ(ma[i(i1 = 0, i2 = 2)], 2); + EXPECT_EQ(ma[i(i1 = 0, i2 = 3)], 1); + EXPECT_EQ(ma[i(i1 = 1, i2 = 0)], 9); + EXPECT_EQ(ma[i(i1 = 1, i2 = 1)], 54); + EXPECT_EQ(ma[i(i1 = 1, i2 = 2)], 27); + EXPECT_EQ(ma[i(i1 = 1, i2 = 3)], -7); + EXPECT_EQ(ma[i(i1 = 2, i2 = 0)], -13); + EXPECT_EQ(ma[i(i1 = 2, i2 = 1)], 32); + EXPECT_EQ(ma[i(i1 = 2, i2 = 2)], 90); + EXPECT_EQ(ma[i(i1 = 2, i2 = 3)], -67); } - } // end namespace