mirror of
https://github.com/Noratrieb/stuff.git
synced 2026-01-14 16:35:08 +01:00
get drop working
This commit is contained in:
parent
74bd6e064f
commit
a453f210b3
2 changed files with 38 additions and 12 deletions
11
src/lib.rs
11
src/lib.rs
|
|
@ -130,7 +130,7 @@ fn map_ptr<T>(ptr: *mut T, map: impl FnOnce(usize) -> usize) -> *mut T {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::strategies::test_strategies::HasDebug;
|
use crate::strategies::test_strategies::{HasDebug, PanicsInDrop};
|
||||||
use crate::StuffedPtr;
|
use crate::StuffedPtr;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
@ -160,4 +160,13 @@ mod tests {
|
||||||
"StuffedPtr::Extra { extra: hello! }"
|
"StuffedPtr::Extra { extra: hello! }"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn needs_drop() {
|
||||||
|
let extra = PanicsInDrop;
|
||||||
|
let stuffed_ptr: StuffedPtr<(), PanicsInDrop> = StuffedPtr::new_extra(extra);
|
||||||
|
// the panicking drop needs to be called here!
|
||||||
|
drop(stuffed_ptr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,27 @@ pub mod test_strategies {
|
||||||
use crate::StuffingStrategy;
|
use crate::StuffingStrategy;
|
||||||
use std::fmt::{Debug, Formatter};
|
use std::fmt::{Debug, Formatter};
|
||||||
|
|
||||||
|
macro_rules! impl_usize_max_zst {
|
||||||
|
($ty:ident) => {
|
||||||
|
// this one lives in usize::MAX
|
||||||
|
unsafe impl StuffingStrategy for $ty {
|
||||||
|
type Extra = Self;
|
||||||
|
|
||||||
|
fn is_extra(data: usize) -> bool {
|
||||||
|
data == usize::MAX
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stuff_extra(_inner: Self::Extra) -> usize {
|
||||||
|
usize::MAX
|
||||||
|
}
|
||||||
|
|
||||||
|
fn extract_extra(_data: usize) -> Self::Extra {
|
||||||
|
$ty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub struct HasDebug;
|
pub struct HasDebug;
|
||||||
|
|
||||||
impl Debug for HasDebug {
|
impl Debug for HasDebug {
|
||||||
|
|
@ -29,19 +50,15 @@ pub mod test_strategies {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe impl StuffingStrategy for HasDebug {
|
impl_usize_max_zst!(HasDebug);
|
||||||
type Extra = Self;
|
|
||||||
|
|
||||||
fn is_extra(data: usize) -> bool {
|
pub struct PanicsInDrop;
|
||||||
data == usize::MAX
|
|
||||||
}
|
|
||||||
|
|
||||||
fn stuff_extra(_inner: Self::Extra) -> usize {
|
impl Drop for PanicsInDrop {
|
||||||
usize::MAX
|
fn drop(&mut self) {
|
||||||
}
|
panic!("oh no!!!");
|
||||||
|
|
||||||
fn extract_extra(_data: usize) -> Self::Extra {
|
|
||||||
Self
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_usize_max_zst!(PanicsInDrop);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue