use std::ffi::c_char;
#[cfg(not(feature = "cstring_tokens"))]
mod inner {
use super::*;
use ustr::{Ustr, ustr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Token(Ustr);
impl Token {
#[inline(always)]
pub fn new(s: &str) -> Self {
Self(ustr(s))
}
#[inline(always)]
pub fn as_str(&self) -> &str {
self.0.as_str()
}
#[inline(always)]
pub fn as_char_ptr(&self) -> *const c_char {
self.0.as_char_ptr()
}
}
impl From<&str> for Token {
#[inline(always)]
fn from(s: &str) -> Self {
Self::new(s)
}
}
impl PartialEq<Ustr> for Token {
fn eq(&self, other: &Ustr) -> bool {
self.0 == *other
}
}
}
#[cfg(feature = "cstring_tokens")]
mod inner {
use super::*;
use std::ffi::CString;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Token(CString);
impl Token {
#[inline(always)]
pub fn new(s: &str) -> Self {
Self(CString::new(s).expect("Token string contains NUL byte"))
}
#[inline(always)]
pub fn as_str(&self) -> &str {
self.0.to_str().expect("Token contains invalid UTF-8")
}
#[inline(always)]
pub fn as_char_ptr(&self) -> *const c_char {
self.0.as_ptr()
}
}
impl From<&str> for Token {
#[inline(always)]
fn from(s: &str) -> Self {
Self::new(s)
}
}
}
pub use inner::Token;