typename boost::enable_if<is_multi_array<T>, void>::type read_dataset(dataset & data_set, T & array) { const int array_rank = T::dimensionality; typedef typename T::element value_type; // --- use temporary dataspace object to get the shape of the dataset dataspace file_space(data_set); if (!(file_space.rank() == array_rank)) H5XX_THROW("dataset \"" + get_name(data_set) + "\" and target array have mismatching dimensions"); boost::array<hsize_t, array_rank> file_dims = file_space.extents<array_rank>(); // --- clear array - TODO check if this feature is necessary/wanted boost::array<size_t, array_rank> array_zero; array_zero.assign(0); array.resize(array_zero); // --- resize array to match the dataset - TODO check if this feature is necessary/wanted boost::array<size_t, array_rank> array_shape; std::copy(file_dims.begin(), file_dims.begin() + array_rank, array_shape.begin()); array.resize(array_shape); hid_t mem_space_id = H5S_ALL; hid_t file_space_id = H5S_ALL; hid_t xfer_plist_id = H5P_DEFAULT; data_set.read(ctype<value_type>::hid(), array.origin(), mem_space_id, file_space_id, xfer_plist_id); }
typename boost::enable_if<is_multi_array<T>, void>::type read_dataset(dataset & data_set, T & array, dataspace const& memspace, dataspace const& filespace) { // --- disabled this check, it is orthogonal to a useful feature (eg read from 2D dataset into 1D array) // const int array_rank = T::dimensionality; // if (!(memspace.rank() == array_rank)) { // throw error("memory dataspace and array rank do not match"); // } if (static_cast<hsize_t>(filespace.get_select_npoints()) > array.num_elements()) H5XX_THROW("target array does not provide enough space to store selected dataspace elements"); hid_t mem_space_id = memspace.hid(); //H5S_ALL; hid_t file_space_id = filespace.hid(); hid_t xfer_plist_id = H5P_DEFAULT; typedef typename T::element value_type; data_set.read(ctype<value_type>::hid(), array.origin(), mem_space_id, file_space_id, xfer_plist_id); }