Version 0.21 - 2026-06-27 - Tree now holds strong reference to Node-wrapper objects, so once they are created (still lazily on demand) they remain until that node is deleted. This makes it possible to make weak references to Node objects. Version 0.20 - 2025-12-17 - Fixed bug where 'put' with allow_duplicates did not always replace all other nodes with identical keys - Node keys can now be altered, to re-key a node. - New tree attribute 'recent_limit' auto-prunes oldest nodes when collection grows past that limit. - New tree methods insert_as_node and put_as_node return Node objects for the just-inserted item. Version 0.19 - 2025-04-11 - New attribute 'keys_in_recent_order' changes behavior of convenience iteration methods, including for tied hashes. Version 0.18 - 2025-03-22 - New method 'rekey', for modifying existing keys by an offset - XS fix for passing hashref to constructor, previously would miss attributes Version 0.17 - 2024-12-30 - XS fix for crash in Node::STORABLE_thaw when ssize_t is 32 bit and IV is 64 bit. Version 0.16 - 2024-12-28 - Fix blatant bugs in constructor for handling single-argument compare fn or hashref, and add tests. - Fix foldcase on perl 5.14 - Fix compilation errors and warnings on MSVC - Add alias 'key' for 'get_key' Version 0.15 - 2024-12-27 - New comparison functions CMP_FOLDCASE, CMP_NUMSPLIT_FOLDCASE, along with a new internal mechanism for applying a transformation function to incoming keys before comparing them. Access to this API can be expanded in future versions. - Renamed comparison function CMP_UTF8 => CMP_STR, but old name still works - New methods keys, reverse_keys, values, reverse_values, kv, reverse_kv Version 0.14 - 2024-08-17 - Fix threaded perl support Version 0.13 - 2024-08-16 - Support for Storable freeze/thaw on trees and nodes (but not iterators) - More complete XS constructor is faster and allows more things to be initialized, including the "recent" list, and "keys" without values. Warns on unknown attribute names, now. - Fix null pointer bugs accessing certain attributes of pruned nodes - example "newest-files" - Documentation updates Version 0.12 - 2024-07-09 - Fix fatal bug in prev_inserted_trend optimization Version 0.11 - 2024-07-09 - New comparison flag GET_OR_ADD, inserts an empty node if one didn't exist - New get_key function returns nearest key to one requested. - New get shortcuts get_or_add, get_key_lt, get_key_le, get_key_gt, get_key_ge - Methods get, lookup, get_or_add, FETCH, and node method 'value' are now flagged as lvalue subs. - New exportable function 'cmp_numsplit' can be used independent of tree nodes Version 0.10 - 2024-07-05 - New method 'exists', takes list of keys and returns node count - New methods put_multi and insert_multi - Optimization for insertions of adjacent nodes, can build new tree in N+1 comparisons - New configuration attribute 'lookup_updates_recent' finishes the feature set needed for a typical LRU cache. - Constructor option 'kv' to initialize the tree - Fix bug when replacing multiple nodes with a 'put' Version 0.09 - 2024-07-04 - Fix XS bug in iter->next when iterating 'recent' and count > 1. - Count greater than INT_MAX passed to iter->next now returns all nodes instead of zero nodes. Version 0.08 - 2024-07-02 - New feature of insertion-order tracking: - Tree attributes: track_recent (and ctor option), newest_node, oldest_node, recent_count - Tree methods: iter_newer, iter_older, truncate_recent - Node attributes: newer, older, recent_tracked - Node methods: mark_newest, iter_newer, iter_older - Iterator attribute 'node' (had 'key' and 'value', but not 'node'?) - Fix bug so iterators can be called as functions, as intended - Alias iterator methods for clearer singular usage 'next_keys' => 'next_key' 'next_values' => 'next_value' Version 0.07 - 2022-06-04 - Actual fix for iter->next_kv, only affects debug perls - GitHub #2 - Explicitly require Scalar::Util Version 0.06 - 2022-05-22 - Possible fix for bug in iter->next_kv Version 0.05 - 2021-11-20 - Implement hseek - Fix more bugs in utf8 comparisons (should be really fixed this time) - Fix compilation on 32-bit platforms - util/benchmark.pl compares performance with other similar modules Version 0.03 - 2021-11-18 - New XS iterators, with lots of new methods: clone, key, value, index, tree, next_kv, next_keys, next_values, step, delete. - Iterators now automatically move to the next item if the current node gets removed from the tree. - Iterators now hold a strong reference to the tree. - TIEHASH interface, for those who want it. - More unit tests, more documentation. - Fixed compilation on 5.12, 5.10, 5.8 at the cost of correct UTF-8 cmp. Version 0.02 - 2021-11-15 - New CMP_NUMSPLIT comparison function - New get_node shortcuts: get_node_last, get_node_le, get_node_le_last, get_node_lt, get_node_ge, get_node_gt. - Code cleanup - Minor documentation fixes Version 0.01 - 2021-11-15 - Finished implementing almost all methods of Tree::RB - Renamed option 'compat_list_context' to 'compat_list_get' since it only affected the 'get' method. - Add tree methods: root, iter, rev_iter - Add node methods: tree, left_leaf, right_leaf, strip, as_lol min, max, successor, predecessor Version 0.00_03 - 2021-11-14 - KEY_TYPE_USTR now uses a correct unicode comparison function. - Added option 'compat_array_context' - Comparison functions can now be specified by enum constants - Added api methods get_all, iter, rev_iter - Delete now takes a second optional param to delete a range - Renamed exported constants LU_* to GET_*, and added GET_LE_LAST and GET_EQ_LAST to handle common cases for duplicate keys. - More unit tests - Much more documentation Version 0.00_02 - 2021-11-13 - Enhanced string-key performance using KEY_TYPE_BSTR and KEY_TYPE_USTR. KEY_TYPE_STR is removed. - Various distribution fixes, documentation, etc. Version 0.00_01 - 2021-11-12 - Initial release, with partial compatibility to Tree::RB