11 #include "../icedb/compat/gsl/gsl" 14 #include "../icedb/fs.hpp" 15 #include "../icedb/util.hpp" 17 #define INST_ATTR(y) \ 38 # define ARRAYOFFSET(TYPE, INDEX) [](){TYPE a; return (size_t) &a[INDEX] - (size_t) &a; }() 40 std::set<std::string>
getGroupMembers(
const ICEDB_H5_GETNUMOBJS_OWNER &base);
47 HDFgroup_t
openOrCreateGroup(gsl::not_null<ICEDB_H5_GROUP_OWNER_PTR> base, gsl::not_null<const char*> name);
48 HDFgroup_t
openGroup(gsl::not_null<ICEDB_H5_GROUP_OWNER_PTR> base, gsl::not_null<const char*> name);
49 bool groupExists(gsl::not_null<ICEDB_H5_GROUP_OWNER_PTR> base, gsl::not_null<const char*> name);
54 template <
class DataType>
57 throw(std::invalid_argument(
"Unsupported type during attribute conversion in rtmath::plugins::hdf5::MatchAttributeType."));
59 template<> MatchAttributeTypeType MatchAttributeType<std::string>();
60 template<> MatchAttributeTypeType MatchAttributeType<const char*>();
75 template <
class DataType>
bool isStrType() {
return false; }
76 template<>
bool isStrType<std::string>();
77 template<>
bool isStrType<const char*>();
80 template <
class DataType>
81 void insertAttr(
const H5::Attribute &attr, gsl::not_null<H5::AtomType*> vls_type,
const DataType& value)
83 attr.write(*vls_type, &value);
85 template <>
void insertAttr<std::string>(
const H5::Attribute &attr, gsl::not_null<H5::AtomType*> vls_type,
const std::string& value);
88 template <
class DataType,
class Container>
89 void addAttr(gsl::not_null<Container*> obj, gsl::not_null<const char*> attname,
const DataType &value)
91 auto vls_type = MatchAttributeType<DataType>();
95 H5::DataSpace att_space(1, &dsize);
96 H5::Attribute attr = obj->createAttribute(attname, *vls_type, att_space);
97 insertAttr<DataType>(attr, vls_type.get(), value);
101 template <
class DataType,
class Container>
103 gsl::not_null<Container*> obj,
104 gsl::not_null<const char*> attname,
105 const std::vector<size_t> &dimensionality,
106 const std::vector<DataType> &value)
108 auto ftype = MatchAttributeType<DataType>();
109 std::vector<hsize_t> hdims;
110 for (
const auto &d : dimensionality)
111 hdims.push_back(static_cast<hsize_t>(d));
116 H5::DataSpace att_space(static_cast<int>(dimensionality.size()), hdims.data());
117 H5::Attribute attr = obj->createAttribute(attname, *(ftype.get()), att_space);
118 attr.write(*ftype, value.data());
128 template <
class DataType,
class Container>
130 gsl::not_null<Container*> obj,
131 gsl::not_null<const char*> attname,
132 const std::vector<DataType> &data)
134 auto ftype = MatchAttributeType<DataType>();
135 hsize_t dsize =
static_cast<hsize_t
>(data.size());
136 H5::DataSpace att_space(1, &dsize);
137 H5::Attribute attr = obj->createAttribute(attname, *(ftype.get()), att_space);
138 attr.write(*ftype, data.data());
142 template <
class DataType>
143 void loadAttr(
const H5::Attribute &attr, gsl::not_null<H5::AtomType*> vls_type, DataType& value)
145 attr.read(*vls_type, &value);
147 template <>
void loadAttr<std::string>(
const H5::Attribute &attr, gsl::not_null<H5::AtomType*> vls_type, std::string& value);
150 template <
class DataType,
class Container>
151 void readAttr(gsl::not_null<Container*> obj, gsl::not_null<const char*> attname, DataType &value)
153 auto vls_type = MatchAttributeType<DataType>();
154 H5::DataSpace att_space(H5S_SCALAR);
155 H5::Attribute attr = obj->openAttribute(attname);
156 loadAttr<DataType>(attr, vls_type.get(), value);
160 template <
class DataType,
class Container>
161 void readAttrArray(gsl::not_null<Container*> obj, gsl::not_null<const char*> attname,
162 std::vector<size_t> &dims,
163 std::vector<DataType> &value)
165 H5::Attribute attr = obj->openAttribute(attname);
166 int dimensionality = attr.getArrayType().getArrayNDims();
167 Expects(dimensionality > 0);
168 std::vector<hsize_t> sz(static_cast<size_t>(dimensionality));
169 attr.getArrayType().getArrayDims(sz.data());
171 dims.resize(static_cast<size_t>(dimensionality));
173 for (
size_t i = 0; i < dimensionality; ++i) {
174 dims[i] =
static_cast<size_t>(sz[i]);
177 value.resize(numElems);
179 auto ftype = MatchAttributeType<DataType>();
181 H5::ArrayType vls_type(*ftype, dimensionality, sz.data());
185 attr.read(vls_type, value.data());
189 template <
class DataType,
class Container>
190 void readAttrVector(gsl::not_null<Container*> obj, gsl::not_null<const char*> attname,
191 std::vector<DataType> &value)
200 H5::Attribute attr = obj->openAttribute(attname);
201 auto ftype = MatchAttributeType<DataType>();
202 H5::DataSpace dspace = attr.getSpace();
203 value.resize(dspace.getSimpleExtentNdims());
204 attr.read(*(ftype.get()), value.data());
218 template <
class Container>
221 H5::Attribute attr = obj->openAttribute(attname);
223 H5::DataType dtype = attr.getDataType();
226 H5T_class_t class_type = dtype.getClass();
240 template <
class Container>
242 gsl::not_null<Container*> obj, gsl::not_null<const char*> attname)
244 std::vector<hsize_t> dims;
245 H5::Attribute attr = obj->openAttribute(attname);
246 int dimensionality = attr.getArrayType().getArrayNDims();
247 dims.resize(dimensionality);
248 attr.getArrayType().getArrayDims(dims.data());
252 bool attrExists(gsl::not_null<H5::H5Object*> obj, gsl::not_null<const char*> attname);
258 std::pair<bool, bool>
symLinkExists(gsl::not_null<ICEDB_H5_GROUP_OWNER_PTR> base, gsl::not_null<const char*> name);
265 bool datasetExists(gsl::not_null<ICEDB_H5_GROUP_OWNER_PTR> base, gsl::not_null<const char*> name);
271 template <
class DataType,
class Container>
273 gsl::not_null<Container*> obj, gsl::not_null<const char*> name,
size_t rows,
size_t cols,
274 gsl::not_null<const DataType*> values, std::shared_ptr<H5::DSetCreatPropList> iplist =
nullptr)
277 std::vector<hsize_t> sz{ (hsize_t)rows, (hsize_t)cols };
278 int dimensionality = 2;
279 if (cols == 1) dimensionality = 1;
280 H5::DataSpace fspace(dimensionality, sz.data());
281 auto ftype = MatchAttributeType<DataType>();
282 std::shared_ptr<DSetCreatPropList> plist;
283 if (iplist) plist = iplist;
286 plist = std::shared_ptr<DSetCreatPropList>(
new DSetCreatPropList);
287 if (!isStrType<DataType>())
290 plist->setFillValue(PredType::NATIVE_INT, &fillvalue);
292 plist->setChunk(static_cast<int>(sz.size()), sz.data());
298 HDFdataset_t dataset(
new DataSet(obj->createDataSet(name, *(ftype.get()),
299 fspace, *(plist.get()))));
300 dataset->write(values, *(ftype.get()));
304 template <
class DataType,
class Container>
306 gsl::not_null<Container*> obj, gsl::not_null<const char*> name,
size_t rows,
307 gsl::not_null<const DataType*> values, std::shared_ptr<H5::DSetCreatPropList> iplist =
nullptr)
312 template <
class DataType,
class Container>
314 const std::vector<size_t> &dimensions,
315 gsl::not_null<H5::DataSet*> dset,
316 gsl::not_null<const DataType*> values)
319 std::vector<hsize_t> sz(dimensions.size());
320 for (
size_t i = 0; i < sz.size(); ++i)
321 sz[i] = static_cast<hsize_t>(dimensions[i]);
323 auto ftype = MatchAttributeType<DataType>();
325 dset->write(values, *(ftype.get()));
329 template <
class DataType,
class Container>
331 gsl::not_null<Container*> parent,
332 gsl::not_null<const char*> name,
333 const std::vector<size_t> &dims,
334 std::shared_ptr<H5::DSetCreatPropList> iplist =
nullptr)
337 std::vector<hsize_t> sz(dims.size());
338 for (
size_t i = 0; i < sz.size(); ++i)
339 sz[i] = static_cast<hsize_t>(dims[i]);
341 DataSpace fspace(static_cast<int>(sz.size()), sz.data());
342 auto ftype = MatchAttributeType<DataType>();
343 std::shared_ptr<DSetCreatPropList> plist;
344 if (iplist) plist = iplist;
347 plist = std::shared_ptr<DSetCreatPropList>(
new DSetCreatPropList);
348 if (!isStrType<DataType>())
351 plist->setFillValue(PredType::NATIVE_INT, &fillvalue);
353 plist->setChunk(static_cast<int>(sz.size()), sz.data());
359 HDFdataset_t dataset(
new DataSet(parent->createDataSet(name, *(ftype.get()),
360 fspace, *(plist.get()))));
365 template <
class Container>
367 gsl::not_null<Container*> obj,
368 gsl::not_null<const char*> name,
369 std::vector<size_t> &out)
373 HDFdataset_t dataset(
new H5::DataSet(obj->openDataSet(name)));
374 H5T_class_t type_class = dataset->getTypeClass();
375 DataSpace fspace = dataset->getSpace();
376 int rank = fspace.getSimpleExtentNdims();
378 std::vector<hsize_t> sz(rank);
379 int dimensionality = fspace.getSimpleExtentDims( sz.data(), NULL);
380 for (
size_t i = 0; i < rank; ++i)
381 out.push_back(sz[i]);
390 template <
class DataType,
class Container>
392 gsl::not_null<Container*> obj, gsl::not_null<const char*> name,
393 gsl::not_null<DataType*> values)
397 HDFdataset_t dataset(
new H5::DataSet(obj->openDataSet(name)));
398 H5T_class_t type_class = dataset->getTypeClass();
399 DataSpace fspace = dataset->getSpace();
402 auto ftype = MatchAttributeType<DataType>();
404 dataset->read(values, *(ftype.get()));
405 return std::move(dataset);
408 template <
class DataType,
class Container>
410 gsl::not_null<Container*> dataset,
411 gsl::not_null<DataType*> values)
415 H5T_class_t type_class = dataset->getTypeClass();
416 DataSpace fspace = dataset->getSpace();
419 auto ftype = MatchAttributeType<DataType>();
421 dataset->read(values, *(ftype.get()));
428 template <
class Container>
430 gsl::not_null<Container*> obj,
431 const std::string &prefix,
433 const std::function<std::string(
int)> &s,
size_t stride = 0,
size_t mCols = 0)
435 size_t nstride = stride;
436 if (!nstride) nstride = 1;
437 for (
size_t i = 0; i < num; ++i)
439 size_t j = i / nstride;
440 std::string lbl = s((
int)j);
441 std::ostringstream fldname;
442 fldname << std::string(prefix);
445 fldname << std::right << i <<
"_NAME";
446 std::string sfldname = fldname.str();
447 addAttr<std::string, Container>(obj, sfldname.c_str(), lbl);
455 template <
class Container>
456 void addColNames(gsl::not_null<Container*> obj,
size_t num,
const std::function<std::string(
int)> &s,
size_t stride = 0,
size_t mCols = 0)
458 size_t nstride = stride;
459 if (!nstride) nstride = 1;
460 for (
size_t i = 0; i < num; ++i)
462 size_t j = i / nstride;
463 std::string lbl = s((
int)j);
464 std::ostringstream fldname;
465 fldname <<
"COLUMN_";
468 fldname << std::right << i <<
"_NAME";
469 std::string sfldname = fldname.str();
472 size_t k = i % nstride;
474 if (k == 0) lbl.append(
"_X");
475 if (k == 1) lbl.append(
"_Y");
476 if (k == 2) lbl.append(
"_Z");
477 if (k == 3) lbl.append(
"_R");
480 size_t row = k / mCols;
481 size_t col = k % mCols;
482 std::ostringstream iappend;
483 iappend <<
"_" << row <<
"_" << col;
484 lbl.append(iappend.str());
487 addAttr<std::string, Container>(obj, sfldname.c_str(), lbl);
493 std::shared_ptr<H5::DSetCreatPropList>
make_plist(
size_t rows,
size_t cols,
bool compress =
true);
495 std::vector<std::string>
explode(std::string
const & s,
char delim);
499 H5::Group
createGroupStructure(
const std::vector<std::string> &groupNames, ICEDB_H5_GROUP_OWNER &base);
505 template <
class DataType>
506 bool isType(hid_t) {
throw(std::invalid_argument(
"Unsupported type. (icedb::fs::hdf5::isType(hid_t))"));
return false; }
508 template <
class DataType,
class Container>
509 bool isType(gsl::not_null<const Container*> obj,
const std::string &attributeName) {
510 H5::Attribute attr = obj->openAttribute(attributeName);
511 return isType<DataType>(attr.getDataType().getId());
513 template <
class DataType,
class Container>
514 bool isType(gsl::not_null<const Container*> obj) {
515 return isType<DataType>(obj->getDataType().getId());
528 template<>
bool isType<std::string>(hid_t type_id);
MatchAttributeTypeType MatchAttributeType< int8_t >()
std::unique_ptr< H5::Group > HDFgroup_t
void addAttrVector(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, const std::vector< DataType > &data)
Writes a vector of objects.
bool groupExists(gsl::not_null< ICEDB_H5_GROUP_OWNER_PTR > base, gsl::not_null< const char *> name)
MatchAttributeTypeType MatchAttributeType< char >()
bool isType< uint8_t >(hid_t type_id)
bool attrExists(gsl::not_null< H5::H5Object *> base, gsl::not_null< const char *> name)
bool isType< uint16_t >(hid_t type_id)
H5::Group createGroupStructure(const std::string &groupName, ICEDB_H5_GROUP_OWNER &base)
HDFdataset_t createDatasetRaw(gsl::not_null< Container *> parent, gsl::not_null< const char *> name, const std::vector< size_t > &dims, std::shared_ptr< H5::DSetCreatPropList > iplist=nullptr)
MatchAttributeTypeType MatchAttributeType()
bool isStrType()
Check to see if output type is for a string.
std::shared_ptr< H5::DSetCreatPropList > make_plist(size_t rows, size_t cols, bool compress)
Creates a property list with the compression + chunking as specified.
std::set< std::string > getGroupMembers(const ICEDB_H5_GETNUMOBJS_OWNER &base)
MatchAttributeTypeType MatchAttributeType< float >()
DataContainerType getAttributeGroupingType(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname)
void loadAttr(const H5::Attribute &attr, gsl::not_null< H5::AtomType *> vls_type, DataType &value)
Handles proper insertion of strings versus other data types.
bool isType< uint64_t >(hid_t type_id)
MatchAttributeTypeType MatchAttributeType< uint16_t >()
MatchAttributeTypeType MatchAttributeType< uint32_t >()
std::vector< hsize_t > getAttrArrayDimensionality(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname)
MatchAttributeTypeType MatchAttributeType< uint64_t >()
void addAttr(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, const DataType &value)
Convenient template to add an attribute of a variable type to a group or dataset. ...
bool isType< int8_t >(hid_t type_id)
void insertAttr(const H5::Attribute &attr, gsl::not_null< H5::AtomType *> vls_type, const DataType &value)
Handles proper insertion of strings versus other data types.
void readAttrVector(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, std::vector< DataType > &value)
Reads an array (or vector) of objects.
bool isType< int16_t >(hid_t type_id)
std::vector< std::string > explode(std::string const &s, char delim)
MatchAttributeTypeType MatchAttributeType< int64_t >()
MatchAttributeTypeType MatchAttributeType< int32_t >()
bool isType< int64_t >(hid_t type_id)
bool isType(hid_t)
Functions to detect the type of data.
void readDatasetDimensions(gsl::not_null< H5::DataSet *> dataset, std::vector< size_t > &dims)
std::vector< std::string > explodeHDF5groupPath(const std::string &s)
void addColNames(gsl::not_null< Container *> obj, size_t num, const std::function< std::string(int)> &s, size_t stride=0, size_t mCols=0)
Add column names to table.
HDFgroup_t openGroup(gsl::not_null< ICEDB_H5_GROUP_OWNER_PTR > base, gsl::not_null< const char *> name)
void readAttr(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, DataType &value)
Convenient template to read an attribute of a variable.
HDFdataset_t readDatasetArray(gsl::not_null< Container *> obj, gsl::not_null< const char *> name, gsl::not_null< DataType *> values)
bool isType< int32_t >(hid_t type_id)
bool isType< uint32_t >(hid_t type_id)
gsl::not_null< H5::DataSet * > writeDatasetArray(const std::vector< size_t > &dimensions, gsl::not_null< H5::DataSet *> dset, gsl::not_null< const DataType *> values)
HDFdataset_t addDatasetArray(gsl::not_null< Container *> obj, gsl::not_null< const char *> name, size_t rows, size_t cols, gsl::not_null< const DataType *> values, std::shared_ptr< H5::DSetCreatPropList > iplist=nullptr)
std::pair< bool, bool > symLinkExists(gsl::not_null< ICEDB_H5_GROUP_OWNER_PTR > base, gsl::not_null< const char *> name)
unsigned int getHDF5IOflags(fs::IOopenFlags flags)
std::unique_ptr< H5::DataSet > HDFdataset_t
bool isType< char >(hid_t type_id)
MatchAttributeTypeType MatchAttributeType< int16_t >()
bool isType< double >(hid_t type_id)
bool datasetExists(gsl::not_null< ICEDB_H5_GROUP_OWNER_PTR > base, gsl::not_null< const char *> name)
Convenience function to check if a given dataset exists.
bool isType< float >(hid_t type_id)
size_t readDatasetNumDimensions(gsl::not_null< H5::DataSet *> dataset)
void addAttrArray(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, const std::vector< size_t > &dimensionality, const std::vector< DataType > &value)
Writes an array of objects.
MatchAttributeTypeType MatchAttributeType< double >()
void readAttrArray(gsl::not_null< Container *> obj, gsl::not_null< const char *> attname, std::vector< size_t > &dims, std::vector< DataType > &value)
Reads an array (or vector) of objects.
std::map< std::string, H5G_obj_t > getGroupMembersTypes(const ICEDB_H5_GETNUMOBJS_OWNER &base)
std::unique_ptr< H5::AtomType > MatchAttributeTypeType
HDFgroup_t openOrCreateGroup(gsl::not_null< ICEDB_H5_GROUP_OWNER_PTR > base, gsl::not_null< const char *> name)
void addNames(gsl::not_null< Container *> obj, const std::string &prefix, size_t num, const std::function< std::string(int)> &s, size_t stride=0, size_t mCols=0)
Add column names to table.
MatchAttributeTypeType MatchAttributeType< uint8_t >()