use std::marker::PhantomData;
use crate::{
data::managed::{
string::JuliaString,
symbol::{
Symbol,
static_symbol::{StaticSymbol, Sym},
},
},
memory::target::Target,
private::Private,
};
pub trait ToSymbol: private::ToSymbolPriv {
#[inline]
fn to_symbol<'target, Tgt: Target<'target>>(&self, _: &Tgt) -> Symbol<'target> {
unsafe { self.to_symbol_priv(Private) }
}
}
impl<T: AsRef<str>> ToSymbol for T {}
impl ToSymbol for Symbol<'_> {}
impl ToSymbol for JuliaString<'_> {}
impl<S: StaticSymbol> ToSymbol for Sym<'_, PhantomData<S>> {}
impl<S: StaticSymbol> ToSymbol for Sym<'_, S> {}
pub(crate) mod private {
use std::marker::PhantomData;
use super::{StaticSymbol, Sym};
use crate::{
data::managed::{private::ManagedPriv, string::JuliaString, symbol::Symbol},
memory::target::unrooted::Unrooted,
private::Private,
};
pub trait ToSymbolPriv {
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol>;
}
impl<T: AsRef<str>> ToSymbolPriv for T {
#[inline]
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol> {
unsafe {
let unrooted = Unrooted::new();
Symbol::new(&unrooted, self)
}
}
}
impl<S: StaticSymbol> ToSymbolPriv for Sym<'_, S> {
#[inline]
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol> {
unsafe {
let unrooted = Unrooted::new();
S::get_symbol(&unrooted)
}
}
}
impl<S: StaticSymbol> ToSymbolPriv for Sym<'_, PhantomData<S>> {
#[inline]
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol> {
unsafe {
let unrooted = Unrooted::new();
S::get_symbol(&unrooted)
}
}
}
impl ToSymbolPriv for JuliaString<'_> {
#[inline]
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol> {
unsafe {
let symbol_ptr = self.as_bytes();
let unrooted = Unrooted::new();
Symbol::new_bytes(&unrooted, symbol_ptr).unwrap()
}
}
}
impl ToSymbolPriv for Symbol<'_> {
#[inline]
unsafe fn to_symbol_priv<'symbol>(&self, _: Private) -> Symbol<'symbol> {
unsafe { Symbol::wrap_non_null(self.unwrap_non_null(Private), Private) }
}
}
}