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