# static_aabb2d_index changelog All notable changes to the static_aabb2d_index crate will be documented in this file. ## 2.0.0 - 2023-09-04 ### Fixed 🐛 - Fixed building index properly for integer types. Previously due to integer division truncation and the way the hilbert coordinate values were computed the index was not properly sorted/structured when using integer values (this lead to a less optimal tree for querying, despite everything still querying properly). Hilbert coordinate values are now computed using `f64` to properly scale and work in all integer cases. This improves performance of the index when using integers. ### Changed 🔧 - ⚠️ MINOR BREAKING: numeric type used is now required to successfully cast to a `f64` (previously expected to cast to/from `u16`). This is a very minor breaking change, and only arises when using a non-builtin numeric type that for whatever reason cannot cast to a `f64` but is able to cast to/from a `u16`. Major version number was bumped since this is technically a breaking change for a weird edge use case. - Numeric type used no longer requires casting to/from a `u16`. - Rearranged math expressions when building hilbert coordinate values for performance improvement (~5%). - Implemented the `IndexableNum` trait for `i8`, `u8`, and `i16` types (those types are now supported, this came as part of the fix for integer types). ## 1.1.0 - 2023-08-31 ### Changed 🔧 - Bumped rust edition to 2021. - Changed internal Vecs to boxed slices (smaller size, and makes clear they don't change in size). - Internal code improvements for clarity. - Performance improvement when building an index with large number of item (8-10% measured for 1_000_000 items). - Avoid some allocations when building an index by determining the exact length of the `level_bounds` array before constructing it (performance improvement). - Added uninitialized memory optimization when the feature flag `unsafe_optimizations` is on. This further improves performance when building an index by avoiding zeroing the array of AABBs allocated for the all the boxes. Care was taken to avoid undefined behavior due to reading from or creating references to any uninitialized memory. ## 1.0.0 - 2023-03-02 ### Added ⭐ - Added `item_indices` method to get a slice over the indices for all item boxes added. ### Changed 🔧 - ⚠️ BREAKING: Index now supports being empty (no longer errors when building the index if item count is 0). When the index is empty all queries will yield no results. - ⚠️ BREAKING: `min_x`, `min_y`, `max_x`, and `max_y` functions on index replaced with single `bounds` function which returns the total bounds as an `AABB` or `None` if index item count is 0. - ⚠️ BREAKING: fixed inconsistency in `visit_query` function to return break result the same as the `visit_query_with_stack` function. - ⚠️ BREAKING: fixed inconsistency in `visit_neighbors` function to return break result the same as the `visit_neighbors_with_queue` function. - ⚠️ BREAKING: renamed `map_all_boxes_index` function to `all_box_indices` and changed signature to return a slice rather than indexing into a slice internally. - Improved doc comments. ## 0.7.1 - 2023-02-22 ### Changed 🔧 - Removed unsafe optimization involving uninitialized memory, the code did not strictly uphold the invariants required of a `Vec` at all times which could lead to undefined behavior. To properly perform this optimization will require more pointer manipulation spread across the code or new APIs from the Rust standard library. Index bounds checking is still toggled by the `unsafe_optimizations` feature. - INTERNAL: replaced `get_at_index` and `set_at_index` macros with simple inlined functions and simplified some function signatures to use slices rather than `Vec`. ## 0.7.0 - 2023-02-18 ### Added ⭐ - ⚠️ BREAKING: Added `total_cmp` method to `IndexableNum` trait to eliminate using `partial_cmp` and unwrap which can panic if NaN is present (was used for nearest neighbors query). If implementing `IndexableNum` for your own type you must implement `total_cmp` for your type). - Added `forbid(unsafe_code)` attribute to crate if `unsafe_optimizations` feature is not enabled. This ensures there is no unsafe code used in this crate unless `unsafe_optimizations` feature is turned on. - Added CHANGELOG.md to the project for tracking changes. ### Changed 🔧 - BREAKING: renamed feature `allow_unsafe` to `unsafe_optimizations`. - Use `std::cmp::min` and `std::cmp::max` in implementing `IndexableNum` for integers (ensures use of any available compiler intrinsic for optimizations). - Use `f32::min`, `f32::max`, `f64::min`, and `f64::max` in implementing `IndexableNum` (ensures use of any available compiler intrinsic for optimizations).