diff --git a/src/include/ranges/anonymous_range.h b/src/include/ranges/anonymous_range.h index 2e907f2..1213bd8 100644 --- a/src/include/ranges/anonymous_range.h +++ b/src/include/ranges/anonymous_range.h @@ -9,6 +9,7 @@ #include "ranges/range_base.h" #include "ranges/rpheader.h" #include "ranges/x_to_string.h" +#include "ranges/type_map.h" namespace MultiArrayTools { diff --git a/src/include/ranges/multi_range.h b/src/include/ranges/multi_range.h index 189b83e..6a47265 100644 --- a/src/include/ranges/multi_range.h +++ b/src/include/ranges/multi_range.h @@ -15,6 +15,7 @@ #include "ranges/rpack_num.h" #include "ranges/multi_range_factory_product_map.h" #include "ranges/x_to_string.h" +#include "ranges/type_map.h" namespace MultiArrayTools { diff --git a/src/include/ranges/range_base.h b/src/include/ranges/range_base.h index 061f64c..6785b1c 100644 --- a/src/include/ranges/range_base.h +++ b/src/include/ranges/range_base.h @@ -61,7 +61,7 @@ namespace MultiArrayTools void setSelf(); }; - std::shared_ptr createRangeFactory(const std::vector& data); + std::shared_ptr createRangeFactory(char** dp); class RangeBase { diff --git a/src/include/ranges/range_types/classic_range.h b/src/include/ranges/range_types/classic_range.h index 69ad02e..8415aae 100644 --- a/src/include/ranges/range_types/classic_range.h +++ b/src/include/ranges/range_types/classic_range.h @@ -1,11 +1,15 @@ -#ifdef include_range_type +//#ifdef include_range_type //include_range_type(NONE,0) -#else +//#else +#ifndef include_range_type #ifdef __ranges_header__ // assert, that this is only used within range_types/header.h +#ifndef __range_type_classic_def__ +#define __range_type_classic_def__ + namespace MultiArrayTools { typedef SingleIndex ClassicIndex; @@ -69,7 +73,7 @@ namespace MultiArrayTools } -//#endif // #ifndef __spin_range_h__ +#endif // #ifndef __range_type_classic_def__ #endif // #ifdef __ranges_header__ diff --git a/src/include/ranges/range_types/header.h b/src/include/ranges/range_types/header.h index 1c3bcd8..6fef0a9 100644 --- a/src/include/ranges/range_types/header.h +++ b/src/include/ranges/range_types/header.h @@ -10,8 +10,6 @@ #ifdef __incl_this__ -#ifndef __ranges_header_included__ -#define __ranges_header_included__ #define __ranges_header__ //#ifndef __ranges_header__ @@ -24,7 +22,6 @@ #undef __ranges_header__ -#endif #endif #undef __incl_this__ diff --git a/src/include/ranges/range_types/null_range.h b/src/include/ranges/range_types/null_range.h index e078cb6..db3f885 100644 --- a/src/include/ranges/range_types/null_range.h +++ b/src/include/ranges/range_types/null_range.h @@ -7,8 +7,8 @@ include_range_type(NUL,-2) #ifdef __ranges_header__ // assert, that this is only used within range_types/header.h -//#ifndef __spin_range_h__ -//#define __spin_range_h__ +#ifndef __range_type_null_def__ +#define __range_type_null_def__ namespace MultiArrayTools { @@ -82,7 +82,7 @@ namespace MultiArrayTools } -//#endif // #ifndef __spin_range_h__ +#endif // #ifndef __range_type_null_def__ #endif // #ifdef __ranges_header__ diff --git a/src/include/ranges/range_types/space_range.h b/src/include/ranges/range_types/space_range.h index 3be549c..9558c25 100644 --- a/src/include/ranges/range_types/space_range.h +++ b/src/include/ranges/range_types/space_range.h @@ -5,6 +5,9 @@ include_range_type(PSPACE,3) // Periodic 1dim space #ifdef __ranges_header__ +#ifndef __range_type_space_def__ +#define __range_type_space_def__ + namespace MultiArrayTools { // Periodic 1dim space @@ -116,6 +119,7 @@ namespace MultiArrayTools using MSpaceRF = decltype(CreateNDimSpaceRange::template mkf()); } +#endif // #ifndef __range_type_space_def__ #endif // #ifdef __ranges_header__ diff --git a/src/include/ranges/range_types/spin_range.h b/src/include/ranges/range_types/spin_range.h index 02c4e7c..91010b5 100644 --- a/src/include/ranges/range_types/spin_range.h +++ b/src/include/ranges/range_types/spin_range.h @@ -7,8 +7,8 @@ include_range_type(SPIN,2) #ifdef __ranges_header__ // assert, that this is only used within range_types/header.h -//#ifndef __spin_range_h__ -//#define __spin_range_h__ +#ifndef __range_type_spin_def__ +#define __range_type_spin_def__ namespace MultiArrayTools { @@ -75,7 +75,7 @@ namespace MultiArrayTools } -//#endif // #ifndef __spin_range_h__ +#endif // #ifndef __range_type_spin_def__ #endif // #ifdef __ranges_header__ diff --git a/src/include/ranges/single_range.h b/src/include/ranges/single_range.h index f8dbe11..8ce4b23 100644 --- a/src/include/ranges/single_range.h +++ b/src/include/ranges/single_range.h @@ -12,6 +12,7 @@ #include "ranges/index_base.h" #include "ranges/range_base.h" #include "ranges/x_to_string.h" +#include "ranges/type_map.h" #include "xfor/xfor.h" @@ -387,7 +388,8 @@ namespace MultiArrayTools { DataHeader h; h.spaceType = static_cast( TYPE ); - h.metaSize = size() * sizeof(U); + h.metaSize = metaSize(mSpace); + h.metaType = NumTypeMap::num; h.multiple = 0; std::vector out; out.reserve(h.metaSize + sizeof(DataHeader)); diff --git a/src/include/ranges/type_map.h b/src/include/ranges/type_map.h index 695e884..645faa5 100644 --- a/src/include/ranges/type_map.h +++ b/src/include/ranges/type_map.h @@ -3,6 +3,7 @@ #define __ma_type_map_h__ #include +#include namespace MultiArrayTools { @@ -20,39 +21,58 @@ namespace MultiArrayTools }; template - void stringCat(std::vector& out, const std::vector& in) + inline void stringCat(std::vector& out, const std::vector& in) { const char* scp = reinterpret_cast(in.data()); out.insert(out.end(), scp, scp + in.size() * sizeof(T)); } - + template - void metaCat(std::vector& vec, char* begin, size_t size) + inline size_t metaSize(const std::vector& in) + { + return in.size() * sizeof(T); + } + + template + inline void metaCat(std::vector& vec, char* begin, size_t size) { T* tp = reinterpret_cast( begin ); vec.insert(vec.end(), tp, tp + size / sizeof(T)); } template <> - void stringCat(std::vector& out, const std::vector& in) + inline void stringCat(std::vector& out, const std::vector& in) { std::string tmp = ""; for(auto& x: in){ - tmp += x + '\0'; + tmp += x + '\n'; } const char* scp = reinterpret_cast(tmp.data()); out.insert(out.end(), scp, scp + tmp.size()); } + + template <> + inline size_t metaSize(const std::vector& in) + { + size_t out = 0; + for(auto& x: in){ + out += x.size() + 1; + } + return out; + } template <> - void metaCat(std::vector& vec, char* begin, size_t size) + inline void metaCat(std::vector& vec, char* begin, size_t size) { - size_t pos = 0; + std::string tmp(begin, size); - while(pos != size){ - size_t termpos = tmp.find_first_of('\0'); - vec.push_back(tmp.substr(pos,termpos)); - pos = termpos + 1; // skip '\0' + size_t pos = 0; + while(pos != tmp.size()){ + std::string es = "\n"; + size_t termpos = tmp.find_first_of(es, pos); + std::string tmpstr = tmp.substr(pos, termpos-pos); + vec.push_back(tmpstr); + pos = termpos + 1; } } diff --git a/src/lib/ranges/range_base.cc b/src/lib/ranges/range_base.cc index 7a6ff22..55915ac 100644 --- a/src/lib/ranges/range_base.cc +++ b/src/lib/ranges/range_base.cc @@ -1,13 +1,16 @@ +// +//#include "ranges/single_range.h" +#include "ranges/type_map.h" +#include "ranges/rheader.h" +#include "ranges/range_types/header.h" + #include "ranges/range_base.h" -#include "ranges/rheader.h" -#include "ranges/type_map.h" -#include "ranges/range_types/header.h" namespace MultiArrayTools { - using namespace MultiArrayHelpers; + //using namespace MultiArrayHelpers; size_t indexId() { @@ -16,6 +19,18 @@ namespace MultiArrayTools return id; } + // !!!!! + std::shared_ptr mkMULTI(char** dp) + { + return nullptr; + } + + // !!!!! + std::shared_ptr mkANONYMOUS(char** dp) + { + return nullptr; + } + std::shared_ptr createRangeFactory(char** dp) { DataHeader h = *reinterpret_cast(*dp); @@ -26,23 +41,26 @@ namespace MultiArrayTools if(h.multiple != 0){ if(h.spaceType == static_cast( SpaceType::ANY )) { // multi range - out = mkMULTI(&dp); + out = mkMULTI(dp); } else if(h.spaceType == static_cast( SpaceType::ANON ) ) { // anonymous range - out = mkANONYMOUS(&dp); + out = mkANONYMOUS(dp); } else { assert(0); } } else { + VCHECK(h.spaceType); if(h.spaceType == static_cast( SpaceType::ANY ) ) { + VCHECK(h.metaType) // generic single range if(h.metaType == -1){ assert(0); } #define register_type(x) else if(x == h.metaType) {\ + VCHECK(x);\ std::vector::type> vd;\ metaCat(vd, *dp, h.metaSize); \ out = std::make_shared::type, \ @@ -59,7 +77,8 @@ namespace MultiArrayTools size_t size = *reinterpret_cast(*dp); out = std::make_shared >(size); } -#define inlcude_range_type(x,n) out = mk##x(*dp, h.metaSize); +#define include_range_type(x,n) else if(h.spaceType == static_cast( SpaceType::x ) ) { \ + out = mk##x(*dp, h.metaSize); } #include "ranges/range_types/header.h" #undef inlcude_range_type else { diff --git a/src/lib/ranges/range_types/null_range.cc b/src/lib/ranges/range_types/null_range.cc index 1a967aa..7653806 100644 --- a/src/lib/ranges/range_types/null_range.cc +++ b/src/lib/ranges/range_types/null_range.cc @@ -6,7 +6,7 @@ namespace MultiArrayTools { std::shared_ptr mkNUL(char* dp, size_t size) { - return make_shared(); + return std::make_shared(); } /******************** diff --git a/src/lib/ranges/range_types/spin_range.cc b/src/lib/ranges/range_types/spin_range.cc index 1a3ffae..137cc6c 100644 --- a/src/lib/ranges/range_types/spin_range.cc +++ b/src/lib/ranges/range_types/spin_range.cc @@ -6,7 +6,7 @@ namespace MultiArrayTools { std::shared_ptr mkSPIN(char* dp, size_t size) { - std::make_shared(); + return std::make_shared(); } /******************** diff --git a/src/tests/ranges/anonymous_unit_test.cc b/src/tests/ranges/anonymous_unit_test.cc index 0119d8b..d8865f0 100644 --- a/src/tests/ranges/anonymous_unit_test.cc +++ b/src/tests/ranges/anonymous_unit_test.cc @@ -35,7 +35,7 @@ namespace { return std::make_tuple(ts...); } - class AnonymousIndexTest : public ::testing::Test + class AnonymousTest : public ::testing::Test { protected: @@ -52,7 +52,7 @@ namespace { typedef CRF::oType CRange; typedef ContainerIndex CIndex; - AnonymousIndexTest() + AnonymousTest() { swapFactory(rfbptr, { 'e', 'b', 'n' } ); sr1ptr = std::dynamic_pointer_cast( rfbptr->create() ); @@ -89,7 +89,7 @@ namespace { std::shared_ptr cr2ptr; }; - TEST_F(AnonymousIndexTest, Cast1) + TEST_F(AnonymousTest, Cast1) { AnonymousRangeFactory arf1(sr1ptr,m3rptr); auto ar1a = std::dynamic_pointer_cast( arf1.create() ); @@ -113,7 +113,7 @@ namespace { EXPECT_EQ(ar2->sub(2)->size(), sr2ptr->size()); } - TEST_F(AnonymousIndexTest, Cast2) + TEST_F(AnonymousTest, Cast2) { AnonymousRangeFactory arf2(sr1ptr,m3rptr,sr2ptr); auto ar = std::dynamic_pointer_cast( arf2.create() ); @@ -122,6 +122,81 @@ namespace { EXPECT_EQ(mr->template getPtr<0>()->size(), sr1ptr->size()); EXPECT_EQ(mr->template getPtr<1>()->size(), m3rptr->size() * sr2ptr->size()); } + + TEST_F(AnonymousTest, ToString1) + { + std::vector vv = sr1ptr->data(); + char* dp = vv.data(); + VCHECK(vv.size()); + auto ff = createRangeFactory(&dp); + auto ss = std::dynamic_pointer_cast( ff->create() ); + + EXPECT_EQ(sr1ptr->size(), ss->size()); + EXPECT_EQ(sr1ptr->get(0), ss->get(0)); + EXPECT_EQ(sr1ptr->get(1), ss->get(1)); + EXPECT_EQ(sr1ptr->get(2), ss->get(2)); + } + + TEST_F(AnonymousTest, ToString2) + { + typedef SingleRangeFactory NameRF; + typedef SingleRange NameRange; + ClassicRF crf(5); + SpinRF srf; + NameRF nrf({"ab", "cdef", "gh", "ijklmno"}); + + VCHECK(sizeof(DataHeader)); + VCHECK(sizeof(char)); + VCHECK(sizeof(size_t)); + + auto cr = std::dynamic_pointer_cast( crf.create() ); + auto sr = std::dynamic_pointer_cast( srf.create() ); + auto nr = std::dynamic_pointer_cast( nrf.create() ); + + std::vector cv = cr->data(); + std::vector sv = sr->data(); + std::vector nv = nr->data(); + char* cp = cv.data(); + char* sp = sv.data(); + char* np = nv.data(); + + VCHECK(cv.size()); + VCHECK(sv.size()); + VCHECK(nv.size()); + + auto crf2 = createRangeFactory(&cp); + auto cr2 = std::dynamic_pointer_cast( crf2->create() ); + + auto srf2 = createRangeFactory(&sp); + auto sr2 = std::dynamic_pointer_cast( srf2->create() ); + + auto nrf2 = createRangeFactory(&np); + auto nr2 = std::dynamic_pointer_cast( nrf2->create() ); + + EXPECT_EQ(cr2->size(), cr->size()); + EXPECT_EQ(sr2->size(), sr->size()); + + EXPECT_EQ(nr2->size(), nr->size()); + EXPECT_EQ(nr2->get(0), nr->get(0)); + EXPECT_EQ(nr2->get(1), nr->get(1)); + EXPECT_EQ(nr2->get(2), nr->get(2)); + EXPECT_EQ(nr2->get(3), nr->get(3)); + } + + /* + TEST_F(AnonymousTest, ToString3) + { + AnonymousRangeFactory arf2(sr1ptr,m3rptr,sr2ptr); + auto ar = std::dynamic_pointer_cast( arf2.create() ); + + std::vector vv = ar->data(); + + auto ff2 = std::dynamic_pointer_cast( createRangeFactory(vv) ); + auto ar2 = createExplicit( ff2 ); + + EXPECT_EQ(ar2->size(), ar->size()); + EXPECT_EQ(ar2->anonymousDim(), ar->anonymousDim()); + }*/ } // end namespace