use crate::*;
use std::ffi::*;
use std::os::raw::c_char;
use std::ptr::*;
pub unsafe trait AsCStr {
fn as_cstr(&self) -> *const c_char;
}
unsafe impl AsCStr for CStrNonNull<'_> {
fn as_cstr(&self) -> *const c_char { self.as_ptr() }
}
unsafe impl AsCStr for &'_ CStr {
fn as_cstr(&self) -> *const c_char { self.as_ptr() }
}
unsafe impl AsCStr for CString {
fn as_cstr(&self) -> *const c_char { self.as_ptr() }
}
pub unsafe trait AsOptCStr {
fn as_opt_cstr(&self) -> *const c_char;
}
unsafe impl AsOptCStr for () {
fn as_opt_cstr(&self) -> *const c_char { null() }
}
unsafe impl AsOptCStr for CStrPtr<'_> {
fn as_opt_cstr(&self) -> *const c_char { self.as_ptr() }
}
unsafe impl<T: AsCStr> AsOptCStr for T {
fn as_opt_cstr(&self) -> *const c_char { self.as_cstr() }
}
unsafe impl<T: AsCStr> AsOptCStr for Option<T> {
fn as_opt_cstr(&self) -> *const c_char { self.as_ref().map_or(null(), |s| s.as_cstr()) }
}