start implementing string to range parsing

This commit is contained in:
Christian Zimmermann 2018-07-22 18:32:43 +02:00
parent f14edd17e4
commit c361c2337f
12 changed files with 179 additions and 6 deletions

View file

@ -39,6 +39,8 @@ namespace MultiArrayTools
int spaceType = static_cast<int>( SpaceType::NONE ); int spaceType = static_cast<int>( SpaceType::NONE );
size_t metaSize = 0; // size of meta data size_t metaSize = 0; // size of meta data
int multiple = 0; // = 1 if multi range int multiple = 0; // = 1 if multi range
int metaType = 0; // type of meta data
inline size_t v() const { return version; }
}; };
class RangeFactoryBase class RangeFactoryBase
@ -59,6 +61,8 @@ namespace MultiArrayTools
void setSelf(); void setSelf();
}; };
std::shared_ptr<RangeFactoryBase> createRangeFactory(const std::vector<char>& data);
class RangeBase class RangeBase
{ {
public: public:

View file

@ -10,6 +10,9 @@
#ifdef __incl_this__ #ifdef __incl_this__
#ifndef __ranges_header_included__
#define __ranges_header_included__
#define __ranges_header__ #define __ranges_header__
//#ifndef __ranges_header__ //#ifndef __ranges_header__
//#define __ranges_header__ //#define __ranges_header__
@ -20,7 +23,8 @@
#include "classic_range.h" #include "classic_range.h"
#undef __ranges_header__ #undef __ranges_header__
//#endif
#endif
#endif #endif
#undef __incl_this__ #undef __incl_this__

View file

@ -76,6 +76,9 @@ namespace MultiArrayTools
typedef SingleRange<size_t,SpaceType::NUL> NullRange; typedef SingleRange<size_t,SpaceType::NUL> NullRange;
typedef SingleRangeFactory<size_t,SpaceType::NUL> NullRF; typedef SingleRangeFactory<size_t,SpaceType::NUL> NullRF;
std::shared_ptr<NullRF> mkNUL(char* dp, size_t size);
} }

View file

@ -66,6 +66,8 @@ namespace MultiArrayTools
typedef SingleRange<int,SpaceType::PSPACE> PSpaceRange; typedef SingleRange<int,SpaceType::PSPACE> PSpaceRange;
typedef SingleRangeFactory<int,SpaceType::PSPACE> PSpaceRF; typedef SingleRangeFactory<int,SpaceType::PSPACE> PSpaceRF;
std::shared_ptr<PSpaceRF> mkPSPACE(char* dp, size_t size);
template <class SpaceRange> template <class SpaceRange>
struct PromoteMSpaceRange struct PromoteMSpaceRange
{ {

View file

@ -70,6 +70,8 @@ namespace MultiArrayTools
typedef SingleRange<size_t,SpaceType::SPIN> SpinRange; typedef SingleRange<size_t,SpaceType::SPIN> SpinRange;
typedef SingleRangeFactory<size_t,SpaceType::SPIN> SpinRF; typedef SingleRangeFactory<size_t,SpaceType::SPIN> SpinRF;
std::shared_ptr<SpinRF> mkSPIN(char* dp, size_t size);
} }

View file

@ -393,8 +393,9 @@ namespace MultiArrayTools
out.reserve(h.metaSize + sizeof(DataHeader)); out.reserve(h.metaSize + sizeof(DataHeader));
char* hcp = reinterpret_cast<char*>(&h); char* hcp = reinterpret_cast<char*>(&h);
out.insert(out.end(), hcp, hcp + sizeof(DataHeader)); out.insert(out.end(), hcp, hcp + sizeof(DataHeader));
const char* scp = reinterpret_cast<const char*>(mSpace.data()); stringCat(out, mSpace);
out.insert(out.end(), scp, scp + h.metaSize); //const char* scp = reinterpret_cast<const char*>(mSpace.data());
//out.insert(out.end(), scp, scp + h.metaSize);
return out; return out;
} }

View file

