Back to home page

EIC code displayed by LXR

 
 

    


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