1 #include "h5utils.h"
2 
3 // allocate a contiguous block of memory, dependent on the largest string
vec_to_ptr(const std::vector<std::string> & v)4 char* vec_to_ptr(const std::vector<std::string>& v) {
5   size_t max_len = 0;
6   for (auto& x : v) {
7     if (x.size() > max_len) {
8       max_len = x.size();
9     }
10   }
11   // account for 0 terminator
12   max_len += 1;
13   // allocate a contiguous block of memory
14   char *pool = new char[max_len * v.size()];
15   memset(pool,0,max_len * v.size());
16   char *ptr = pool;
17 
18   for (size_t i = 0; i < v.size(); ++i, ptr += max_len) {
19     strcpy(ptr, v[i].c_str());
20   }
21 
22   return pool;
23 }
24 
vec_to_ptr(const std::vector<double> & v)25 const double* vec_to_ptr(const std::vector<double>& v) {
26   return v.data();
27 }
28 
vec_to_ptr(const std::vector<int> & v)29 const int* vec_to_ptr(const std::vector<int>& v) {
30   return v.data();
31 }
32 
get_datatype_id(const std::vector<std::string> & v)33 hid_t get_datatype_id(const std::vector<std::string>& v) {
34   size_t max_len = 0;
35   for (auto& x : v) {
36     if (x.size() > max_len) {
37       max_len = x.size();
38     }
39   }
40 
41   // account for 0 terminator
42   max_len += 1;
43 
44   hid_t datatype_id = H5Tcopy (H5T_C_S1);
45   /* herr_t status = H5Tset_size (datatype_id, H5T_VARIABLE); */
46   /* assert( status >= 0 ); */
47   herr_t status = H5Tset_size (datatype_id, max_len);
48   assert( status >= 0 );
49 
50   return datatype_id;
51 }
52 
get_datatype_id(const std::vector<double> & v)53 hid_t get_datatype_id(const std::vector<double>& v) {
54   v.size(); // shutup, compiler
55   return H5T_NATIVE_DOUBLE;
56 }
57 
get_datatype_id(const std::vector<int> & v)58 hid_t get_datatype_id(const std::vector<int>& v) {
59   v.size(); // shutup, compiler
60   return H5T_NATIVE_INT;
61 }
62 
read_vector(hid_t dataset_id,hid_t datatype_id,hid_t dataspace_id,std::vector<std::string> & out)63 void read_vector(
64     hid_t dataset_id,
65     hid_t datatype_id,
66     hid_t dataspace_id,
67     std::vector<std::string>& out) {
68 
69   hsize_t size;
70   hsize_t dims[1];
71 
72   H5Sget_simple_extent_dims(dataspace_id, dims, NULL);
73 
74   size = H5Tget_size(datatype_id);
75 
76   char *pool = new char[ size * dims[0] ];
77   char *ptr = pool;
78   char *buf = new char[size];
79 
80   H5Dread(dataset_id, datatype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, pool);
81   out.reserve(dims[0]);
82 
83   for (size_t i = 0; i < dims[0]; ++i, ptr += size) {
84     memcpy(buf, ptr, size);
85     out.push_back( buf );
86   }
87 
88   delete [] pool;
89   delete [] buf;
90 }
91 
read_vector(hid_t dataset_id,hid_t datatype_id,hid_t dataspace_id,std::vector<int> & out)92 void read_vector(
93     hid_t dataset_id,
94     hid_t datatype_id,
95     hid_t dataspace_id,
96     std::vector<int>& out) {
97 
98   hsize_t size;
99   hsize_t dims[1];
100 
101   H5Sget_simple_extent_dims(dataspace_id, dims, NULL);
102 
103   size = H5Tget_size(datatype_id);
104 
105   int *pool = new int[ dims[0] ];
106 
107   H5Dread(dataset_id, datatype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, pool);
108   out.reserve(dims[0]);
109 
110   for (size_t i = 0; i < dims[0]; ++i) {
111     out.push_back( pool[i] );
112   }
113 
114   delete [] pool;
115 }
116 
read_vector(hid_t dataset_id,hid_t datatype_id,hid_t dataspace_id,std::vector<double> & out)117 void read_vector(
118     hid_t dataset_id,
119     hid_t datatype_id,
120     hid_t dataspace_id,
121     std::vector<double>& out) {
122 
123   hsize_t size;
124   hsize_t dims[1];
125 
126   H5Sget_simple_extent_dims(dataspace_id, dims, NULL);
127 
128   size = H5Tget_size(datatype_id);
129 
130   double *pool = new double[ dims[0] ];
131 
132   H5Dread(dataset_id, datatype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, pool);
133   out.reserve(dims[0]);
134 
135   for (size_t i = 0; i < dims[0]; ++i) {
136     out.push_back( pool[i] );
137   }
138 
139   delete [] pool;
140 }
141