Revision history for Data-HashMap

0.09  2026-09-11
    - Per-process hash seed; key order and freeze output vary between runs
    - SV* variants: opt-in value copying (fourth new() argument)
    - Maps are not cloned into new threads; maps made in a thread work
    - Storable support for non-SV* variants; SV* variants croak
    - new() croaks on refs, non-numbers and extra arguments
    - ttl below one second rounds up to one
    - Out-of-range integers croak instead of wrapping
    - Downgradable UTF-8 keys equal their Latin-1 form
    - keys, values and items return a count in scalar context
    - Every variant isa Data::HashMap
    - TTL maps stay bounded; lru_skip below 50 takes effect
    - Fix crashes: tied from_hash, destroyed-map merge, re-entrant DESTROY
    - Fix clone losing keys, pop/shift missing entries, put_ttl leak
    - Fix severe LRU and sparse-table slowdowns
    - thaw, from_hash and merge fail cleanly on bad input or low memory
    - POD: caveats section, a page per variant

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
