v0.9.0
What's new
Features
- SIMD-optimized time conversions — AVX512/AVX2/SSE2 runtime dispatch for CDF_EPOCH, EPOCH16, and TT2000 conversions
- Improved Python error messages — actionable exception messages with context throughout the Python API
- Keyword argument validation — Python API now rejects unexpected keyword arguments
- Empty name rejection — Variables and Attributes can no longer be created with empty names
Bug fixes
- Fix epoch16
to_epoch16catastrophic cancellation losing sub-second precision - Fix
leap_second()off-by-one error - Fix pre-1972 TT2000 handling
- Fix RLE corruption for sequences of >256 zeros
- Fix nomap container: swap corruption, const_iterator UB, asymmetric equality
- Fix mmap
MAP_FAILEDnot detected as invalid mapping, fd leak on failure - Fix null-check for libdeflate compressor
- Fix
record_count * record_sizeuint32_t overflow - Fix missing
std::movein Variable constructors and rvalue assignment operators - Fix
blk_iteratorpostfixoperator++callingstep_forward(0) - Fix
CDF_UCHARshape handling - Fix
cdf_map.__getitem__to raiseKeyErrorinstead of silently inserting - Fix missing CPR record for empty compressed variables (#52)
- Fix ZSTD error checking and meson ZSTD build
Modernization
- Three rounds of C++20 modernization: concepts, structured bindings,
std::ranges,if constexpr,std::visitwith overload pattern - Apple Clang 15 compatibility fix (Visitor deduction guide)
CI
- Bump codecov/codecov-action v5→v6, cibuildwheel 3.2→3.4, actions/upload-artifact v6→v7, actions/download-artifact v7→v8
Full Changelog: v0.8.6...v0.9.0