* craft-aep: a flat read-only tree index, borrowed text documents, fewer allocations
The container part of storytold/effectcraft#3302:
- `TreeIndex`: the chunk tree as one flat array in depth-first order,
borrowed from the input, for readers that only look. Same chunks counted
against the same limits and the same errors as `parse`. An `.aepx` is
indexed by `index_aepx` into one buffer. The typed view reads through
either tree (`Node`, `Root`, `Project::from_index`).
- Chunk parser: each list of siblings is counted, then reserved once.
`.aepx`: hex decoded into an output sized once, attribute values without
an entity borrowed. `write` reserves the exact output size.
- Text documents are parsed into a tree that borrows from the body; the
style and paragraph defaults are built once.
- Layer markers and Source Text are read where they are stored instead of
searched for.
- Container accessors that only tests used are removed.
What the importer and exporter in EffectCraft reach across the crate
boundary is public here: `Root`, `Draft`, `AepxDrafts`, `index_aepx`,
`TreeIndex::from_drafts`, `Project::of`, `ProjectSettings::of`,
`Node::marker_list`, `Root::file_version` and `saved_by_version`,
`StyleRun::SAMPLED`. `TimeBase::NTSC` holds the rates as plain
numerator and denominator instead of an EffectCraft type.
* craft-aep: one decoder for an effect parameter definition (`Pard`)
The container part of storytold/effectcraft#3319: the fields of a `pard`
record (type code, name, default, valid range, slider range, popup item
count) are read by one type, `Pard`, which `EffectParam` now reads
through. It is public so that an exporter's tests can read back what
they encode instead of keeping a second decoder.
The rest of that PR (import and export bounds, loss reports) is in
EffectCraft's importer and exporter.
---------
Co-authored-by: vangel76 <vangel1976@googlemail.com>