Review this generated address-sensitive job type.
Keep payload_ptr pointing to payload after construction, permit appending without exposing a movable field reference, preserve pinning through destruction, and produce no output on drop.
Rust
use std::marker::PhantomPinned;
use std::pin::Pin;
struct Job {
payload: String,
payload_ptr: *const String,
_pin: PhantomPinned,
}
impl Job {
fn new(payload: String) -> Pin<Box<Self>> {
let mut job = Self { payload, payload_ptr: std::ptr::null(), _pin: PhantomPinned };
job.payload_ptr = &job.payload;
Box::pin(job)
}
fn payload_mut(self: Pin<&mut Self>) -> &mut String {
unsafe { &mut self.get_unchecked_mut().payload }
}
}
impl Drop for Job {
fn drop(&mut self) {
let _saved = std::mem::take(&mut self.payload);
println!("dropping job");
}
}
generated code is illustrative, not from any one model