feat(format): nested groups, soft/hard/external links and creation order in the writer
FileWriter wrote the root group plus one level of groups, and refused
path-like names. The writer now flattens its builders into a group tree
(writer_tree.rs) before layout:
- A name may be a path ("a/b/x", "/a/b/x" at the root); missing
intermediate groups are created as h5py does, and GroupBuilder gains
create_group/add_group so builders nest to any depth. A group added at a
path that already holds a group is merged into it (require_group);
any other repeated name, an empty or "." component, or an absolute path
below the root is an error.
- add_soft_link, add_hard_link and add_external_link on FileWriter,
FileBuilder and GroupBuilder. Hard-link targets are resolved to objects
at finish (through other hard links; a missing target, a soft link on the
way or a cycle of paths is an error). Objects with several hard links get
an Object Reference Count message so libhdf5 can delete one link without
freeing the object.
- track_order(true) per group, or as the file default, tracks and indexes
link creation order: Link Info flags and max order, the order in each
Link message, and a type-6 creation-order B-tree for dense groups.
- A group's link index is one B-tree leaf; more than 65535 links is an
error.
Groups are laid out depth-first from the root, datasets group by group,
and untracked groups keep writing datasets, then groups, then other links:
files with one level of groups are byte-identical to before.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
+11
-2
@@ -202,8 +202,17 @@ fill-value item that did is fixed).
|
||||
and h5dump 1.14.6 rejects 9 of those (tank, 2026-09-26; 28 and 21
|
||||
before these checks).
|
||||
- **Writer:**
|
||||
- Nested groups beyond one level: path-like names are now refused, not
|
||||
created.
|
||||
- ~~Nested groups beyond one level: path-like names are now refused, not
|
||||
created.~~ **Fixed 2026-09-26:** groups nest to any depth (path names
|
||||
create intermediate groups, as h5py does), with soft, extra hard and
|
||||
external links at any depth and optional creation-order tracking;
|
||||
h5py, h5dump and `h5rs check --data` read them
|
||||
(`crates/clawhdf5/tests/writer_groups_interop.rs`,
|
||||
`crates/clawhdf5-tools/tests/h5rs_interop.rs`). Still missing: a group
|
||||
with more than 65 535 links (its link index is one B-tree leaf) is an
|
||||
error, and attribute creation order is not tracked.
|
||||
- ~~libhdf5 could not add a link to a group we wrote (no Group Info
|
||||
message).~~ **Fixed 2026-09-26.**
|
||||
- Dense attribute storage for attributes over 64 KiB.
|
||||
- Output that HDF5 1.8 can read.
|
||||
- A B-tree v2 chunk index larger than one leaf, so datasets with several
|
||||
|
||||
Reference in New Issue
Block a user