Skip to main content

get_size2/impls/alloc_impls/
strings.rs

1use alloc::boxed::Box;
2use alloc::ffi::CString;
3use alloc::rc::Rc;
4use alloc::string::String;
5// `Arc` is only provided by `alloc` on targets with pointer sized atomics.
6#[cfg(target_has_atomic = "ptr")]
7use alloc::sync::Arc;
8
9use crate::{GetSize, GetSizeTracker};
10
11impl GetSize for String {
12    fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
13        (self.capacity(), tracker)
14    }
15}
16
17impl GetSize for CString {
18    fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
19        (self.as_bytes_with_nul().len(), tracker)
20    }
21}
22
23impl GetSize for Box<str> {
24    fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
25        (self.len(), tracker)
26    }
27}
28
29impl GetSize for Rc<str> {
30    fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, mut tracker: T) -> (usize, T) {
31        if !tracker.track(Self::as_ptr(self).cast::<()>()) {
32            return (0, tracker);
33        }
34
35        (self.len(), tracker)
36    }
37}
38
39#[cfg(target_has_atomic = "ptr")]
40impl GetSize for Arc<str> {
41    fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, mut tracker: T) -> (usize, T) {
42        if !tracker.track(Self::as_ptr(self).cast::<()>()) {
43            return (0, tracker);
44        }
45
46        (self.len(), tracker)
47    }
48}