From fc40f83dd8a7741ec4901a4c0804457881f45393 Mon Sep 17 00:00:00 2001 From: Christian Zimmermann Date: Sat, 21 Jul 2018 18:05:53 +0200 Subject: [PATCH] enable string meta data info by virtual function in RangeBase --- src/include/functional_multi_array.h | 8 +- src/include/multi_array.h | 8 +- src/include/multi_array_base.h | 20 ++--- src/include/ranges/anonymous_range.h | 12 ++- src/include/ranges/multi_range.h | 45 ++++++++-- src/include/ranges/range_base.h | 33 ++++++-- .../ranges/range_types/classic_range.h | 3 + src/include/ranges/range_types/null_range.h | 3 + src/include/ranges/range_types/space_range.h | 6 +- src/include/ranges/range_types/spin_range.h | 3 + src/include/ranges/rpack_num.h | 33 +++++++- src/include/ranges/single_range.h | 26 ++++++ src/include/ranges/x_to_string.h | 83 +++++++++++++++++++ src/lib/ranges/anonymous_range.cc | 30 +++++++ src/lib/ranges/range_types/classic_range.cc | 22 +++++ src/lib/ranges/range_types/null_range.cc | 21 ++++- src/lib/ranges/range_types/space_range.cc | 21 +++++ src/lib/ranges/range_types/spin_range.cc | 21 ++++- 18 files changed, 353 insertions(+), 45 deletions(-) create mode 100644 src/include/ranges/x_to_string.h diff --git a/src/include/functional_multi_array.h b/src/include/functional_multi_array.h index 10f0a6a..68afbca 100644 --- a/src/include/functional_multi_array.h +++ b/src/include/functional_multi_array.h @@ -77,11 +77,11 @@ namespace MultiArrayTools // EVALUTAION CLASS ??!!!! - auto exec(std::shared_ptr&... inds) const + auto exec(const std::shared_ptr&... inds) const -> decltype( mkOperation( mFunc, ConstOperationRoot( mkMAObject( inds ), inds) ... ) ); virtual ConstOperationRoot - operator()(std::shared_ptr&... inds) const override; + operator()(const std::shared_ptr&... inds) const override; }; @@ -175,7 +175,7 @@ namespace MultiArrayTools template ConstOperationRoot FunctionalMultiArray:: - operator()(std::shared_ptr&... inds) const + operator()(const std::shared_ptr&... inds) const { if(not mMaPtr){ mMaPtr = std::make_shared( MAB::mRange->space() ); @@ -187,7 +187,7 @@ namespace MultiArrayTools template auto FunctionalMultiArray:: - exec(std::shared_ptr&... inds) const + exec(const std::shared_ptr&... inds) const -> decltype( mkOperation( mFunc, ConstOperationRoot( mkMAObject( inds ), inds) ... ) ) { return mkOperation( mFunc, ConstOperationRoot( mkMAObject( inds ), inds ) ... ); diff --git a/src/include/multi_array.h b/src/include/multi_array.h index edae027..b2a0537 100644 --- a/src/include/multi_array.h +++ b/src/include/multi_array.h @@ -40,8 +40,8 @@ namespace MultiArrayTools MultiArray(const std::shared_ptr&... ranges, const T& val); MultiArray(const std::shared_ptr&... ranges, const std::vector& vec); MultiArray(const std::shared_ptr&... ranges, std::vector&& vec); - MultiArray(const typename CRange::SpaceType& space); - MultiArray(const typename CRange::SpaceType& space, std::vector&& vec); + MultiArray(const typename CRange::Space& space); + MultiArray(const typename CRange::Space& space, std::vector&& vec); MultiArray(MultiArray& ama, SIZET... sizes); // Only if ALL ranges have default extensions: @@ -143,7 +143,7 @@ namespace MultiArrayTools *******************/ template - MultiArray::MultiArray(const typename CRange::SpaceType& space) : + MultiArray::MultiArray(const typename CRange::Space& space) : MutableMultiArrayBase(space), mCont(MAB::mRange->size()) { @@ -151,7 +151,7 @@ namespace MultiArrayTools } template - MultiArray::MultiArray(const typename CRange::SpaceType& space, + MultiArray::MultiArray(const typename CRange::Space& space, std::vector&& vec) : MutableMultiArrayBase(space), mCont(vec) diff --git a/src/include/multi_array_base.h b/src/include/multi_array_base.h index 07b5801..0f3289b 100644 --- a/src/include/multi_array_base.h +++ b/src/include/multi_array_base.h @@ -35,7 +35,7 @@ namespace MultiArrayTools DEFAULT_MEMBERS(MultiArrayBase); MultiArrayBase(const std::shared_ptr&... ranges); - MultiArrayBase(const typename CRange::SpaceType& space); + MultiArrayBase(const typename CRange::Space& space); virtual ~MultiArrayBase() = default; @@ -60,7 +60,7 @@ namespace MultiArrayTools virtual std::shared_ptr > anonymous() const = 0; virtual ConstOperationRoot - operator()(std::shared_ptr&... inds) const; + operator()(const std::shared_ptr&... inds) const; virtual bool isInit() const; @@ -87,7 +87,7 @@ namespace MultiArrayTools DEFAULT_MEMBERS(MutableMultiArrayBase); MutableMultiArrayBase(const std::shared_ptr&... ranges); - MutableMultiArrayBase(const typename CRange::SpaceType& space); + MutableMultiArrayBase(const typename CRange::Space& space); virtual T& operator[](const IndexType& i) = 0; virtual T& at(const typename CRange::IndexType::MetaType& meta) = 0; @@ -102,8 +102,8 @@ namespace MultiArrayTools virtual std::shared_ptr > anonymousMove() = 0; virtual ConstOperationRoot - operator()(std::shared_ptr&... inds) const override; - virtual OperationRoot operator()(std::shared_ptr&... inds); + operator()(const std::shared_ptr&... inds) const override; + virtual OperationRoot operator()(const std::shared_ptr&... inds); }; @@ -129,7 +129,7 @@ namespace MultiArrayTools } template - MultiArrayBase::MultiArrayBase(const typename CRange::SpaceType& space) + MultiArrayBase::MultiArrayBase(const typename CRange::Space& space) { ContainerRangeFactory crf(space); mRange = std::dynamic_pointer_cast >( crf.create() ); @@ -193,7 +193,7 @@ namespace MultiArrayTools template ConstOperationRoot - MultiArrayBase::operator()(std::shared_ptr&... inds) const + MultiArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } @@ -222,7 +222,7 @@ namespace MultiArrayTools MultiArrayBase(ranges...) {} template - MutableMultiArrayBase::MutableMultiArrayBase(const typename CRange::SpaceType& space) : + MutableMultiArrayBase::MutableMultiArrayBase(const typename CRange::Space& space) : MultiArrayBase(space) {} /* template @@ -247,14 +247,14 @@ namespace MultiArrayTools template OperationRoot - MutableMultiArrayBase::operator()(std::shared_ptr&... inds) + MutableMultiArrayBase::operator()(const std::shared_ptr&... inds) { return OperationRoot(*this, inds...); } template ConstOperationRoot - MutableMultiArrayBase::operator()(std::shared_ptr&... inds) const + MutableMultiArrayBase::operator()(const std::shared_ptr&... inds) const { return ConstOperationRoot(*this, inds...); } diff --git a/src/include/ranges/anonymous_range.h b/src/include/ranges/anonymous_range.h index 0aefc39..2e907f2 100644 --- a/src/include/ranges/anonymous_range.h +++ b/src/include/ranges/anonymous_range.h @@ -8,6 +8,7 @@ #include "rbase_def.h" #include "ranges/range_base.h" #include "ranges/rpheader.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -63,16 +64,19 @@ namespace MultiArrayTools typedef SingleRange RangeType; typedef size_t MetaType; - virtual size_t size() const override; - virtual size_t dim() const override; + virtual size_t size() const final; + virtual size_t dim() const final; size_t anonymousDim() const; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; - virtual IndexType begin() const override; - virtual IndexType end() const override; + virtual IndexType begin() const final; + virtual IndexType end() const final; + virtual std::string stringMeta(size_t pos) const final; + virtual std::vector data() const final; + std::shared_ptr sub(size_t num) const; template diff --git a/src/include/ranges/multi_range.h b/src/include/ranges/multi_range.h index a86e99f..04068fc 100644 --- a/src/include/ranges/multi_range.h +++ b/src/include/ranges/multi_range.h @@ -14,6 +14,7 @@ #include "ranges/rpack_num.h" #include "ranges/multi_range_factory_product_map.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -129,7 +130,7 @@ namespace MultiArrayTools MultiRangeFactory() = delete; MultiRangeFactory(const std::shared_ptr&... rs); - MultiRangeFactory(const typename MultiRange::SpaceType& space); + MultiRangeFactory(const typename MultiRange::Space& space); template MultiRangeFactory(const std::shared_ptr >& cr); @@ -145,13 +146,13 @@ namespace MultiArrayTools /****************** * MultiRange * ******************/ - + template class MultiRange : public RangeInterface > { public: typedef RangeBase RB; - typedef std::tuple...> SpaceType; + typedef std::tuple...> Space; typedef MultiIndex IndexType; typedef MultiRange RangeType; //typedef typename RangeInterface >::IndexType IndexType; @@ -162,9 +163,9 @@ namespace MultiArrayTools MultiRange& operator=(const MultiRange& in) = delete; MultiRange(const std::shared_ptr&... rs); - MultiRange(const SpaceType& space); + MultiRange(const Space& space); - SpaceType mSpace; + Space mSpace; public: @@ -178,8 +179,11 @@ namespace MultiArrayTools virtual size_t dim() const final; virtual size_t size() const final; + + virtual std::string stringMeta(size_t pos) const final; + virtual std::vector data() const final; - const SpaceType& space() const; + const Space& space() const; virtual IndexType begin() const final; virtual IndexType end() const final; @@ -442,7 +446,7 @@ namespace MultiArrayTools } template - MultiRangeFactory::MultiRangeFactory(const typename MultiRange::SpaceType& st) + MultiRangeFactory::MultiRangeFactory(const typename MultiRange::Space& st) { mProd = std::shared_ptr< MultiRange >( new MultiRange( st ) ); } @@ -493,7 +497,7 @@ namespace MultiArrayTools MultiRange::MultiRange(const std::shared_ptr&... rs) : mSpace(std::make_tuple(rs...)) {} template - MultiRange::MultiRange(const SpaceType& space) : mSpace( space ) {} + MultiRange::MultiRange(const Space& space) : mSpace( space ) {} template template @@ -522,10 +526,33 @@ namespace MultiArrayTools } template - const typename MultiRange::SpaceType& MultiRange::space() const + const typename MultiRange::Space& MultiRange::space() const { return mSpace; } + + template + std::string MultiRange::stringMeta(size_t pos) const + { + auto i = begin(); + i = pos; + return "[ " + RPackNum::metaTupleToString(i.meta()) + " ]"; + } + + template + std::vector MultiRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::ANY ); + h.metaSize = sizeof...(Ranges); + h.multiple = 1; + std::vector out; + //out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + RPackNum::fillRangeDataVec(out, mSpace); + return out; + } template typename MultiRange::IndexType MultiRange::begin() const diff --git a/src/include/ranges/range_base.h b/src/include/ranges/range_base.h index 99838ab..5ec5d03 100644 --- a/src/include/ranges/range_base.h +++ b/src/include/ranges/range_base.h @@ -20,15 +20,27 @@ namespace MultiArrayTools size_t indexId(); enum class SpaceType - { - NONE = 0, - ANY = 1, + { + NONE = 0, // meta data is that of a classic range, i.e. 0,1,2,...,N-1 + ANY = 1, // meta data is arbitrary, i.e. explicitly stored #define include_range_type(x,n) x = n, #include "range_types/header.h" #undef include_range_type - ANON = -1 - }; + ANON = -1 // anonymous content + }; + struct DataHeader + { + public: + static constexpr size_t VERSION = 1; // fixed by version of this repository ! + private: + size_t version = VERSION; + public: + int spaceType = static_cast( SpaceType::NONE ); + size_t metaSize = 0; // size of meta data + int multiple = 0; // = 1 if multi range + }; + class RangeFactoryBase { public: @@ -50,17 +62,20 @@ namespace MultiArrayTools class RangeBase { public: - + static constexpr bool ISINDEX = false; virtual ~RangeBase() = default; virtual size_t size() const = 0; virtual size_t dim() const = 0; - + bool operator==(const RangeBase& in) const; bool operator!=(const RangeBase& in) const; + virtual std::string stringMeta(size_t pos) const = 0; + virtual std::vector data() const = 0; // usefull when writing to files, etc... + //virtual bool regular() const = 0; // integer distance (e.g. 2,3,4,...) //virtual bool linear() const = 0; // 1dim valuable (e.g. 2.45, 3.12, 3.56,...) //virtual bool multi() const = 0; // mdim @@ -69,11 +84,11 @@ namespace MultiArrayTools friend RangeFactoryBase; protected: - + RangeBase() = default; std::weak_ptr mThis; }; - + template class RangeInterface : public RangeBase { diff --git a/src/include/ranges/range_types/classic_range.h b/src/include/ranges/range_types/classic_range.h index d3cf092..69ad02e 100644 --- a/src/include/ranges/range_types/classic_range.h +++ b/src/include/ranges/range_types/classic_range.h @@ -33,6 +33,9 @@ namespace MultiArrayTools virtual size_t size() const override; virtual size_t dim() const override; + + virtual std::string stringMeta(size_t pos) const override; + virtual std::vector data() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; diff --git a/src/include/ranges/range_types/null_range.h b/src/include/ranges/range_types/null_range.h index 0a5b075..900bcee 100644 --- a/src/include/ranges/range_types/null_range.h +++ b/src/include/ranges/range_types/null_range.h @@ -44,6 +44,9 @@ namespace MultiArrayTools virtual size_t size() const override; virtual size_t dim() const override; + + virtual std::string stringMeta(size_t pos) const override; + virtual std::vector data() const override; size_t get(size_t pos) const; size_t getMeta(size_t metapos) const; diff --git a/src/include/ranges/range_types/space_range.h b/src/include/ranges/range_types/space_range.h index 79f3c26..e64c754 100644 --- a/src/include/ranges/range_types/space_range.h +++ b/src/include/ranges/range_types/space_range.h @@ -33,13 +33,15 @@ namespace MultiArrayTools virtual size_t size() const override; virtual size_t dim() const override; - + + virtual std::string stringMeta(size_t pos) const override; + virtual std::vector data() const override; + int get(size_t pos) const; size_t getMeta(int metaPos) const; virtual IndexType begin() const override; virtual IndexType end() const override; - //virtual std::shared_ptr index() const override; friend SingleRangeFactory; diff --git a/src/include/ranges/range_types/spin_range.h b/src/include/ranges/range_types/spin_range.h index 34f5447..f7b7f80 100644 --- a/src/include/ranges/range_types/spin_range.h +++ b/src/include/ranges/range_types/spin_range.h @@ -37,6 +37,9 @@ namespace MultiArrayTools virtual size_t size() const override; virtual size_t dim() const override; + + virtual std::string stringMeta(size_t pos) const override; + virtual std::vector data() const override; size_t get(size_t pos) const; size_t getMeta(size_t metaPos) const; diff --git a/src/include/ranges/rpack_num.h b/src/include/ranges/rpack_num.h index bfc9818..3d4e808 100644 --- a/src/include/ranges/rpack_num.h +++ b/src/include/ranges/rpack_num.h @@ -7,7 +7,7 @@ #include #include "ranges/rbase_def.h" #include "ranges/index_base.h" - +#include "ranges/x_to_string.h" namespace MultiArrayHelper { @@ -59,6 +59,8 @@ namespace MultiArrayHelper { v.insert(v.begin(), r); } + + template struct RPackNum @@ -297,6 +299,21 @@ namespace MultiArrayHelper return reinterpret_cast( std::get(p).get() ) == a[N] and RPackNum::checkIfCreated(p,a); } + + template + static inline std::string metaTupleToString(const MetaTuple& mtp) + { + return RPackNum::metaTupleToString(mtp) + " , " + xToString(std::get(mtp)); + } + + template + static inline void fillRangeDataVec(std::vector& out, + const std::tuple...>& tp) + { + std::vector part = std::get(tp)->data(); + out.insert(out.end(), part.begin(), part.end()); + RPackNum::fillRangeDataVec(out, tp); + } }; @@ -496,6 +513,20 @@ namespace MultiArrayHelper return reinterpret_cast( std::get<0>(p).get() ) == a[0]; } + template + static inline std::string metaTupleToString(const MetaTuple& mtp) + { + return xToString(std::get<0>(mtp)); + } + + template + static inline void fillRangeDataVec(std::vector& out, + const std::tuple...>& tp) + { + std::vector part = std::get(tp)->data(); + out.insert(out.end(), part.begin(), part.end()); + } + }; template diff --git a/src/include/ranges/single_range.h b/src/include/ranges/single_range.h index eb0602e..ce41d3c 100644 --- a/src/include/ranges/single_range.h +++ b/src/include/ranges/single_range.h @@ -11,6 +11,7 @@ //#include "ranges/rpack_num.h" #include "ranges/index_base.h" #include "ranges/range_base.h" +#include "ranges/x_to_string.h" #include "xfor/xfor.h" @@ -103,6 +104,9 @@ namespace MultiArrayTools virtual size_t size() const override; virtual size_t dim() const override; + + virtual std::string stringMeta(size_t pos) const override; + virtual std::vector data() const override; const U& get(size_t pos) const; size_t getMeta(const U& metaPos) const; @@ -365,6 +369,28 @@ namespace MultiArrayTools return 1; } + template + std::string SingleRange::stringMeta(size_t pos) const + { + return xToString(get(pos)); + } + + template + std::vector SingleRange::data() const + { + DataHeader h; + h.spaceType = static_cast( TYPE ); + h.metaSize = size() * sizeof(U); + h.multiple = 0; + std::vector out; + out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + const char* scp = reinterpret_cast(mSpace.data()); + out.insert(out.end(), scp, scp + h.metaSize); + return out; + } + template typename SingleRange::IndexType SingleRange::begin() const { diff --git a/src/include/ranges/x_to_string.h b/src/include/ranges/x_to_string.h new file mode 100644 index 0000000..81dc63a --- /dev/null +++ b/src/include/ranges/x_to_string.h @@ -0,0 +1,83 @@ + +#ifndef __x_to_string_h__ +#define __x_to_string_h__ + +#include +#include +#include +#include + +namespace MultiArrayHelper +{ + template + inline std::string xToString(const T& x) + { + return std::to_string(x); + } + + template + struct TupleToString + { + template + static inline std::string mk(const std::tuple& tp) + { + return TupleToString::mk(tp) + " , " + xToString(std::get(tp)); + } + }; + + template <> + struct TupleToString<0> + { + template + static inline std::string mk(const std::tuple& tp) + { + return xToString(std::get<0>(tp)); + } + }; + + template <> + inline std::string xToString(const char& x) + { + std::string out = ""; + return out += x; + } + + template <> + inline std::string xToString(const std::string& x) + { + return x; + } + + template + inline std::string xToString(const std::vector& x) + { + std::string out = "[ "; + for(auto& y: x){ + out += y + " , "; + } + out.pop_back(); + out.back() = ']'; + return out; + } + + template + inline std::string xToString(const std::array& x) + { + std::string out = "[ "; + for(auto& y: x){ + out += y + " , "; + } + out.pop_back(); + out.back() = ']'; + return out; + } + + template + inline std::string xToString(const std::tuple& tp) + { + return "{ " + TupleToString::mk(tp) + " }"; + } + +} + +#endif diff --git a/src/lib/ranges/anonymous_range.cc b/src/lib/ranges/anonymous_range.cc index 992e098..694ab14 100644 --- a/src/lib/ranges/anonymous_range.cc +++ b/src/lib/ranges/anonymous_range.cc @@ -77,6 +77,36 @@ namespace MultiArrayTools return 1; } + std::string AnonymousRange::stringMeta(size_t pos) const + { + std::string out = "[ "; + size_t xpos = pos; + for(size_t i = mOrig.size(); i != 0; --i) { + auto& x = mOrig[i-1]; + const size_t redpos = pos % x->size(); + out = ( (i == mOrig.size()) ? out : out + " , " ) + x->stringMeta(redpos); + xpos -= redpos; + } + out += " ]"; + return out; + } + + std::vector AnonymousRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::ANON ); + h.metaSize = mOrig.size(); + h.multiple = 1; + std::vector out; + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + for(auto& x: mOrig){ + auto part = x->data(); + out.insert(out.end(), part.begin(), part.end()); + } + return out; + } + size_t AnonymousRange::anonymousDim() const { return mOrig.size(); diff --git a/src/lib/ranges/range_types/classic_range.cc b/src/lib/ranges/range_types/classic_range.cc index 82c2af6..6432e0c 100644 --- a/src/lib/ranges/range_types/classic_range.cc +++ b/src/lib/ranges/range_types/classic_range.cc @@ -1,5 +1,6 @@ #include "ranges/rheader.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -46,6 +47,27 @@ namespace MultiArrayTools { return 1; } + + std::string SingleRange::stringMeta(size_t pos) const + { + return std::to_string(get(pos)); + } + + std::vector SingleRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::NONE ); + h.metaSize = sizeof(size_t); + h.multiple = 0; + std::vector out; + out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + const char* scp = reinterpret_cast(&mSize); + out.insert(out.end(), scp, scp + h.metaSize); + return out; + } + typename SingleRange::IndexType SingleRange::begin() const { diff --git a/src/lib/ranges/range_types/null_range.cc b/src/lib/ranges/range_types/null_range.cc index 056d5fd..dac0f90 100644 --- a/src/lib/ranges/range_types/null_range.cc +++ b/src/lib/ranges/range_types/null_range.cc @@ -1,5 +1,6 @@ #include "ranges/rheader.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -61,7 +62,25 @@ namespace MultiArrayTools { return 1; } - + + std::string SingleRange::stringMeta(size_t pos) const + { + return std::to_string(get(pos)); + } + + std::vector SingleRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::NUL ); + h.metaSize = 0; + h.multiple = 0; + std::vector out; + out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + return out; + } + typename SingleRange::IndexType SingleRange::begin() const { SingleIndex i( std::dynamic_pointer_cast > diff --git a/src/lib/ranges/range_types/space_range.cc b/src/lib/ranges/range_types/space_range.cc index 48fd9d4..b126bc5 100644 --- a/src/lib/ranges/range_types/space_range.cc +++ b/src/lib/ranges/range_types/space_range.cc @@ -1,5 +1,6 @@ #include "ranges/rheader.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -46,6 +47,26 @@ namespace MultiArrayTools { return 1; } + + std::string SingleRange::stringMeta(size_t pos) const + { + return std::to_string(get(pos)); + } + + std::vector SingleRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::PSPACE ); + h.metaSize = sizeof(size_t); + h.multiple = 0; + std::vector out; + out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + const char* scp = reinterpret_cast(&mSize); + out.insert(out.end(), scp, scp + h.metaSize); + return out; + } typename SingleRange::IndexType SingleRange::begin() const { diff --git a/src/lib/ranges/range_types/spin_range.cc b/src/lib/ranges/range_types/spin_range.cc index 83b0e55..a2e1b96 100644 --- a/src/lib/ranges/range_types/spin_range.cc +++ b/src/lib/ranges/range_types/spin_range.cc @@ -1,5 +1,6 @@ #include "ranges/rheader.h" +#include "ranges/x_to_string.h" namespace MultiArrayTools { @@ -44,7 +45,25 @@ namespace MultiArrayTools { return 1; } - + + std::string SingleRange::stringMeta(size_t pos) const + { + return std::to_string(get(pos)); + } + + std::vector SingleRange::data() const + { + DataHeader h; + h.spaceType = static_cast( SpaceType::SPIN ); + h.metaSize = 0; + h.multiple = 0; + std::vector out; + out.reserve(h.metaSize + sizeof(DataHeader)); + char* hcp = reinterpret_cast(&h); + out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); + return out; + } + typename SingleRange::IndexType SingleRange::begin() const { SingleIndex i( std::dynamic_pointer_cast >