#include <armadillo>
#include <Eigen/Dense>
#include <blitz/array.h>
#include <dlib/matrix.h>
#include <boost/numeric/ublas/matrix.hpp>
#include <xtensor/xarray.hpp>
#include <array>
#include <complex>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <string>
#include <tuple>
#include <utility>
#include <valarray>
#include <vector>
#include "struct.h"
#include <h5cpp/all>
#include "generated.h"
#include "utils.hpp"
int main() {
h5::fd_t fd =
h5::create(
"attributes.h5", H5F_ACC_TRUNC, h5::default_fcpl,
h5::libver_bounds({H5F_LIBVER_V18, H5F_LIBVER_V18}));
arma::mat host(rows, cols);
for (
std::size_t c = 0; c < cols; ++c) host(r, c) = double(r * cols + c);
h5::ds_t ds =
h5::write(fd,
"/dataset", host);
std::cout <<
"\n=== linear-algebra attributes ===\n";
Eigen::MatrixXd eigen_m(rows, cols); eigen_m << 0,1,2,3, 4,5,6,7, 8,9,10,11;
blitz::Array<double, 2> blitz_m(rows, cols); blitz_m = blitz::tensor::i * static_cast<int>(cols) + blitz::tensor::j;
dlib::matrix<double> dlib_m(rows, cols);
for (long r = 0; r < (long)rows; ++r)
for (long c = 0; c < (long)cols; ++c) dlib_m(r, c) = double(r * cols + c);
boost::numeric::ublas::matrix<double> ublas_m(rows, cols);
for (
std::size_t c = 0; c < cols; ++c) ublas_m(r, c) = double(r * cols + c);
xt::xarray<double> xt_m = {{0., 1., 2., 3.}, {4., 5., 6., 7.}, {8., 9., 10., 11.}};
ds["arma"] = host;
ds["eigen"] = eigen_m;
ds["blitz"] = blitz_m;
ds["dlib"] = dlib_m;
ds["ublas"] = ublas_m;
ds["xtensor"] = xt_m;
ds["valarray"] = va;
check(
"blitz::Array<double,2>(3x4) attribute", same(blitz_m,
h5::aread<blitz::Array<double, 2>>(ds,
"blitz")));
check(
"dlib::matrix<double>(3x4) attribute", same(dlib_m,
h5::aread<dlib::matrix<double>>(ds,
"dlib")));
check(
"ublas::matrix<double>(3x4) attribute", same(ublas_m,
h5::aread<boost::numeric::ublas::matrix<double>>(ds,
"ublas")));
check(
"xt::xarray<double>(3x4) attribute", same(xt_m,
h5::aread<xt::xarray<double>>(ds,
"xtensor")));
std::cout <<
"\n=== canonical fixed-extent attributes ===\n";
char c_str[16] = "char[N]";
ds["array_int"] = ai;
ds["vec_arr_int"] = v_ai;
ds["vec_arr_char"] = v_ac;
{
check("char[16] attribute (FLS)",
}
check("std::vector<std::array<int,3>>(3) attribute (rank-1 of H5T_ARRAY)", v_ai_back == v_ai);
check("std::vector<std::array<char,8>>(2) attribute (rank-1 of FLS)", v_ac_back == v_ac);
std::cout <<
"\n=== scalar object kinds ===\n";
ds["complex"] = cx;
ds["pair"] = pr;
ds["tuple"] = tup;
rec.idx = 7;
ds["pod"] = rec;
ds["pods"] = records;
bool pods_ok = pods_back.size() == records.
size();
pods_ok = (pods_back[i].idx == records[i].idx);
check("std::vector<record_t>(8) attribute (idx field)", pods_ok);
ds["str"] = str;
ds["vec_s"] = vec_s;
ds["ragged"] = ragged;
ds["list"] = list_i;
ds["set"] = set_i;
ds["map"] = map_id;
ds["vtups"] = v_tup;
std::cout <<
"\n=== explicit h5::awrite (target: /group) ===\n";
check("int / double / std::string / arma::mat via h5::awrite on group",
std::cout <<
"\n=== pretty-print readback ===\n";
std::cout <<
" v_ai = " << v_ai_back <<
"\n";
std::cout <<
"\n=== rewrite + type-mismatch error ===\n";
ds["scalar_int"] = 42;
ds["scalar_int"] = 99;
check(
"rewrite ds[\"scalar_int\"] same type",
h5::aread<int>(ds,
"scalar_int") == 99);
bool threw = false;
try {
} catch (const h5::error::io::attribute::any&) {
threw = true;
}
check("rewrite type mismatch → throws h5::error::io::attribute::any", threw);
return 0;
}
h5::at_t create(const hid_t &parent, const std::string &path, args_t &&... args)
Create a new attribute of element type T on a parent HDF5 object.
Definition H5Acreate.hpp:100
T aread(const hid_t &ds, const std::string &name, const h5::acpl_t &acpl=h5::default_acpl)
Read an attribute by name and return its value as type T.
Definition H5Aread.hpp:76
void awrite(const h5::at_t &attr, const T *ptr)
Low-level attribute write — copies elements from ptr into an already-open h5::at_t.
Definition H5Awrite.hpp:47
h5::gr_t write(const LOC &parent, const std::string &path, const T &src)
Write a sparse matrix or vector as a CSC group.
Definition H5Dsparse.hpp:185
void unmute()
restores previously saved error handler with h5::mute Read on Error Handling/Exceptions
Definition H5Eall.hpp:41
void mute()
removes default error handler preventing diagnostic error messages printed for direct CAPI calls....
Definition H5Eall.hpp:28
std::enable_if_t< h5::impl::is_valid_group_parent< HID_T >::value, h5::gr_t > gcreate(const HID_T &parent, const std::string &path, const h5::lcpl_t &lcpl=h5::default_lcpl)
Creates an HDF5 group and returns a managed h5::gr_t handle.
Definition H5Gcreate.hpp:32