pub struct TrackedString {
inner: String,
#[allow(dead_code)]
name: &'static str,
file: &'static str,
line: u32,
column: u32,
}
impl TrackedString {
pub fn with_capacity_named(
cap: usize,
name: &'static str,
file: &'static str,
line: u32,
column: u32,
) -> Self {
crate::registry::record_creation(name, file, line, column);
Self {
inner: String::with_capacity(cap),
name,
file,
line,
column,
}
}
#[inline]
pub fn wrap_from(
inner: String,
name: &'static str,
file: &'static str,
line: u32,
column: u32,
) -> Self {
crate::registry::record_creation(name, file, line, column);
Self {
inner,
name,
file,
line,
column,
}
}
}
impl std::ops::Deref for TrackedString {
type Target = String;
fn deref(&self) -> &String {
&self.inner
}
}
impl std::ops::DerefMut for TrackedString {
fn deref_mut(&mut self) -> &mut String {
&mut self.inner
}
}
impl AsRef<str> for TrackedString {
fn as_ref(&self) -> &str {
self.inner.as_ref()
}
}
impl AsRef<[u8]> for TrackedString {
fn as_ref(&self) -> &[u8] {
self.inner.as_ref()
}
}
impl Drop for TrackedString {
fn drop(&mut self) {
crate::registry::record_sample(self.file, self.line, self.column, self.inner.capacity());
}
}
impl From<TrackedString> for String {
fn from(tracked: TrackedString) -> String {
crate::registry::record_sample(
tracked.file,
tracked.line,
tracked.column,
tracked.inner.capacity(),
);
let inner = unsafe { std::ptr::read(&tracked.inner) };
std::mem::forget(tracked);
inner
}
}
impl crate::IntoInner for TrackedString {
type Inner = String;
#[inline]
fn into_inner(self) -> String {
String::from(self)
}
}
impl crate::cap_inspect::CapInspect for TrackedString {
#[inline]
fn cap_inspect_at(&self, name: &'static str, file: &'static str, line: u32, column: u32) {
crate::registry::record_initial(name, file, line, column, self.inner.capacity());
}
}