File indexing completed on 2026-05-10 08:42:09
0001 #pragma once
0002
0003 #include "bits/H5Inspector_decl.hpp"
0004 #include "H5Exception.hpp"
0005
0006 #include <boost/numeric/ublas/matrix.hpp>
0007
0008 namespace HighFive {
0009 namespace details {
0010
0011 template <typename T>
0012 struct inspector<boost::numeric::ublas::matrix<T>> {
0013 using type = boost::numeric::ublas::matrix<T>;
0014 using value_type = unqualified_t<T>;
0015 using base_type = typename inspector<value_type>::base_type;
0016 using hdf5_type = typename inspector<value_type>::hdf5_type;
0017
0018 static constexpr size_t ndim = 2;
0019 static constexpr size_t min_ndim = ndim + inspector<value_type>::min_ndim;
0020 static constexpr size_t max_ndim = ndim + inspector<value_type>::max_ndim;
0021
0022 static constexpr bool is_trivially_copyable = std::is_trivially_copyable<value_type>::value &&
0023 inspector<value_type>::is_trivially_copyable;
0024 static constexpr bool is_trivially_nestable = false;
0025
0026 static size_t getRank(const type& val) {
0027 return ndim + inspector<value_type>::getRank(val(0, 0));
0028 }
0029
0030 static std::vector<size_t> getDimensions(const type& val) {
0031 std::vector<size_t> sizes{val.size1(), val.size2()};
0032 auto s = inspector<value_type>::getDimensions(val(0, 0));
0033 sizes.insert(sizes.end(), s.begin(), s.end());
0034 return sizes;
0035 }
0036
0037 static void prepare(type& val, const std::vector<size_t>& dims) {
0038 if (dims.size() < ndim) {
0039 std::ostringstream os;
0040 os << "Impossible to pair DataSet with " << dims.size() << " dimensions into a " << ndim
0041 << " boost::numeric::ublas::matrix";
0042 throw DataSpaceException(os.str());
0043 }
0044 val.resize(dims[0], dims[1], false);
0045 }
0046
0047 static hdf5_type* data(type& val) {
0048 return inspector<value_type>::data(val(0, 0));
0049 }
0050
0051 static const hdf5_type* data(const type& val) {
0052 return inspector<value_type>::data(val(0, 0));
0053 }
0054
0055 static void serialize(const type& val, const std::vector<size_t>& dims, hdf5_type* m) {
0056 size_t size = val.size1() * val.size2();
0057 auto subdims = std::vector<size_t>(dims.begin() + ndim, dims.end());
0058 size_t subsize = compute_total_size(subdims);
0059 for (size_t i = 0; i < size; ++i) {
0060 inspector<value_type>::serialize(*(&val(0, 0) + i), subdims, m + i * subsize);
0061 }
0062 }
0063
0064 static void unserialize(const hdf5_type* vec_align,
0065 const std::vector<size_t>& dims,
0066 type& val) {
0067 std::vector<size_t> next_dims(dims.begin() + ndim, dims.end());
0068 size_t subsize = compute_total_size(next_dims);
0069 size_t size = val.size1() * val.size2();
0070 for (size_t i = 0; i < size; ++i) {
0071 inspector<value_type>::unserialize(vec_align + i * subsize,
0072 next_dims,
0073 *(&val(0, 0) + i));
0074 }
0075 }
0076 };
0077
0078 }
0079 }