Warning, /include/Geant4/toolx/hdf5/T_tools is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2010, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef toolx_hdf5_T_tools
0005 #define toolx_hdf5_T_tools
0006
0007 #include "hdf5_h"
0008
0009 #include <tools/typedefs>
0010 #include <tools/forit>
0011 #include <tools/num2s>
0012
0013 namespace toolx {
0014 namespace hdf5 {
0015
0016 inline hid_t to_T_file_type(char) {return H5T_STD_I8LE;} //H5T_STD_I8XX()
0017 inline hid_t to_T_file_type(short) {return H5T_STD_I16LE;} //HST_STD_I16XX()
0018 inline hid_t to_T_file_type(int) {return H5T_STD_I32LE;} //H5T_STD_I32XX()
0019 inline hid_t to_T_file_type(tools::int64) {return H5T_STD_I64LE;} //H5T_STD_I64XX()
0020
0021 inline hid_t to_T_file_type(float) {return H5T_IEEE_F32LE;} //H5T_IEEE_F32XX()
0022 inline hid_t to_T_file_type(double) {return H5T_IEEE_F64LE;} //H5T_IEEE_F64XX()
0023
0024 inline hid_t to_T_file_type(unsigned char) {return H5T_STD_U8LE;}
0025 inline hid_t to_T_file_type(unsigned short) {return H5T_STD_U16LE;}
0026 inline hid_t to_T_file_type(unsigned int) {return H5T_STD_U32LE;}
0027 inline hid_t to_T_file_type(tools::uint64) {return H5T_STD_U64LE;}
0028
0029 inline hid_t to_T_mem_type(char) {return H5T_NATIVE_CHAR;}
0030 inline hid_t to_T_mem_type(short) {return H5T_NATIVE_SHORT;}
0031 inline hid_t to_T_mem_type(int) {return H5T_NATIVE_INT;}
0032 inline hid_t to_T_mem_type(tools::int64) {return H5T_NATIVE_INT64;}
0033
0034 inline hid_t to_T_mem_type(float) {return H5T_NATIVE_FLOAT;}
0035 inline hid_t to_T_mem_type(double) {return H5T_NATIVE_DOUBLE;}
0036
0037 inline hid_t to_T_mem_type(unsigned char) {return H5T_NATIVE_UCHAR;}
0038 inline hid_t to_T_mem_type(unsigned short) {return H5T_NATIVE_USHORT;}
0039 inline hid_t to_T_mem_type(unsigned int) {return H5T_NATIVE_UINT;}
0040 inline hid_t to_T_mem_type(tools::uint64) {return H5T_NATIVE_UINT64;}
0041
0042 template <class T>
0043 inline bool write_array(hid_t a_loc,const std::string& a_name,
0044 hid_t a_file_type,hid_t a_mem_type,
0045 unsigned int a_chunked,unsigned int a_compress,
0046 unsigned int a_size,const T a_array[]) {
0047 if(!a_size) return false;
0048
0049 hid_t cpt = -1;
0050 if(a_compress || a_chunked) {
0051 cpt = ::H5Pcreate(H5P_DATASET_CREATE);
0052 if(cpt<0) return false;
0053 if(a_chunked) {
0054 if(H5Pset_layout(cpt,H5D_CHUNKED)<0) {
0055 ::H5Pclose(cpt);
0056 return false;
0057 }
0058 hsize_t cdims[1];
0059 cdims[0] = a_chunked;
0060 if(H5Pset_chunk(cpt,1,cdims)<0) {
0061 ::H5Pclose(cpt);
0062 return false;
0063 }
0064 } else {
0065 if(H5Pset_layout(cpt,H5D_COMPACT)<0) {
0066 ::H5Pclose(cpt);
0067 return false;
0068 }
0069 }
0070 if(a_compress) {
0071 if(H5Pset_deflate(cpt,a_compress>9?9:a_compress)<0) {
0072 ::H5Pclose(cpt);
0073 return false;
0074 }
0075 }
0076 } else {
0077 cpt = H5P_DEFAULT;
0078 }
0079
0080 hid_t dataset = -1;
0081
0082 {hsize_t dims[1];
0083 dims[0] = a_size;
0084 hid_t file_space = -1;
0085 if(a_chunked) {
0086 hsize_t mx_dims[1];
0087 mx_dims[0] = H5S_UNLIMITED; //extendable.
0088 file_space = ::H5Screate_simple(1,dims,mx_dims);
0089 } else {
0090 file_space = ::H5Screate_simple(1,dims,NULL);
0091 }
0092 if(file_space<0) {if(cpt>=0) ::H5Pclose(cpt);return false;}
0093 dataset = toolx_H5Dcreate(a_loc,a_name.c_str(),a_file_type,file_space,cpt);
0094 if(cpt>=0) ::H5Pclose(cpt);
0095 ::H5Sclose(file_space);
0096 if(dataset<0) return false;}
0097
0098 if(H5Dwrite(dataset,a_mem_type,H5S_ALL,H5S_ALL,H5P_DEFAULT,a_array)<0) {
0099 ::H5Dclose(dataset);
0100 return false;
0101 }
0102 ::H5Dclose(dataset);
0103
0104 return true;
0105 }
0106
0107 template <class T>
0108 inline bool write_vlen(hid_t a_loc,const std::string& a_name,
0109 hid_t a_file_type,hid_t a_mem_type,
0110 unsigned int a_chunked,unsigned int a_compress,
0111 unsigned int a_size,const T a_array[]) {
0112 hid_t cpt = -1;
0113 if(a_compress || a_chunked) {
0114 cpt = ::H5Pcreate(H5P_DATASET_CREATE);
0115 if(cpt<0) return false;
0116 if(a_chunked) {
0117 if(H5Pset_layout(cpt,H5D_CHUNKED)<0) {
0118 ::H5Pclose(cpt);
0119 return false;
0120 }
0121 hsize_t cdims[1];
0122 cdims[0] = a_chunked;
0123 if(H5Pset_chunk(cpt,1,cdims)<0) {
0124 ::H5Pclose(cpt);
0125 return false;
0126 }
0127 } else {
0128 if(H5Pset_layout(cpt,H5D_COMPACT)<0) {
0129 ::H5Pclose(cpt);
0130 return false;
0131 }
0132 }
0133 if(a_compress) {
0134 if(H5Pset_deflate(cpt,a_compress>9?9:a_compress)<0) {
0135 ::H5Pclose(cpt);
0136 return false;
0137 }
0138 }
0139 } else {
0140 cpt = H5P_DEFAULT;
0141 }
0142
0143 hid_t dataset = -1;
0144
0145 {hsize_t dims[1];
0146 dims[0] = 1;
0147 hid_t file_space = -1;
0148 if(a_chunked) {
0149 hsize_t mx_dims[1];
0150 mx_dims[0] = H5S_UNLIMITED; //extendable.
0151 file_space = ::H5Screate_simple(1,dims,mx_dims);
0152 } else {
0153 file_space = ::H5Screate_simple(1,dims,NULL);
0154 }
0155 if(file_space<0) {if(cpt>=0) ::H5Pclose(cpt);return false;}
0156
0157 hid_t file_type = ::H5Tvlen_create(a_file_type);
0158
0159 dataset = toolx_H5Dcreate(a_loc,a_name.c_str(),file_type,file_space,cpt);
0160 if(cpt>=0) ::H5Pclose(cpt);
0161 ::H5Sclose(file_space);
0162 ::H5Tclose(file_type);
0163 if(dataset<0) return false;}
0164
0165 hid_t mem_type = ::H5Tvlen_create(a_mem_type);
0166
0167 hvl_t wdata[1];
0168 wdata[0].len = a_size;
0169 wdata[0].p = (void*)a_array;
0170
0171 if(H5Dwrite(dataset,mem_type,H5S_ALL,H5S_ALL,H5P_DEFAULT,wdata)<0) {
0172 ::H5Tclose(mem_type);
0173 ::H5Dclose(dataset);
0174 return false;
0175 }
0176 ::H5Tclose(mem_type);
0177 ::H5Dclose(dataset);
0178
0179 return true;
0180 }
0181
0182 template <class T>
0183 inline bool write_sub_array(hid_t a_loc,const std::string& a_name,
0184 hid_t a_file_type,hid_t a_mem_type,
0185 bool a_create,
0186 unsigned int a_chunked,unsigned int a_compress, // used if a_creat = true;
0187 unsigned int a_size,
0188 unsigned int a_offset,unsigned int a_number,const T a_array[]) {
0189
0190 int remain = a_size-a_offset;
0191 int number = (int(a_number)<=remain) ? int(a_number) : remain;
0192 if(number<=0) return false;
0193
0194 hid_t cpt = -1;
0195
0196 if(a_create) {
0197 if(a_compress || a_chunked) {
0198 cpt = ::H5Pcreate(H5P_DATASET_CREATE);
0199 if(cpt<0) return false;
0200 if(a_chunked) {
0201 if(H5Pset_layout(cpt,H5D_CHUNKED)<0) {
0202 ::H5Pclose(cpt);
0203 return false;
0204 }
0205 hsize_t cdims[1];
0206 cdims[0] = a_chunked;
0207 if(H5Pset_chunk(cpt,1,cdims)<0) {
0208 ::H5Pclose(cpt);
0209 return false;
0210 }
0211 } else {
0212 if(H5Pset_layout(cpt,H5D_COMPACT)<0) {
0213 ::H5Pclose(cpt);
0214 return false;
0215 }
0216 }
0217 if(a_compress) {
0218 if(H5Pset_deflate(cpt,a_compress>9?9:a_compress)<0) {
0219 ::H5Pclose(cpt);
0220 return false;
0221 }
0222 }
0223 } else {
0224 cpt = H5P_DEFAULT;
0225 }
0226 }
0227
0228 hid_t dataset = -1;
0229
0230 hid_t file_space = -1;
0231
0232 if(a_create) {
0233 hsize_t dims[1];
0234 dims[0] = a_size;
0235 file_space = ::H5Screate_simple(1,dims,NULL);
0236 if(file_space<0) {
0237 if(cpt>=0) ::H5Pclose(cpt);
0238 return false;
0239 }
0240
0241 {hsize_t offset[1];
0242 offset[0] = a_offset;
0243 hsize_t count[1];
0244 count[0] = number;
0245 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0246 ::H5Sclose(file_space);
0247 if(cpt>=0) ::H5Pclose(cpt);
0248 return false;
0249 }}
0250
0251 dataset = toolx_H5Dcreate(a_loc,a_name.c_str(),a_file_type,file_space,cpt);
0252 if(dataset<0) {
0253 ::H5Sclose(file_space);
0254 if(cpt>=0) ::H5Pclose(cpt);
0255 return false;
0256 }
0257
0258 } else { //open an existing dataset :
0259 dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0260 if(dataset<0) {
0261 if(cpt>=0) ::H5Pclose(cpt);
0262 return false;
0263 }
0264
0265 file_space = H5Dget_space(dataset);
0266 if(file_space<0) {
0267 ::H5Dclose(dataset);
0268 if(cpt>=0) ::H5Pclose(cpt);
0269 return false;
0270 }
0271
0272 {hsize_t offset[1];
0273 offset[0] = a_offset;
0274 hsize_t count[1];
0275 count[0] = number;
0276 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0277 ::H5Sclose(file_space);
0278 ::H5Dclose(dataset);
0279 if(cpt>=0) ::H5Pclose(cpt);
0280 return false;
0281 }}
0282
0283 }
0284
0285 hsize_t dims[1];
0286 dims[0] = number;
0287 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0288 if(mem_space<0) {
0289 ::H5Sclose(file_space);
0290 ::H5Dclose(dataset);
0291 if(cpt>=0) ::H5Pclose(cpt);
0292 return false;
0293 }
0294
0295 if(H5Dwrite(dataset,a_mem_type,mem_space,file_space,H5P_DEFAULT,a_array)<0) {
0296 ::H5Sclose(file_space);
0297 ::H5Dclose(dataset);
0298 if(cpt>=0) ::H5Pclose(cpt);
0299 return false;
0300 }
0301
0302 ::H5Sclose(file_space);
0303 ::H5Dclose(dataset);
0304 if(cpt>=0) ::H5Pclose(cpt);
0305
0306 return true;
0307 }
0308
0309 template <class T>
0310 inline bool write_append_array_dataset(hid_t a_dataset,hid_t /*a_file_type*/,hid_t a_mem_type,
0311 unsigned int a_number,const T a_array[]) {
0312 hsize_t old_size = 0;
0313
0314 {hid_t dataspace = H5Dget_space(a_dataset);
0315 if(dataspace<0) return false;
0316 hsize_t dims[1];
0317 if(H5Sget_simple_extent_dims(dataspace,dims,NULL)<0) {
0318 ::H5Sclose(dataspace);
0319 return false;
0320 }
0321 old_size = dims[0];
0322 ::H5Sclose(dataspace);}
0323
0324 {hsize_t exts[1];
0325 exts[0] = old_size+a_number;
0326 if(H5Dset_extent(a_dataset,exts)<0) return false;}
0327
0328 hid_t file_space = H5Dget_space(a_dataset);
0329 if(file_space<0) return false;
0330
0331 {hsize_t offset[1];
0332 offset[0] = old_size;
0333 hsize_t count[1];
0334 count[0] = a_number;
0335 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0336 ::H5Sclose(file_space);
0337 return false;
0338 }}
0339
0340 hsize_t dims[1];
0341 dims[0] = a_number;
0342 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0343 if(mem_space<0) {
0344 ::H5Sclose(file_space);
0345 return false;
0346 }
0347
0348 if(H5Dwrite(a_dataset,a_mem_type,mem_space,file_space,H5P_DEFAULT,a_array)<0) {
0349 ::H5Sclose(mem_space);
0350 ::H5Sclose(file_space);
0351 return false;
0352 }
0353
0354 ::H5Sclose(mem_space);
0355 ::H5Sclose(file_space);
0356
0357 return true;
0358 }
0359
0360 template <class T>
0361 inline bool write_append_vlen_dataset(hid_t a_dataset,hid_t /*a_file_type*/,hid_t a_mem_type,
0362 unsigned int a_number,const T a_array[]) {
0363 hsize_t old_size = 0;
0364
0365 {hid_t dataspace = H5Dget_space(a_dataset);
0366 if(dataspace<0) return false;
0367 hsize_t dims[1];
0368 if(H5Sget_simple_extent_dims(dataspace,dims,NULL)<0) {
0369 ::H5Sclose(dataspace);
0370 return false;
0371 }
0372 old_size = dims[0];
0373 ::H5Sclose(dataspace);}
0374
0375 {hsize_t exts[1];
0376 exts[0] = old_size+1;
0377 if(H5Dset_extent(a_dataset,exts)<0) return false;}
0378
0379 hid_t file_space = H5Dget_space(a_dataset);
0380 if(file_space<0) return false;
0381
0382 {hsize_t offset[1];
0383 offset[0] = old_size;
0384 hsize_t count[1];
0385 count[0] = 1;
0386 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0387 ::H5Sclose(file_space);
0388 return false;
0389 }}
0390
0391 hsize_t dims[1];
0392 dims[0] = 1;
0393 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0394 if(mem_space<0) {
0395 ::H5Sclose(file_space);
0396 return false;
0397 }
0398
0399 hid_t mem_type = ::H5Tvlen_create(a_mem_type);
0400
0401 hvl_t wdata[1];
0402 wdata[0].len = a_number;
0403 wdata[0].p = (void*)a_array;
0404
0405 if(H5Dwrite(a_dataset,mem_type,mem_space,file_space,H5P_DEFAULT,wdata)<0) {
0406 ::H5Tclose(mem_type);
0407 ::H5Sclose(mem_space);
0408 ::H5Sclose(file_space);
0409 return false;
0410 }
0411
0412 ::H5Tclose(mem_type);
0413 ::H5Sclose(mem_space);
0414 ::H5Sclose(file_space);
0415
0416 return true;
0417 }
0418
0419 template <class T>
0420 inline bool write_append_array(hid_t a_loc,const std::string& a_name,hid_t a_file_type,hid_t a_mem_type,
0421 unsigned int a_number,const T a_array[]) {
0422 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0423 if(dataset<0) return false;
0424 bool status = write_append_array_dataset(dataset,a_file_type,a_mem_type,a_number,a_array);
0425 ::H5Dclose(dataset);
0426 return status;
0427 }
0428
0429 template <class T>
0430 inline bool read_scalar(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,T& a_data) {
0431 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0432 if(dataset<0) return false;
0433
0434 hid_t file_space = H5Dget_space(dataset);
0435 if(file_space<0) {
0436 ::H5Dclose(dataset);
0437 return false;
0438 }
0439
0440 hid_t mem_space = ::H5Screate(H5S_SCALAR);
0441 if(mem_space<0) {
0442 ::H5Sclose(file_space);
0443 ::H5Dclose(dataset);
0444 return false;
0445 }
0446
0447 if(H5Dread(dataset,a_mem_type,mem_space,file_space,H5P_DEFAULT,&a_data)<0) {
0448 ::H5Sclose(mem_space);
0449 ::H5Sclose(file_space);
0450 ::H5Dclose(dataset);
0451 return false;
0452 }
0453
0454 ::H5Sclose(mem_space);
0455 ::H5Sclose(file_space);
0456 ::H5Dclose(dataset);
0457
0458 return true;
0459 }
0460
0461 template <class T>
0462 inline bool read_array(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,unsigned int& a_size,T*& a_array,bool a_alloc = true) {
0463 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0464 if(dataset<0) {
0465 a_size = 0;
0466 if(a_alloc) a_array = 0;
0467 return false; // data set not found.
0468 }
0469
0470 hid_t file_space = H5Dget_space(dataset);
0471 if(file_space<0) {
0472 ::H5Dclose(dataset);
0473 a_size = 0;
0474 if(a_alloc) a_array = 0;
0475 return false;
0476 }
0477
0478 {int dimn = H5Sget_simple_extent_ndims(file_space);
0479 if(dimn<0) {
0480 ::H5Sclose(file_space);
0481 ::H5Dclose(dataset);
0482 a_size = 0;
0483 if(a_alloc) a_array = 0;
0484 return false;
0485 }
0486 if(dimn!=1) {
0487 ::H5Sclose(file_space);
0488 ::H5Dclose(dataset);
0489 a_size = 0;
0490 if(a_alloc) a_array = 0;
0491 return false;
0492 }
0493 }
0494
0495 hsize_t dims[1];
0496 {if(H5Sget_simple_extent_dims(file_space,dims,NULL)<0) {
0497 ::H5Sclose(file_space);
0498 ::H5Dclose(dataset);
0499 a_size = 0;
0500 if(a_alloc) a_array = 0;
0501 return false;
0502 }}
0503
0504 a_size = (unsigned int)dims[0];
0505 if(!a_size) {
0506 ::H5Sclose(file_space);
0507 ::H5Dclose(dataset);
0508 a_size = 0;
0509 if(a_alloc) a_array = 0;
0510 return true; //It is ok.
0511 }
0512
0513 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0514 if(mem_space<0) {
0515 ::H5Sclose(file_space);
0516 ::H5Dclose(dataset);
0517 a_size = 0;
0518 if(a_alloc) a_array = 0;
0519 return false;
0520 }
0521
0522 if(a_alloc) a_array = new T[a_size];
0523 if(H5Dread(dataset,a_mem_type,mem_space,file_space,H5P_DEFAULT,a_array)<0) {
0524 if(a_alloc) delete [] a_array;
0525 ::H5Sclose(mem_space);
0526 ::H5Sclose(file_space);
0527 ::H5Dclose(dataset);
0528 a_size = 0;
0529 if(a_alloc) a_array = 0;
0530 return false;
0531 }
0532
0533
0534 ::H5Sclose(mem_space);
0535 ::H5Sclose(file_space);
0536 ::H5Dclose(dataset);
0537
0538 return true;
0539 }
0540
0541 template <class T>
0542 inline bool read_sub_array(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,
0543 unsigned int a_offset,unsigned int a_number,
0544 unsigned int& a_size,T*& a_array) {
0545 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0546 if(dataset<0) {
0547 a_size = 0;
0548 a_array = 0;
0549 return false; // data set not found.
0550 }
0551
0552 hid_t file_space = H5Dget_space(dataset);
0553 if(file_space<0) {
0554 ::H5Dclose(dataset);
0555 a_size = 0;
0556 a_array = 0;
0557 return false;
0558 }
0559
0560 {int dimn = H5Sget_simple_extent_ndims(file_space);
0561 if(dimn<0) {
0562 ::H5Sclose(file_space);
0563 ::H5Dclose(dataset);
0564 a_size = 0;
0565 a_array = 0;
0566 return false;
0567 }
0568 if(dimn!=1) {
0569 ::H5Sclose(file_space);
0570 ::H5Dclose(dataset);
0571 a_size = 0;
0572 a_array = 0;
0573 return false;
0574 }
0575 }
0576
0577 hsize_t dims[1];
0578 {if(H5Sget_simple_extent_dims(file_space,dims,NULL)<0) {
0579 ::H5Sclose(file_space);
0580 ::H5Dclose(dataset);
0581 a_size = 0;
0582 a_array = 0;
0583 return false;
0584 }}
0585
0586 unsigned int sz = (unsigned int)dims[0];
0587 if(!sz) {
0588 ::H5Sclose(file_space);
0589 ::H5Dclose(dataset);
0590 a_size = 0;
0591 a_array = 0;
0592 return true; //It is ok.
0593 }
0594
0595 // abcdef
0596 // 012345
0597 int remain = sz-a_offset;
0598 if(remain<=0) {
0599 ::H5Sclose(file_space);
0600 ::H5Dclose(dataset);
0601 a_size = 0;
0602 a_array = 0;
0603 return a_number?false:true;
0604 }
0605
0606 int number = (int(a_number)<=remain) ? int(a_number) : remain;
0607 if(number<=0) {
0608 ::H5Sclose(file_space);
0609 ::H5Dclose(dataset);
0610 a_size = 0;
0611 a_array = 0;
0612 return true; //It is ok.
0613 }
0614
0615 {hsize_t offset[1];
0616 offset[0] = a_offset;
0617 hsize_t count[1];
0618 count[0] = number;
0619 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0620 ::H5Sclose(file_space);
0621 ::H5Dclose(dataset);
0622 a_size = 0;
0623 a_array = 0;
0624 return false;
0625 }}
0626
0627 dims[0] = number;
0628 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0629 if(mem_space<0) {
0630 ::H5Sclose(file_space);
0631 ::H5Dclose(dataset);
0632 a_size = 0;
0633 a_array = 0;
0634 return false;
0635 }
0636
0637 a_array = new T[number];
0638 if(H5Dread(dataset,a_mem_type,mem_space,file_space,H5P_DEFAULT,a_array)<0) {
0639 delete [] a_array;
0640 ::H5Sclose(mem_space);
0641 ::H5Sclose(file_space);
0642 ::H5Dclose(dataset);
0643 a_array = 0;
0644 return false;
0645 }
0646
0647 ::H5Sclose(mem_space);
0648 ::H5Sclose(file_space);
0649 ::H5Dclose(dataset);
0650
0651 a_size = number;
0652
0653 return true;
0654 }
0655
0656 template <class T>
0657 inline bool read_sub_vlen(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,
0658 unsigned int a_offset,
0659 unsigned int& a_size,T*& a_array) {
0660 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0661 if(dataset<0) {
0662 a_size = 0;
0663 a_array = 0;
0664 return false; // data set not found.
0665 }
0666
0667 hid_t file_space = H5Dget_space(dataset);
0668 if(file_space<0) {
0669 ::H5Dclose(dataset);
0670 a_size = 0;
0671 a_array = 0;
0672 return false;
0673 }
0674
0675 {int dimn = H5Sget_simple_extent_ndims(file_space);
0676 if(dimn<0) {
0677 ::H5Sclose(file_space);
0678 ::H5Dclose(dataset);
0679 a_size = 0;
0680 a_array = 0;
0681 return false;
0682 }
0683 if(dimn!=1) {
0684 ::H5Sclose(file_space);
0685 ::H5Dclose(dataset);
0686 a_size = 0;
0687 a_array = 0;
0688 return false;
0689 }
0690 }
0691
0692 hsize_t dims[1];
0693 {if(H5Sget_simple_extent_dims(file_space,dims,NULL)<0) {
0694 ::H5Sclose(file_space);
0695 ::H5Dclose(dataset);
0696 a_size = 0;
0697 a_array = 0;
0698 return false;
0699 }}
0700
0701 unsigned int sz = (unsigned int)dims[0];
0702 if(!sz) {
0703 ::H5Sclose(file_space);
0704 ::H5Dclose(dataset);
0705 a_size = 0;
0706 a_array = 0;
0707 return true; //It is ok.
0708 }
0709
0710 // abcdef
0711 // 012345
0712 int remain = sz-a_offset;
0713 if(remain<=0) {
0714 ::H5Sclose(file_space);
0715 ::H5Dclose(dataset);
0716 a_size = 0;
0717 a_array = 0;
0718 return false;
0719 }
0720
0721 {hsize_t offset[1];
0722 offset[0] = a_offset;
0723 hsize_t count[1];
0724 count[0] = 1;
0725 if(H5Sselect_hyperslab(file_space,H5S_SELECT_SET,offset,NULL,count,NULL)<0) {
0726 ::H5Sclose(file_space);
0727 ::H5Dclose(dataset);
0728 a_size = 0;
0729 a_array = 0;
0730 return false;
0731 }}
0732
0733 dims[0] = 1;
0734 hid_t mem_space = ::H5Screate_simple(1,dims,NULL);
0735 if(mem_space<0) {
0736 ::H5Sclose(file_space);
0737 ::H5Dclose(dataset);
0738 a_size = 0;
0739 a_array = 0;
0740 return false;
0741 }
0742
0743 hid_t mem_type = ::H5Tvlen_create(a_mem_type);
0744
0745 hvl_t rdata[1];
0746 if(H5Dread(dataset,mem_type,mem_space,file_space,H5P_DEFAULT,rdata)<0) {
0747 ::H5Tclose(mem_type);
0748 ::H5Sclose(mem_space);
0749 ::H5Sclose(file_space);
0750 ::H5Dclose(dataset);
0751 a_size = 0;
0752 a_array = 0;
0753 return false;
0754 }
0755
0756 hsize_t len = rdata[0].len;
0757 if(!len) {
0758 a_array = 0; //it is ok.
0759 } else {
0760 a_array = new T[len];
0761 T* _data = (T*)rdata[0].p;
0762 T* pos = a_array;
0763 for(hsize_t index=0;index<len;index++,pos++,_data++) *pos = *_data;
0764 }
0765 a_size = len;
0766
0767 ::H5Dvlen_reclaim(mem_type,mem_space,H5P_DEFAULT,rdata);
0768
0769 ::H5Tclose(mem_type);
0770 ::H5Sclose(mem_space);
0771 ::H5Sclose(file_space);
0772 ::H5Dclose(dataset);
0773
0774 return true;
0775 }
0776
0777 template <class TYPE>
0778 inline bool read_scalar(hid_t a_loc,const std::string& a_name,TYPE& aValue) {
0779 return read_scalar<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),aValue);
0780 }
0781
0782 template <class T>
0783 inline bool read_std_vec(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,std::vector<T>& a_vec) {
0784 tools::uint64 sz;
0785 if(!read_scalar<tools::uint64>(a_loc,a_name+"_size",sz)) return false;
0786 if(!sz) {a_vec.clear();return true;} //it is ok.
0787 a_vec.resize((size_t)sz);
0788 T* data = a_vec.data();
0789 unsigned int _sz;
0790 if(!read_array(a_loc,a_name,a_mem_type,_sz,data,false)) return false; //false = do not alloc.
0791 if(tools::uint64(_sz)!=sz) {a_vec.clear();return false;}
0792 return true;
0793 }
0794
0795 template <class TYPE>
0796 inline bool read_std_vec_vec(hid_t a_loc,const std::string& a_name,hid_t a_mem_type,std::vector< std::vector<TYPE> >& a_vec_vec) {
0797 tools::uint64 sz;
0798 if(!read_scalar<tools::uint64>(a_loc,a_name+"_size",sz)) {a_vec_vec.clear();return false;}
0799 a_vec_vec.resize((size_t)sz);
0800 std::string scount;
0801 for(size_t count=0;count<(size_t)sz;count++) {
0802 tools::num2s(tools::uint64(count),scount);
0803 if(!read_std_vec<TYPE>(a_loc,a_name+"_elem_"+scount,a_mem_type,a_vec_vec[count])) {a_vec_vec.clear();return false;}
0804 }
0805 return true;
0806 }
0807
0808 template <class T>
0809 inline bool read_struct(hid_t a_loc,const std::string& a_name,hid_t aReadType,T& a_data) {
0810 hid_t dataset = toolx_H5Dopen(a_loc,a_name.c_str());
0811 if(dataset<0) return false;
0812
0813 hid_t file_space = H5Dget_space(dataset);
0814 if(file_space<0) {
0815 ::H5Dclose(dataset);
0816 return false;
0817 }
0818
0819 hid_t mem_space = ::H5Screate(H5S_SCALAR);
0820 if(mem_space<0) {
0821 ::H5Sclose(file_space);
0822 ::H5Dclose(dataset);
0823 return false;
0824 }
0825
0826 if(H5Dread(dataset,aReadType,mem_space,file_space,H5P_DEFAULT,&a_data)<0) {
0827 ::H5Sclose(mem_space);
0828 ::H5Sclose(file_space);
0829 ::H5Dclose(dataset);
0830 return false;
0831 }
0832
0833 ::H5Sclose(mem_space);
0834 ::H5Sclose(file_space);
0835 ::H5Dclose(dataset);
0836 return true;
0837 }
0838
0839 template <class TYPE>
0840 inline bool write_scalar(hid_t a_loc,const std::string& a_name,const TYPE& aData) {
0841 hid_t scalar = ::H5Screate(H5S_SCALAR);
0842 if(scalar<0) return false;
0843
0844 hid_t compact = ::H5Pcreate(H5P_DATASET_CREATE);
0845 if(compact<0) {
0846 ::H5Sclose(scalar);
0847 return false;
0848 }
0849
0850 if(H5Pset_layout(compact,H5D_COMPACT)<0) {
0851 ::H5Pclose(compact);
0852 ::H5Sclose(scalar);
0853 return false;
0854 }
0855
0856 hid_t dataset = toolx_H5Dcreate(a_loc,a_name.c_str(),to_T_file_type(TYPE()),scalar,compact);
0857 if(dataset<0) {
0858 ::H5Pclose(compact);
0859 ::H5Sclose(scalar);
0860 return false;
0861 }
0862
0863 if(::H5Dwrite(dataset,to_T_mem_type(TYPE()),H5S_ALL,H5S_ALL,H5P_DEFAULT,&aData)<0) {
0864 ::H5Pclose(compact);
0865 ::H5Sclose(scalar);
0866 ::H5Dclose(dataset);
0867 return false;
0868 }
0869
0870 ::H5Pclose(compact);
0871 ::H5Sclose(scalar);
0872 ::H5Dclose(dataset);
0873 return true;
0874 }
0875
0876 template <class T>
0877 inline bool write_struct(hid_t a_loc,const std::string& a_name,
0878 hid_t a_create_type,hid_t aWriteType,const T& aData) {
0879 hid_t scalar = ::H5Screate(H5S_SCALAR);
0880 if(scalar<0) return false;
0881
0882 hid_t compact = ::H5Pcreate(H5P_DATASET_CREATE);
0883 if(compact<0) {
0884 ::H5Sclose(scalar);
0885 return false;
0886 }
0887
0888 if(H5Pset_layout(compact,H5D_COMPACT)<0) {
0889 ::H5Pclose(compact);
0890 ::H5Sclose(scalar);
0891 return false;
0892 }
0893
0894 hid_t dataset = toolx_H5Dcreate(a_loc,a_name.c_str(),a_create_type,scalar,compact);
0895 if(dataset<0) {
0896 ::H5Pclose(compact);
0897 ::H5Sclose(scalar);
0898 return false;
0899 }
0900
0901 if(H5Dwrite(dataset,aWriteType,H5S_ALL,H5S_ALL,H5P_DEFAULT,&aData)<0) {
0902 ::H5Pclose(compact);
0903 ::H5Sclose(scalar);
0904 ::H5Dclose(dataset);
0905 return false;
0906 }
0907
0908 ::H5Pclose(compact);
0909 ::H5Sclose(scalar);
0910 ::H5Dclose(dataset);
0911 return true;
0912 }
0913
0914 //////////////////////////////////////////////////////////////////////////////
0915 //////////////////////////////////////////////////////////////////////////////
0916 //////////////////////////////////////////////////////////////////////////////
0917 template <class TYPE>
0918 inline bool write_array(hid_t a_loc,const std::string& a_name,
0919 unsigned int a_size,const TYPE a_array[],
0920 unsigned int a_chunked = 0,unsigned int a_compress = 0) {
0921 return hdf5::write_array<TYPE>(a_loc,a_name,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),
0922 a_chunked,a_compress,a_size,a_array);
0923 }
0924
0925 template <class TYPE>
0926 inline bool write_vlen(hid_t a_loc,const std::string& a_name,
0927 unsigned int a_size,const TYPE a_array[],
0928 unsigned int a_chunked = 0,unsigned int a_compress = 0) {
0929 return hdf5::write_vlen<TYPE>(a_loc,a_name,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),
0930 a_chunked,a_compress,a_size,a_array);
0931 }
0932
0933 template <class T>
0934 inline bool write_std_vec(hid_t a_loc,const std::string& a_name,
0935 hid_t a_file_type,hid_t a_mem_type,
0936 unsigned int a_chunked,unsigned int a_compress,
0937 const std::vector<T>& a_vec) {
0938 if(!write_scalar<tools::uint64>(a_loc,a_name+"_size",a_vec.size())) return false;
0939 if(a_vec.empty()) return true; //it is ok.
0940 const T* data = a_vec.data();
0941 return write_array(a_loc,a_name,a_file_type,a_mem_type,a_chunked,a_compress,a_vec.size(),data);
0942 }
0943
0944 template <class TYPE>
0945 inline bool write_std_vec(hid_t a_loc,const std::string& a_name,const std::vector<TYPE>& a_array,
0946 unsigned int a_chunked = 0,unsigned int a_compress = 0) {
0947 return hdf5::write_std_vec<TYPE>(a_loc,a_name,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),a_chunked,a_compress,a_array);
0948 }
0949
0950 template <class TYPE>
0951 inline bool write_std_vec_vec(hid_t a_loc,const std::string& a_name,const std::vector< std::vector<TYPE> >& a_vec_vec,
0952 unsigned int /*a_chunked*/ = 0,unsigned int /*a_compress*/ = 0) {
0953 if(!write_scalar<tools::uint64>(a_loc,a_name+"_size",a_vec_vec.size())) return false;
0954 unsigned int count = 0; //uint for num2s.
0955 std::string scount;
0956 for(auto it = a_vec_vec.cbegin(); it != a_vec_vec.cend(); ++it) {
0957 tools::num2s(count,scount);
0958 if(!write_std_vec<TYPE>(a_loc,a_name+"_elem_"+scount,*it)) return false;
0959 count++;
0960 }
0961 return true;
0962 }
0963
0964 template <class TYPE>
0965 inline bool write_sub_array(hid_t a_loc,const std::string& a_name,
0966 unsigned int a_size,unsigned int a_offset,unsigned int a_number,const TYPE a_array[],
0967 bool a_create = true,unsigned int a_chunked = 0,unsigned int a_compress = 0) {
0968 return hdf5::write_sub_array<TYPE>(a_loc,a_name,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),
0969 a_create,a_chunked,a_compress,
0970 a_size,a_offset,a_number,a_array);
0971 }
0972
0973 template <class TYPE>
0974 inline bool write_append_array_dataset(hid_t a_dataset,unsigned int a_number,const TYPE a_array[]) {
0975 return hdf5::write_append_array_dataset<TYPE>(a_dataset,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),a_number,a_array);
0976 }
0977
0978 template <class TYPE>
0979 inline bool write_append_vlen_dataset(hid_t a_dataset,unsigned int a_number,const TYPE a_array[]) {
0980 return hdf5::write_append_vlen_dataset<TYPE>(a_dataset,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),a_number,a_array);
0981 }
0982
0983 template <class TYPE>
0984 inline bool write_append_array(hid_t a_loc,const std::string& a_name,unsigned int a_number,const TYPE a_array[]) {
0985 return hdf5::write_append_array<TYPE>(a_loc,a_name,to_T_file_type(TYPE()),to_T_mem_type(TYPE()),a_number,a_array);
0986 }
0987
0988 template <class TYPE>
0989 inline bool read_array(hid_t a_loc,const std::string& a_name,unsigned int& a_size,TYPE*& a_array) {
0990 return read_array<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),a_size,a_array);
0991 }
0992
0993 template <class TYPE>
0994 inline bool read_std_vec(hid_t a_loc,const std::string& a_name,std::vector<TYPE>& a_vec) {
0995 return read_std_vec<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),a_vec);
0996 }
0997
0998 template <class TYPE>
0999 inline bool read_std_vec_vec(hid_t a_loc,const std::string& a_name,std::vector< std::vector<TYPE> >& a_vec_vec) {
1000 return read_std_vec_vec<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),a_vec_vec);
1001 }
1002
1003 template <class TYPE>
1004 inline bool read_sub_array(hid_t a_loc,const std::string& a_name,unsigned int a_offset,unsigned int a_number,
1005 unsigned int& a_size,TYPE*& a_array) {
1006 return read_sub_array<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),a_offset,a_number,a_size,a_array);
1007 }
1008
1009 template <class TYPE>
1010 inline bool read_sub_vlen(hid_t a_loc,const std::string& a_name,unsigned int a_offset,
1011 unsigned int& a_size,TYPE*& a_array) {
1012 return read_sub_vlen<TYPE>(a_loc,a_name,to_T_mem_type(TYPE()),a_offset,a_size,a_array);
1013 }
1014
1015 inline bool read_bool(hid_t a_loc,const std::string& a_name,bool& aValue) {
1016 unsigned char value = 0;
1017 if(!read_scalar<unsigned char>(a_loc,a_name,H5T_NATIVE_UCHAR,value)) {
1018 aValue = false;
1019 return false;
1020 }
1021 if((value!=0) && (value!=1)) {
1022 aValue = false;
1023 return false;
1024 }
1025 aValue = (value==1?true:false);
1026 return true;
1027 }
1028
1029 }}
1030
1031 #include "atb"
1032
1033 namespace toolx {
1034 namespace hdf5 {
1035
1036 template <class TYPE>
1037 inline bool write_scalar_atb(hid_t aDS,const std::string& a_name,const TYPE& aData) {
1038 int has_attr = H5LT_find_attribute(aDS,a_name.c_str());
1039 if(has_attr==1) {
1040 if(H5Adelete(aDS,a_name.c_str())<0) return false;
1041 }
1042
1043 hid_t scalar = ::H5Screate(H5S_SCALAR);
1044 if(scalar<0) return false;
1045
1046 hid_t aid = toolx_H5Acreate(aDS,a_name.c_str(),to_T_file_type(TYPE()),scalar,H5P_DEFAULT);
1047 if(aid<0) {
1048 ::H5Sclose(scalar);
1049 return false;
1050 }
1051
1052 if(H5Awrite(aid,to_T_mem_type(TYPE()),&aData)<0) {
1053 ::H5Sclose(scalar);
1054 ::H5Aclose(aid);
1055 return false;
1056 }
1057
1058 ::H5Sclose(scalar);
1059 ::H5Aclose(aid);
1060
1061 return true;
1062 }
1063
1064 }}
1065
1066 #endif