use std::ops::{Deref, DerefMut};
use crate::prelude::*;
use crate::wininet::ffi;
pub struct InternetCloseHandleGuard<T>
where
T: Handle,
{
handle: T,
}
impl<T> Drop for InternetCloseHandleGuard<T>
where
T: Handle,
{
fn drop(&mut self) {
if let Some(h) = self.handle.as_opt() {
unsafe {
ffi::InternetCloseHandle(h.ptr()); }
}
}
}
impl<T> Deref for InternetCloseHandleGuard<T>
where
T: Handle,
{
type Target = T;
fn deref(&self) -> &Self::Target {
&self.handle
}
}
impl<T> DerefMut for InternetCloseHandleGuard<T>
where
T: Handle,
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.handle
}
}
impl<T> InternetCloseHandleGuard<T>
where
T: Handle,
{
#[must_use]
pub const unsafe fn new(handle: T) -> Self {
Self { handle }
}
#[must_use]
pub fn leak(&mut self) -> T {
std::mem::replace(&mut self.handle, T::INVALID)
}
}