use core::borrow::Borrow;
use core::ffi::CStr;
pub trait ToOwnedStub {
type Owned: Borrow<Self>;
}
impl<T> ToOwnedStub for T
where
T: Clone,
{
type Owned = Self;
}
#[derive(Clone)]
enum Never {}
#[derive(Clone)]
pub struct StringStub(Never);
impl Borrow<str> for StringStub {
fn borrow(&self) -> &str {
unreachable!()
}
}
impl ToOwnedStub for str {
type Owned = StringStub;
}
#[derive(Clone)]
pub struct CStringStub(Never);
impl Borrow<CStr> for CStringStub {
fn borrow(&self) -> &CStr {
unreachable!()
}
}
impl ToOwnedStub for CStr {
type Owned = CStringStub;
}
#[derive(Clone)]
pub struct VecStub<T>(T, Never);
impl<T> Borrow<[T]> for VecStub<T> {
fn borrow(&self) -> &[T] {
unreachable!()
}
}
impl<T> ToOwnedStub for [T]
where
T: Clone,
{
type Owned = VecStub<T>;
}