diff --git a/crates/get-size2/Cargo.toml b/crates/get-size2/Cargo.toml index 0cebd46..fe4fa14 100644 --- a/crates/get-size2/Cargo.toml +++ b/crates/get-size2/Cargo.toml @@ -23,6 +23,7 @@ chrono-tz = { version = "0.10", default-features = false, optional = true } compact_str = { version = "0.9", default-features = false, optional = true } hashbrown = { version = "0.16", default-features = false, optional = true } indexmap = { version = "2.10", default-features = false, optional = true } +ordermap = { version = "1.0", default-features = false, optional = true } smallvec = { version = "1", default-features = false, optional = true } thin-vec = { version = "0.2", default-features = false, optional = true } url = { version = "2", default-features = false, optional = true } @@ -36,6 +37,7 @@ get-size2 = { path = ".", features = [ "compact-str", "hashbrown", "indexmap", + "ordermap", "smallvec", "thin-vec", "url", @@ -51,6 +53,7 @@ chrono-tz = ["dep:chrono-tz"] compact-str = ["dep:compact_str"] hashbrown = ["dep:hashbrown"] indexmap = ["dep:indexmap"] +ordermap = ["dep:ordermap"] smallvec = ["dep:smallvec"] thin-vec = ["dep:thin-vec"] url = ["dep:url"] diff --git a/crates/get-size2/src/lib.rs b/crates/get-size2/src/lib.rs index 752ae38..7b5deb6 100644 --- a/crates/get-size2/src/lib.rs +++ b/crates/get-size2/src/lib.rs @@ -813,3 +813,40 @@ where (size + allocation_size, tracker) } } + +#[cfg(feature = "ordermap")] +impl GetSize for ordermap::OrderMap +where + K: GetSize, + V: GetSize, + S: std::hash::BuildHasher, +{ + fn get_heap_size_with_tracker(&self, tracker: Tr) -> (usize, Tr) { + let (size, tracker) = self + .iter() + .fold((0, tracker), |(size, tracker), (key, value)| { + let (key_size, tracker) = K::get_heap_size_with_tracker(key, tracker); + let (value_size, tracker) = V::get_heap_size_with_tracker(value, tracker); + (size + key_size + value_size, tracker) + }); + + let allocation_size = self.capacity() * <(K, V)>::get_stack_size(); + (size + allocation_size, tracker) + } +} + +#[cfg(feature = "ordermap")] +impl GetSize for ordermap::OrderSet +where + T: GetSize, +{ + fn get_heap_size_with_tracker(&self, tracker: Tr) -> (usize, Tr) { + let (size, tracker) = self.iter().fold((0, tracker), |(size, tracker), element| { + let (elem_size, tracker) = T::get_heap_size_with_tracker(element, tracker); + (size + elem_size, tracker) + }); + + let allocation_size = self.capacity() * T::get_stack_size(); + (size + allocation_size, tracker) + } +} diff --git a/crates/get-size2/src/test.rs b/crates/get-size2/src/test.rs index 5d5b5a9..bc873a9 100644 --- a/crates/get-size2/src/test.rs +++ b/crates/get-size2/src/test.rs @@ -541,6 +541,30 @@ fn test_indexmap() { assert!(set.get_heap_size() >= size_of::() + VALUE_STR.len()); } +#[test] +fn test_ordermap() { + use std::hash::RandomState; + + const VALUE_STR: &str = "A very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonng string."; + + let hasher = RandomState::new(); + + let mut map = ordermap::OrderMap::with_capacity_and_hasher(1, hasher); + assert_eq!(map.get_heap_size(), 40); + map.insert(VALUE_STR, String::from(VALUE_STR)); + assert!(map.get_heap_size() >= size_of::<(&'static str, String)>() + VALUE_STR.len()); + + let mut map = ordermap::OrderMap::::default(); + assert_eq!(map.get_heap_size(), 0); + map.insert(0, String::from(VALUE_STR)); + assert!(map.get_heap_size() >= size_of::<(i32, String)>() + VALUE_STR.len()); + + let mut set = ordermap::OrderSet::::default(); + assert_eq!(set.get_heap_size(), 0); + set.insert(String::from(VALUE_STR)); + assert!(set.get_heap_size() >= size_of::() + VALUE_STR.len()); +} + #[test] fn refcell() { // Test RefCell with a simple type