as-is 0.0.4-alpha

An abstraction over ownership
Documentation
//! A stub for [`ToOwned`] used in a `no_std` environment.
//!
//! [`ToOwned`]: https://doc.rust-lang.org/alloc/borrow/trait.ToOwned.html

use core::borrow::Borrow;
use core::ffi::CStr;

/// A stub for [`ToOwned`].
///
/// [`ToOwned`]: https://doc.rust-lang.org/alloc/borrow/trait.ToOwned.html
pub trait ToOwnedStub {
    /// The resulting type after obtaining ownership.
    type Owned: Borrow<Self>;
}

impl<T> ToOwnedStub for T
where
    T: Clone,
{
    type Owned = Self;
}

#[derive(Clone)]
enum Never {}

/// A stub for [`String`].
///
/// [`String`]: https://doc.rust-lang.org/alloc/string/struct.String.html
#[derive(Clone)]
pub struct StringStub(Never);

impl Borrow<str> for StringStub {
    fn borrow(&self) -> &str {
        unreachable!()
    }
}

impl ToOwnedStub for str {
    type Owned = StringStub;
}

/// A stub for [`CString`].
///
/// [`CString`]: https://doc.rust-lang.org/nightly/alloc/ffi/struct.CString.html
#[derive(Clone)]
pub struct CStringStub(Never);

impl Borrow<CStr> for CStringStub {
    fn borrow(&self) -> &CStr {
        unreachable!()
    }
}

impl ToOwnedStub for CStr {
    type Owned = CStringStub;
}

/// A stub for [`Vec<T>`].
///
/// [`Vec<T>`]: https://doc.rust-lang.org/alloc/vec/struct.Vec.html
#[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>;
}