@ -0,0 +1,82 @@
#ifndef __ma_type_map_h__
#define __ma_type_map_h__
#include <string>
namespace MultiArrayTools
{
template <size_t N>
struct TypeMap
{
typedef void type;
};
template <typename T>
struct NumTypeMap
{
static constexpr size_t num = 0;
};
template <typename T>
void stringCat(std::vector<char>& out, const std::vector<T>& in)
{
const char* scp = reinterpret_cast<const char*>(in.data());
out.insert(out.end(), scp, scp + in.size() * sizeof(T));
}
template <typename T>
void metaCat(std::vector<T>& vec, char* begin, size_t size)
{
T* tp = reinterpret_cast<T*>( begin );
vec.insert(vec.end(), tp, tp + size / sizeof(T));
}
template <>
void stringCat<std::string>(std::vector<char>& out, const std::vector<std::string>& in)
{
std::string tmp = "";
for(auto& x: in){
tmp += x + '\0';
}
const char* scp = reinterpret_cast<const char*>(tmp.data());
out.insert(out.end(), scp, scp + tmp.size());
}
template <>
void metaCat<std::string>(std::vector<std::string>& 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'
}
}
#define include_type(t,n) template <> struct TypeMap<n> { typedef t type; };\
template <> struct NumTypeMap<t> { static constexpr size_t num = n; };
include_type(size_t,1)
include_type(int,2)
include_type(char,3)
include_type(float,4)
include_type(double,5)
include_type(std::string,6)
#undef include_type
}
#endif
#ifdef register_type
register_type(1)
register_type(2)
register_type(3)
register_type(4)
register_type(5)
register_type(6)
#endif

View file

@ -53,7 +53,7 @@ namespace MultiArrayHelper
{ {
std::string out = "[ "; std::string out = "[ ";
for(auto& y: x){ for(auto& y: x){
out += y + " , "; out += xToString(y) + " , ";
} }
out.pop_back(); out.pop_back();
out.back() = ']'; out.back() = ']';
@ -65,7 +65,7 @@ namespace MultiArrayHelper
{ {
std::string out = "[ "; std::string out = "[ ";
for(auto& y: x){ for(auto& y: x){
out += y + " , "; out += xToString(y) + " , ";
} }
out.pop_back(); out.pop_back();
out.back() = ']'; out.back() = ']';

View file

@ -1,9 +1,14 @@
#include "ranges/range_base.h" #include "ranges/range_base.h"
#include "ranges/rheader.h"
#include "ranges/type_map.h"
#include "ranges/range_types/header.h"
namespace MultiArrayTools namespace MultiArrayTools
{ {
using namespace MultiArrayHelpers;
size_t indexId() size_t indexId()
{ {
static size_t id = 0; static size_t id = 0;
@ -11,6 +16,60 @@ namespace MultiArrayTools
return id; return id;
} }
std::shared_ptr<RangeFactoryBase> createRangeFactory(char** dp)
{
DataHeader h = *reinterpret_cast<const DataHeader*>(*dp);
*dp += sizeof(DataHeader);
std::shared_ptr<RangeFactoryBase> out = nullptr;
if(h.multiple != 0){
if(h.spaceType == static_cast<int>( SpaceType::ANY )) {
// multi range
out = mkMULTI(&dp);
}
else if(h.spaceType == static_cast<int>( SpaceType::ANON ) ) {
// anonymous range
out = mkANONYMOUS(&dp);
}
else {
assert(0);
}
}
else {
if(h.spaceType == static_cast<int>( SpaceType::ANY ) ) {
// generic single range
if(h.metaType == -1){
assert(0);
}
#define register_type(x) else if(x == h.metaType) {\
std::vector<TypeMap<x>::type> vd;\
metaCat(vd, *dp, h.metaSize); \
out = std::make_shared<SingleRangeFactory<TypeMap<x>::type, \
SpaceType::ANY> >(vd); }
#include "ranges/type_map.h"
#undef register_type
else {
assert(0);
}
}
else if(h.spaceType == static_cast<int>( SpaceType::NONE ) ) {
// classic range
size_t size = *reinterpret_cast<const size_t*>(*dp);
out = std::make_shared<SingleRangeFactory<size_t,SpaceType::NONE> >(size);
}
#define inlcude_range_type(x,n) out = mk##x(*dp, h.metaSize);
#include "ranges/range_types/header.h"
#undef inlcude_range_type
else {
assert(0);
}
*dp += h.metaSize;
}
return out;
}
/************************* /*************************
* RangeFactoryBase * * RangeFactoryBase *
*************************/ *************************/

View file

@ -4,6 +4,11 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
std::shared_ptr<NullRF> mkNUL(char* dp, size_t size)
{
return make_shared<NullRF>();
}
/******************** /********************
* SingleRange * * SingleRange *
********************/ ********************/

View file

@ -4,6 +4,12 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
std::shared_ptr<PSpaceRF> mkPSPACE(char* dp, size_t size)
{
size_t max = *reinterpret_cast<size_t*>(dp);
return std::make_shared<PSpaceRF>(max);
}
/******************** /********************
* SingleRange * * SingleRange *
********************/ ********************/

View file

@ -4,6 +4,11 @@
namespace MultiArrayTools namespace MultiArrayTools
{ {
std::shared_ptr<SpinRF> mkSPIN(char* dp, size_t size)
{
std::make_shared<SpinRF>();
}
/******************** /********************
* SingleRange * * SingleRange *
********************/ ********************/