Trait rocksdb::CStrLike

pub trait CStrLike {
    type Baked: Deref<Target = CStr>;
    type Error: Debug + Display;

    // Required methods
    fn bake(self) -> Result<Self::Baked, Self::Error>;
    fn into_c_string(self) -> Result<CString, Self::Error>;
}
Expand description

Value which can be converted into a C string.

The trait is used as argument to functions which wish to accept either &str or &CStr arguments while internally need to interact with C APIs. Accepting &str may be more convenient for users but requires conversion into CString internally which requires allocation. With this trait, latency-conscious users may choose to prepare CStr in advance and then pass it directly without having to incur the conversion cost.

To use the trait, function should accept impl CStrLike and after baking the argument (with CStrLike::bake method) it can use it as a &CStr (since the baked result dereferences into CStr).

§Example

use std::ffi::{CStr, CString};
use rocksdb::CStrLike;

fn strlen(arg: impl CStrLike) -> std::result::Result<usize, String> {
    let baked = arg.bake().map_err(|err| err.to_string())?;
    Ok(unsafe { libc::strlen(baked.as_ptr()) })
}

const FOO: &str = "foo";
const BAR: &CStr = unsafe { CStr::from_bytes_with_nul_unchecked(b"bar\0") };

assert_eq!(Ok(3), strlen(FOO));
assert_eq!(Ok(3), strlen(BAR));

Required Associated Types§

type Baked: Deref<Target = CStr>

type Error: Debug + Display

Required Methods§

fn bake(self) -> Result<Self::Baked, Self::Error>

Bakes self into value which can be freely converted into &CStr.

This may require allocation and may fail if self has invalid value.

fn into_c_string(self) -> Result<CString, Self::Error>

Consumers and converts value into an owned CString.

If Self is already a CString simply returns it; if it’s a reference to a CString then the value is cloned. In other cases this may require allocation and may fail if self has invalid value.

Implementations on Foreign Types§

§

impl CStrLike for &str

§

impl CStrLike for &String

§

impl CStrLike for &CStr

§

impl CStrLike for CString

§

impl<'a> CStrLike for &'a CString

§

type Baked = &'a CStr

§

type Error = Infallible

§

fn bake( self, ) -> Result<<&'a CString as CStrLike>::Baked, <&'a CString as CStrLike>::Error>

§

fn into_c_string(self) -> Result<CString, <&'a CString as CStrLike>::Error>

Implementors§

§

impl CStrLike for PropertyName

§

impl<'a> CStrLike for &'a PropName

§

type Baked = &'a CStr

§

type Error = Infallible

§

impl<'a> CStrLike for &'a PropertyName

§

type Baked = &'a CStr

§

type Error = Infallible