hdf5_read_array now supports array witout resize.

This commit is contained in:
Guilhem Lavaux 2015-02-12 08:50:07 +01:00
parent c853abe354
commit 1ab31e6c19

View File

@ -181,6 +181,48 @@ namespace CosmoTool {
}
};
template<typename Array> class array_has_resize {
struct Fallback { int resize; };
struct Derived: Array, Fallback {};
typedef char yes[1];
typedef char no[2];
template<typename U, U> struct Check;
template<typename U>
static yes& func(Check<int Fallback::*, &U::resize> *);
template<typename U>
static no& func(...);
public:
typedef array_has_resize type;
enum { value = sizeof(func<Derived>(0)) == sizeof(no) };
};
template<typename ArrayType>
typename boost::enable_if<
array_has_resize<ArrayType>
>::type
hdf5_resize_array(ArrayType& data, std::vector<hsize_t>& dims) {
data.resize(
hdf5_extent_gen<ArrayType::dimensionality>::build(dims.data())
);
}
template<typename ArrayType>
typename boost::disable_if<
array_has_resize<ArrayType>
>::type
hdf5_resize_array(ArrayType& data, std::vector<hsize_t>& dims) {
for (long i = 0; i < data.num_dimensions(); i++) {
assert (data.shape()[i] == dims[i]);
}
}
template<typename ArrayType, typename hdf5_data_type>
void hdf5_read_array(H5::CommonFG& fg, const std::string& data_set_name,
ArrayType& data,
@ -196,7 +238,7 @@ namespace CosmoTool {
}
dataspace.getSimpleExtentDims(dimensions.data());
data.resize(hdf5_extent_gen<ArrayType::dimensionality>::build(dimensions.data()));
hdf5_resize_array(data, dimensions);
dataset.read(data.data(), datatype);
}