H5CPP is a modern C++ template library for serial and parallel HDF5 I/O. It provides type-safe RAII wrappers, high-level create / read / write / append operations, and seamless interoperability with the native HDF5 C API. Chunked and compressed datasets, extendable packet-table streams, hyperslab selection, custom datatypes, and MPI parallel I/O are all supported. HDF5 files written by H5CPP are readable from Python, R, MATLAB, Fortran, Julia, and any other HDF5-capable environment.
| Layer | Role |
|---|---|
| H5CPP | Header-only C++ HDF5 I/O library |
| h5cpp-compiler | Optional build-time reflection tool for non-POD struct persistence |
| OS / Compiler | GCC 13 | GCC 14 | GCC 15 | Clang 17 | Clang 18 | Clang 19 | Clang 20 | Apple Clang | MSVC |
|---|---|---|---|---|---|---|---|---|---|
| Ubuntu 22.04 | |||||||||
| Ubuntu 24.04 | |||||||||
| macOS 15 | |||||||||
| Windows |
#include <h5cpp/all>
#include <vector>
namespace sn::sensor {
struct [[h5::doc("Time-series sensor reading with variable-length fields"),
h5::chunk(128), h5::compress("gzip", 6)]] timeseries_t {
unsigned long long timestamp_ns;
[[h5::name("label")]] std::string tag;
[[h5::ignore]] int internal_id;
std::vector<double> readings;
};
}
int main() {
auto fd = h5::create("example.h5", H5F_ACC_TRUNC);
auto fd = h5::create("storage.h5");
std::vector<timeseries_t> samples(100);
h5::write(fd, "samples", samples);
auto result = h5::read<std::vector<timeseries_t>>(fd, "samples");
}find_package(HDF5 REQUIRED)
find_package(h5cpp REQUIRED)
target_link_libraries(my_app PRIVATE h5cpp::h5cpp)| Requirement | Minimum | Tested ceiling |
|---|---|---|
| C++ standard | C++17 | C++23 |
| HDF5 | 1.10.x | 1.14.6 |
| CMake | 3.22 | — |
C++20 enables h5::view<T> streaming ranges.
C++23 adds std::float16_t dataset support.
From GitHub Releases — pre-built packages for each tagged release:
| Platform | Package |
|---|---|
| Ubuntu / Debian (amd64, arm64) | .deb via Releases |
| RHEL / Fedora (x86_64, aarch64) | .rpm via Releases |
| macOS 15 arm64 | .pkg via Releases |
| Windows x64 | NSIS .exe via Releases |
From source:
git clone https://github.com/vargalabs/h5cpp.git
cmake -B build -DCMAKE_BUILD_TYPE=Release -DH5CPP_BUILD_TESTS=OFF
cmake --install build| Category | Types |
|---|---|
| Numeric | bool, int8_t–int64_t, uint8_t–uint64_t, float, double, long double, std::complex<T>, std::float16_t (C++23) |
| Strings | std::string, char[], variable-length HDF5 strings |
| STL sequences | std::vector, std::valarray, std::array, std::deque |
| STL node-based | std::list, std::forward_list, std::set, std::multiset, std::unordered_set, std::unordered_multiset |
| Linear algebra | Armadillo, Eigen, Blaze, Blitz++, Boost uBLAS, IT++, dlib |
| Structs | POD / C / C++ structs via h5cpp-compiler |
| Arrays | Up to rank 7 |
v1.14.0 closes the v1.12.x line — a cycle organized around eliminating the performance and concurrency objections that push teams from HDF5 toward ad-hoc formats.
- STL non-contiguous and sequence containers —
std::valarray,std::list,std::deque,std::set,std::multiset,std::unordered_set,std::unordered_multisetall route through the unified Walter Brown trait-based dispatch.std::complex<T>andstd::float16_t(C++23 half-precision) datasets added. - Rank-7 arrays — up to seven-dimensional arrays supported, matching the HDF5 C library limit.
- Expanded attribute coverage — all scalar, string, and compound attribute types reachable through the same
h5::awrite/h5::areadsurface. - SSSE3 rank-1 write fast path — chunked 1-D writes use a bump-pointer arena, prefetch, nontemporal stores, and SIMD shuffle/unshuffle for element sizes 2, 4, and 8 bytes. No API changes; existing code picks it up automatically on x86 targets. Non-x86 targets use the scalar path unchanged.
- In-place filter pipeline — shuffle, Fletcher-32, scale-offset, and nbit run without heap allocation, cutting per-chunk overhead on write-heavy workloads.
- Transparent concurrent compression — the filter pipeline (gzip/zstd) runs across a per-file worker pool internally; the write API stays synchronous and single-threaded. Activate at file open with
h5::create(..., h5::threads{N} | h5::backpressure{M}); no THREAD_SAFE HDF5 build required. - Parallel decompression — rank-1 chunked reads decompress across the same per-file pool, scaling with available threads.
h5::view<T>streaming ranges — C++20 range view over chunked datasets;for (auto chunk : h5::view<std::vector<float>>(ds))iterates multi-GB datasets one chunk at a time without materialising the full dataset in memory. Any container satisfying Walter Brown's detection idiom (data(),value_type,size()) works as the element type, so Abseil, Folly, EASTL, and Boost.Container all participate without registration.- Gorilla XOR filter (experimental) — delta-of-delta XOR codec for
float32/float64time-series (Facebook Gorilla algorithm). Interoperability with h5py and the HDF5 C library for Gorilla-compressed datasets is not yet tested. - Scatter/gather dispatch —
H5CPP_REGISTER_SCATTERlets any third-party container opt intoh5::read/h5::writewithout modifying the library. - Compiler-assisted reflection —
h5cpp-compiler, a Clang LibTooling pre-build tool, emits HDF5 compound descriptors and scatter/gather helpers for any non-POD struct without intrusive macros. Struct members are annotated with C++26-style attributes; the tool walks the AST at build time and generates the descriptors. C++26 static reflection is on the roadmap as the macro-free successor. - SWMR —
swmr_write_t/swmr_read_ttags enable live readers to observe an active writer without closing the file. Requires HDF5 ≥ 1.12.3;H5CPP_HAS_SWMRis set automatically by CMake. - HDF5 2.x compatibility —
H5Dread_chunk2buffer-sizing fix; existing code runs correctly on HDF5 2.x without source changes. - Doxygen API reference — full reference live at vargalabs.github.io/h5cpp, with I/O API, topics, and cookbook navigation axes.
- 28 CMake cookbook examples — basics through MPI, S3, sparse matrices, half-float, and custom pipelines; enable with
-DH5CPP_BUILD_EXAMPLES=ON. - Public CDash dashboard — CI results and sanitiser status at https://my.cdash.org/index.php?project=h5cpp; community submissions welcomed.
- Coverage > 95%, TSan-clean on Clang 20, ASan and UBSan clean across the full matrix.
Full API reference, examples, and architecture notes: vargalabs.github.io/h5cpp
See CONTRIBUTING.md for issue naming, branch conventions, commit format, and the pull request workflow.
MIT — see LICENSE.