mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-08 13:20:11 +00:00
38 lines
1.3 KiB
Rust
38 lines
1.3 KiB
Rust
macro_rules! struct_with_counted_drop {
|
|
($struct_name:ident $(( $( $elt_ty:ty ),+ ))?, $drop_counter:ident $( => $drop_stmt:expr )? ) => {
|
|
thread_local! {static $drop_counter: ::core::cell::Cell<u32> = ::core::cell::Cell::new(0);}
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
struct $struct_name $(( $( $elt_ty ),+ ))?;
|
|
|
|
impl ::std::ops::Drop for $struct_name {
|
|
fn drop(&mut self) {
|
|
$drop_counter.set($drop_counter.get() + 1);
|
|
|
|
$($drop_stmt(self))?
|
|
}
|
|
}
|
|
};
|
|
($struct_name:ident $(( $( $elt_ty:ty ),+ ))?, $drop_counter:ident[ $drop_key:expr,$key_ty:ty ] $( => $drop_stmt:expr )? ) => {
|
|
thread_local! {
|
|
static $drop_counter: ::core::cell::RefCell<::std::collections::HashMap<$key_ty, u32>> =
|
|
::core::cell::RefCell::new(::std::collections::HashMap::new());
|
|
}
|
|
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
struct $struct_name $(( $( $elt_ty ),+ ))?;
|
|
|
|
impl ::std::ops::Drop for $struct_name {
|
|
fn drop(&mut self) {
|
|
$drop_counter.with_borrow_mut(|counter| {
|
|
*counter.entry($drop_key(self)).or_default() += 1;
|
|
});
|
|
|
|
$($drop_stmt(self))?
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
pub(crate) use struct_with_counted_drop;
|