mirror of
https://github.com/qdrant/qdrant.git
synced 2026-07-30 22:51:00 -05:00
* Fix `try_set_capacity` functions, add unit tests * Skip setting capacity if already grown * Improve chunked vectors insertion function * Remove if capacity is zero
91 lines
2.5 KiB
Rust
91 lines
2.5 KiB
Rust
use std::collections::TryReserveError;
|
|
|
|
pub trait TrySetCapacity {
|
|
fn try_set_capacity(&mut self, capacity: usize) -> Result<(), TryReserveError>;
|
|
}
|
|
|
|
pub trait TrySetCapacityExact {
|
|
fn try_set_capacity_exact(&mut self, capacity: usize) -> Result<(), TryReserveError>;
|
|
}
|
|
|
|
impl<T> TrySetCapacity for Vec<T> {
|
|
fn try_set_capacity(&mut self, capacity: usize) -> Result<(), TryReserveError> {
|
|
let additional = capacity.saturating_sub(self.len());
|
|
self.try_reserve(additional)
|
|
}
|
|
}
|
|
|
|
impl<T> TrySetCapacityExact for Vec<T> {
|
|
fn try_set_capacity_exact(&mut self, capacity: usize) -> Result<(), TryReserveError> {
|
|
let additional = capacity.saturating_sub(self.len());
|
|
self.try_reserve_exact(additional)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_try_set_capacity() {
|
|
// Constructing uses exact capacity
|
|
let mut v = vec![1, 2, 3];
|
|
assert_eq!(v.capacity(), 3);
|
|
|
|
// Set capacity to 5, but it will double to 6
|
|
v.try_set_capacity(5).unwrap();
|
|
assert_eq!(v.capacity(), 6);
|
|
|
|
// Setting capacity again does nothing
|
|
v.try_set_capacity(5).unwrap();
|
|
assert_eq!(v.capacity(), 6);
|
|
|
|
// Fill up to capacity
|
|
v.extend([4, 5, 6]);
|
|
assert_eq!(v.capacity(), 6);
|
|
|
|
// Push over capacity will double it
|
|
v.push(7);
|
|
assert_eq!(v.capacity(), 12);
|
|
|
|
// Set capacity to 100
|
|
v.try_set_capacity(100).unwrap();
|
|
assert_eq!(v.capacity(), 100);
|
|
|
|
// Capacity will never shrink
|
|
v.try_set_capacity(5).unwrap();
|
|
assert_eq!(v.capacity(), 100);
|
|
}
|
|
|
|
#[test]
|
|
fn test_try_set_capacity_exact() {
|
|
// Constructing uses exact capacity
|
|
let mut v = vec![1, 2, 3];
|
|
assert_eq!(v.capacity(), 3);
|
|
|
|
// Set capacity to exactly 5
|
|
v.try_set_capacity_exact(5).unwrap();
|
|
assert_eq!(v.capacity(), 5);
|
|
|
|
// Setting capacity again does nothing
|
|
v.try_set_capacity_exact(5).unwrap();
|
|
assert_eq!(v.capacity(), 5);
|
|
|
|
// Fill up to capacity
|
|
v.extend([4, 5]);
|
|
assert_eq!(v.capacity(), 5);
|
|
|
|
// Push over capacity will double it
|
|
v.push(6);
|
|
assert_eq!(v.capacity(), 10);
|
|
|
|
// Set capacity to exactly 100
|
|
v.try_set_capacity_exact(100).unwrap();
|
|
assert_eq!(v.capacity(), 100);
|
|
|
|
// Capacity will never shrink
|
|
v.try_set_capacity_exact(5).unwrap();
|
|
assert_eq!(v.capacity(), 100);
|
|
}
|
|
}
|