Do not auto-resize if it is not what we want

This commit is contained in:
Guilhem Lavaux 2015-02-15 19:40:14 +01:00
parent 48bdd03947
commit 188af485c9

View File

@ -213,20 +213,27 @@ namespace CosmoTool {
); );
} }
template<typename ArrayType>
void hdf5_check_array(ArrayType& data, std::vector<hsize_t>& dims) {
for (long i = 0; i < data.num_dimensions(); i++) {
if (data.shape()[i] != dims[i]) {
throw InvalidDimensions();
}
}
}
template<typename ArrayType> template<typename ArrayType>
typename boost::disable_if< typename boost::disable_if<
array_has_resize<ArrayType> array_has_resize<ArrayType>
>::type >::type
hdf5_resize_array(ArrayType& data, std::vector<hsize_t>& dims) { hdf5_resize_array(ArrayType& data, std::vector<hsize_t>& dims) {
for (long i = 0; i < data.num_dimensions(); i++) { hdf5_check_array(data, dims);
assert (data.shape()[i] == dims[i]);
}
} }
template<typename ArrayType, typename hdf5_data_type> template<typename ArrayType, typename hdf5_data_type>
void hdf5_read_array(H5::CommonFG& fg, const std::string& data_set_name, void hdf5_read_array_typed(H5::CommonFG& fg, const std::string& data_set_name,
ArrayType& data, ArrayType& data,
const hdf5_data_type& datatype) const hdf5_data_type& datatype, bool auto_resize = true)
{ {
H5::DataSet dataset = fg.openDataSet(data_set_name); H5::DataSet dataset = fg.openDataSet(data_set_name);
H5::DataSpace dataspace = dataset.getSpace(); H5::DataSpace dataspace = dataset.getSpace();
@ -238,17 +245,21 @@ namespace CosmoTool {
} }
dataspace.getSimpleExtentDims(dimensions.data()); dataspace.getSimpleExtentDims(dimensions.data());
hdf5_resize_array(data, dimensions); if (auto_resize)
hdf5_resize_array(data, dimensions);
else
hdf5_check_array(data, dimensions);
dataset.read(data.data(), datatype); dataset.read(data.data(), datatype);
} }
template<typename ArrayType> template<typename ArrayType>
void hdf5_read_array(H5::CommonFG& fg, const std::string& data_set_name, ArrayType& data ) void hdf5_read_array(H5::CommonFG& fg, const std::string& data_set_name, ArrayType& data, bool auto_resize = true )
{ {
typedef typename ArrayType::element T; typedef typename ArrayType::element T;
get_hdf5_data_type<T> hdf_data_type; get_hdf5_data_type<T> hdf_data_type;
hdf5_read_array(fg, data_set_name, data, hdf_data_type.type()); hdf5_read_array_typed(fg, data_set_name, data, hdf_data_type.type(), auto_resize);
} }