diff --git a/src/include/base/to_string.cc.h b/src/include/base/to_string.cc.h index dac3678..34e2adf 100644 --- a/src/include/base/to_string.cc.h +++ b/src/include/base/to_string.cc.h @@ -55,6 +55,12 @@ namespace CNORXZ } ); } + template + String ToString>::func(const std::pair& p) + { + return String("(") + toString(p.first) + "," + toString(p.second) + ")"; + } + template String toString(const T& a) { diff --git a/src/include/base/to_string.h b/src/include/base/to_string.h index 08f055b..f5cd2e5 100644 --- a/src/include/base/to_string.h +++ b/src/include/base/to_string.h @@ -35,7 +35,13 @@ namespace CNORXZ { static String func(const Tuple& t); }; - + + template + struct ToString> + { + static String func(const std::pair& t); + }; + template <> struct ToString { diff --git a/src/include/ranges/urange.cc.h b/src/include/ranges/urange.cc.h index 89a0bfe..4964619 100644 --- a/src/include/ranges/urange.cc.h +++ b/src/include/ranges/urange.cc.h @@ -233,7 +233,7 @@ namespace CNORXZ { std::sort(mSpace.begin(), mSpace.end(), std::less()); auto itdupl = std::adjacent_find(mSpace.begin(), mSpace.end()); - CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << *itdupl); + CXZ_ASSERT(itdupl == mSpace.end(), "found duplicate: " << toString(*itdupl)); } diff --git a/src/opt/hdf5/include/h5_group.cc.h b/src/opt/hdf5/include/h5_group.cc.h index 554bc44..58d8f11 100644 --- a/src/opt/hdf5/include/h5_group.cc.h +++ b/src/opt/hdf5/include/h5_group.cc.h @@ -16,7 +16,7 @@ namespace CNORXZ template Group& Group::addTable(const String& name, const ArrayBase>& data, - const RangePtr& fields) + const Vector& fnames) { CXZ_ASSERT(this->isOpen(), "tried to extend closed group"); Vector nvec({name}); @@ -25,7 +25,7 @@ namespace CNORXZ mCont.extend(extr); auto ii = mCont.begin(); ii.at(dvec); // 'at' returns YIndex&, so cannot use it inline... - auto tab = std::make_shared>(name, this, fields); + auto tab = std::make_shared>(name, this, fnames); for(auto& d: data){ tab->appendRecord(d); } diff --git a/src/opt/hdf5/include/h5_group.h b/src/opt/hdf5/include/h5_group.h index a13cd02..ce487c3 100644 --- a/src/opt/hdf5/include/h5_group.h +++ b/src/opt/hdf5/include/h5_group.h @@ -34,7 +34,7 @@ namespace CNORXZ template Group& addTable(const String& name, const ArrayBase>& data, - const RangePtr& fields); + const Vector& fnames); protected: MArray mCont; diff --git a/src/opt/hdf5/include/h5_table.cc.h b/src/opt/hdf5/include/h5_table.cc.h index cc42228..0ec028d 100644 --- a/src/opt/hdf5/include/h5_table.cc.h +++ b/src/opt/hdf5/include/h5_table.cc.h @@ -18,13 +18,19 @@ namespace CNORXZ } template - STable::STable(const String& name, const ContentBase* _parent, const RangePtr& fields) : + STable::STable(const String& name, const ContentBase* _parent, + const Vector& fnames) : Table(name, _parent) { constexpr SizeT N = sizeof...(Ts); if(mFields == nullptr){ - CXZ_ASSERT(fields != nullptr, "field names have to be initialized"); - mFields = fields; + CXZ_ASSERT(fnames.size() != 0, "field names have to be initialized"); + Vector fields(fnames.size()); + for(SizeT i = 0; i != fields.size(); ++i){ + fields[i].first = i; + fields[i].second = fnames[i]; + } + mFields = URangeFactory(fields).create(); } CXZ_ASSERT(mFields->size() == sizeof...(Ts), "expected tuple of size = " << mFields->size() << ", got: " << sizeof...(Ts)); @@ -66,9 +72,9 @@ namespace CNORXZ if(mRecords == nullptr){ mRecords = appr; Vector fields(mFields->size()); - auto fr = std::dynamic_pointer_cast>(mFields); + auto fr = std::dynamic_pointer_cast>(mFields); for(auto fi = fr->begin(); fi != fr->end(); ++fi){ - fields[fi.lex()] = (*fi).c_str(); + fields[fi.lex()] = (*fi).second.c_str(); } H5TBmake_table(mName.c_str(), mParent->id(), mName.c_str(), mFields->size(), mRecords->size(), sizeof(t), fields.data(), mOffsets.data(), diff --git a/src/opt/hdf5/include/h5_table.h b/src/opt/hdf5/include/h5_table.h index 18a6476..5ae5ca4 100644 --- a/src/opt/hdf5/include/h5_table.h +++ b/src/opt/hdf5/include/h5_table.h @@ -11,6 +11,8 @@ namespace CNORXZ class Table : public ContentBase { public: + typedef std::pair FieldID; + DEFAULT_MEMBERS(Table); Table(const String& name, const ContentBase* _parent); ~Table(); @@ -41,7 +43,7 @@ namespace CNORXZ { public: DEFAULT_MEMBERS(STable); - STable(const String& name, const ContentBase* _parent, const RangePtr& fields); + STable(const String& name, const ContentBase* _parent, const Vector& fnames); STable& appendRecord(const Tuple& t); STable& appendRecord(const MArray>& t); diff --git a/src/opt/hdf5/lib/h5_table.cc b/src/opt/hdf5/lib/h5_table.cc index 8ecd4dd..c68b75f 100644 --- a/src/opt/hdf5/lib/h5_table.cc +++ b/src/opt/hdf5/lib/h5_table.cc @@ -20,11 +20,12 @@ namespace CNORXZ SizeT typesize = 0; H5TBget_field_info(mParent->id(), mName.c_str(), fieldsptr.data(), sizes.data(), offsets.data(), &typesize); - Vector fields(nfields); + Vector fields(nfields); for(SizeT i = 0; i != nfields; ++i){ - fields[i] = fieldsptr[i]; + fields[i].first = i; + fields[i].second = fieldsptr[i]; } - mFields = URangeFactory( std::move(fields) ).create(); + mFields = URangeFactory( std::move(fields) ).create(); mSizes = MArray(mFields, std::move(sizes)); mOffsets = MArray(mFields, std::move(offsets)); this->open(); @@ -87,7 +88,12 @@ namespace CNORXZ Table& Table::initFieldNames(const Vector& fnames) { CXZ_ASSERT(mFields == nullptr, "fields already initialized"); - mFields = URangeFactory(fnames).create(); + Vector fields(fnames.size()); + for(SizeT i = 0; i != fields.size(); ++i){ + fields[i].first = i; + fields[i].second = fnames[i]; + } + mFields = URangeFactory(fields).create(); return *this; } } diff --git a/src/opt/hdf5/tests/h5_basic_unit_test.cc b/src/opt/hdf5/tests/h5_basic_unit_test.cc index 1399651..172c707 100644 --- a/src/opt/hdf5/tests/h5_basic_unit_test.cc +++ b/src/opt/hdf5/tests/h5_basic_unit_test.cc @@ -40,7 +40,7 @@ namespace { mFileName = testh5file; mGrps = { "gr1", "gr2" }; - mFs = URangeFactory(Vector({"field1","second","real"})).create(); + mFs = {"field1","second","real"}; Vector> v ( { {0, -6, 3.141}, {3, -8, 0.789}, @@ -55,7 +55,7 @@ namespace String mFileName; Vector mGrps; - RangePtr mFs; + Vector mFs; MArray> mTabA; };