Revision history for Data-HashMap 0.08 2026-04-19 - Fix UTF-8 flag in string key identity: same bytes with different utf8 flag now collide (matches native Perl hash) - Fix thaw silent OOM: croaks instead of returning partial map - Dead param cleanup, macro consolidation, xt/ coverage expansion 0.07 2026-04-09 - Fix TTL expiry off-by-one: entries now live for their full TTL seconds - Fix compilation on threaded perls (undef Perl malloc/free macros) - Fix freeze/thaw: persisted entries no longer acquire default TTL on thaw - Fix freeze/thaw: clamp boundary TTL to avoid 0-sentinel ambiguity - Guard expires_at computation against uint32_t wrap-to-zero - Widen TTL test margins for slow CPAN smokers (1236 tests) 0.06 2026-03-23 - Split XS into per-variant xs/*.xsi files - Pre-reserve in from_hash/merge to avoid repeated resizes - Fix clone OOM: null shared LRU/TTL pointers before node copy - Fix from_hash/merge SV* refcount leak on put OOM - Document freeze/thaw native-endian limitation - Extended test coverage (1232 tests) 0.05 2026-03-17 - New operations: take, drain, pop, shift, swap, cas, reserve, purge, clone, from_hash, merge, capacity, persist, freeze/thaw - Approximate LRU via lru_skip constructor parameter (0-99%) - Binary serialization (freeze/thaw) for non-SV* variants - Hardened thaw with per-iteration bounds checks against malformed input 0.04 2026-03-16 - Fix string value NUL-termination for get_direct safety - Fix lexical sub compatibility for Perl 5.22-5.24 - Widen TTL test timing margins for slow CPAN smokers - Guard RSS tests against platforms with non-functional /proc - SV* variant stress and LRU test coverage 0.03 2026-03-13 - Fix UTF-8 key collision: keys with different UTF-8 flags are now distinct - Fix silent integer truncation: I16/I32 variants croak on out-of-range values - Fix TTL read-path compaction: get/exists no longer trigger compact(), preventing each() iterator reset and get_direct pointer invalidation - Fix each() scalar context: returns key only via method dispatch - Dedicated memory leak tests (Test::LeakTrace) and RSS reclamation tests - Updated benchmarks for all 14 variants 0.02 2026-03-12 - Lookup optimizations: cached stash pointer comparison in EXTRACT_MAP - Switch to bundled xxHash v0.8.3 (XXH3_64bits) for all key hashing - Add get_direct keyword for zero-copy string-value lookups (IS, SS, I32S, I16S) - OOM-safe TTL lazy allocation across all put/get_or_set paths - LRU uint32_t index overflow guard in rehash - HM_LIKELY/HM_UNLIKELY portability guard for non-GCC/Clang compilers - Null-value guard in get_or_set for string-value variants - each() iterator reset documentation covers remove/compaction triggers - iter_reset keyword for manual each() iterator reset 0.01 2026-03-07 - Initial release - 14 type-specialized hash map variants: I16, I16A, I16S, I32, I32A, I32S, IA, II, IS, SA, SI16, SI32, SI, SS - Keyword API via XS::Parse::Keyword (bypasses method dispatch) - Method dispatch API ($map->put, $map->get, etc.) - Counter operations (incr, decr, incr_by) for integer-value variants - LRU eviction (max_size) and TTL expiry (default_ttl) - Per-key TTL via put_ttl keyword/method - clear, to_hash, get_or_set operations - Open addressing with linear probing, xxHash, tombstone compaction