Expand description
The meat of the crate. The trait.
This trait describes that a type has a defined / fixed #[repr(C)]
layout.
This is expressed at the type level by the unsafe
(trait) type
association of ReprC::CLayout
, which must be a CType
.
Because of that property, the type may be used in the API of an
#[ffi_export]
-ed function, where ABI-wise it will be replaced by its
equivalent C layout.
Then, #[ffi_export]
will transmute the CType
parameters back to the
provided ReprC
types, using from_raw_unchecked
.
Although, from a pure point of view, no checks are performed at this step
whatsoever, in practice, when debug_assertions
are enabled, some “sanity
checks” are performed on the input parameters: ReprC::is_valid
is
called in that case (as part of the implementation of from_raw
).
-
Although that may look innocent, it is actually pretty powerful tool:
For instance, a non-null pointer coming from C can, this way, be automatically checked and unwrapped, and the same applies for enumerations having a finite number of valid bit-patterns.
Safety
It must be sound to transmute from a ReprC::CLayout
instance when the
bit pattern represents a safe instance of Self
.
Implementing ReprC
It is generally recommended to avoid manually (and unsafe
-ly)
implementing the ReprC
trait. Instead, the recommended and blessed way
is to use the #[derive_ReprC]
attribute on your #[repr(C)] struct
(or your field-less
#[repr(<integer>)] enum
).
Examples
Simple struct
use ::safer_ffi::prelude::*;
#[derive_ReprC]
#[repr(C)]
struct Instant {
seconds: u64,
nanos: u32,
}
-
corresponding to the following C definition:
typedef struct { uint64_t seconds; uint32_t nanos; } Instant_t;
Field-less enum
use ::safer_ffi::prelude::*;
#[derive_ReprC]
#[repr(u8)]
enum Status {
Ok = 0,
Busy,
NotInTheMood,
OnStrike,
OhNo,
}
-
corresponding to the following C definition:
typedef uint8_t Status_t; enum { STATUS_OK = 0, STATUS_BUSY, STATUS_NOT_IN_THE_MOOD, STATUS_ON_STRIKE, STATUS_OH_NO, }
Generic struct
use ::safer_ffi::prelude::*;
#[derive_ReprC]
#[repr(C)]
struct Point<Coordinate : ReprC> {
x: Coordinate,
y: Coordinate,
}
Each monomorphization leads to its own C definition:
-
Point<i32>
typedef struct { int32_t x; int32_t y; } Point_int32_t;
-
Point<f64>
typedef struct { double x; double y; } Point_double_t;
Required Associated Types
Required Methods
sourcefn is_valid(it: &Self::CLayout) -> bool
fn is_valid(it: &Self::CLayout) -> bool
Sanity checks that can be performed on an instance of the CType
layout.
Such checks are performed when calling from_raw
, or equivalently
(⚠️ only with debug_assertions
enabled ⚠️), from_raw_unchecked
.
Implementation-wise, this function is only a “sanity check” step:
-
It is valid (although rather pointless) for this function to always return
true
, even if the input may beunsafe
to transmute toSelf
, or even be an invalid value of typeSelf
. -
In the other direction, it is not unsound, although it would be a logic error, to always return
false
. -
This is because it is impossible to have a function that for any type is able to tell if a given bit pattern is a safe value of that type.
In practice, if this function returns false
, then such result must be
trusted, i.e., transmuting such instance to the Self
type will,
at the very least, break a safety invariant, and it will even most
probably break a validity invariant.
On the other hand, if the function returns true
, then the result is
inconclusive; there is no explicit reason to stop going on, but that
doesn’t necessarily make it sound.
TL,DR
This function may yield false positives but no false negatives.
Example: Self = &'borrow i32
When Self = &'borrow i32
, we know that the backing pointer is
necessarily non-null and well-aligned.
This means that bit-patterns such as 0 as *const i32
or
37 as *const i32
are “blatantly unsound” to transmute to a
&'borrow i32
, and thus <&'borrow i32 as ReprC>::is_valid
will
return false
in such cases.
But if given 4 as *const i32
, or if given { let p = &*Box::new(42) as *const i32; p }
, then is_valid
will return true
in both cases,
since it doesn’t know better.
Example: bool
or #[repr(u8)] enum Foo { A, B }
In the case of bool
, or in the case of a #[repr(<integer>)]
field-less enum, then the valid bit-patterns and the invalid
bit-patterns are all known and finite.
In that case, ReprC::is_valid
will return a bool
that truly
represents the validity of the bit-pattern, in both directions
- i.e., no false positives (validity-wise);
Still, there may be safety invariants involved with custom types, so even then it is unclear.
Implementations on Foreign Types
sourceimpl<T: ?Sized> ReprC for PhantomData<T>
impl<T: ?Sized> ReprC for PhantomData<T>
sourceimpl<Ret: ReprC> ReprC for Option<unsafe extern "C" fn() -> Ret>
impl<Ret: ReprC> ReprC for Option<unsafe extern "C" fn() -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC> ReprC for Option<extern "C" fn() -> Ret>
impl<Ret: ReprC> ReprC for Option<extern "C" fn() -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC> ReprC for unsafe extern "C" fn() -> Ret
impl<Ret: ReprC> ReprC for unsafe extern "C" fn() -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC> ReprC for extern "C" fn() -> Ret
impl<Ret: ReprC> ReprC for extern "C" fn() -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A2: ReprC> ReprC for Option<unsafe extern "C" fn(_: A2) -> Ret>
impl<Ret: ReprC, A2: ReprC> ReprC for Option<unsafe extern "C" fn(_: A2) -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A2: ReprC> ReprC for Option<extern "C" fn(_: A2) -> Ret>
impl<Ret: ReprC, A2: ReprC> ReprC for Option<extern "C" fn(_: A2) -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A2: ReprC> ReprC for unsafe extern "C" fn(_: A2) -> Ret
impl<Ret: ReprC, A2: ReprC> ReprC for unsafe extern "C" fn(_: A2) -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A2: ReprC> ReprC for extern "C" fn(_: A2) -> Ret
impl<Ret: ReprC, A2: ReprC> ReprC for extern "C" fn(_: A2) -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for Option<unsafe extern "C" fn(_: A1, _: A2) -> Ret>
impl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for Option<unsafe extern "C" fn(_: A1, _: A2) -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for Option<extern "C" fn(_: A1, _: A2) -> Ret>
impl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for Option<extern "C" fn(_: A1, _: A2) -> Ret>
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for unsafe extern "C" fn(_: A1, _: A2) -> Ret
impl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for unsafe extern "C" fn(_: A1, _: A2) -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for extern "C" fn(_: A1, _: A2) -> Ret
impl<Ret: ReprC, A1: ReprC, A2: ReprC> ReprC for extern "C" fn(_: A1, _: A2) -> Ret
Simplified for lighter documentation, but the actual impls include up to 9 function parameters.
sourceimpl<Item: ReprC> ReprC for [Item; 1]
impl<Item: ReprC> ReprC for [Item; 1]
Simplified for lighter documentation, but the actual impls
range from 1
up to 32
, plus a bunch of significant
lengths up to 1024
.
sourceimpl<Item: ReprC> ReprC for [Item; 2]
impl<Item: ReprC> ReprC for [Item; 2]
Simplified for lighter documentation, but the actual impls
range from 1
up to 32
, plus a bunch of significant
lengths up to 1024
.
sourceimpl<K, V> ReprC for HashMap<K, V>
impl<K, V> ReprC for HashMap<K, V>
type CLayout = OpaqueLayout_<PhantomData<HashMap<K, V, RandomState>>>
fn is_valid(_: &Self::CLayout) -> bool
Implementors
sourceimpl ReprC for PollFuture
Available on crate features futures
and dyn-traits
only.
impl ReprC for PollFuture
futures
and dyn-traits
only.type CLayout = PollFuture_Layout
sourceimpl ReprC for char_p_boxedwhere
NonNullOwned<c_char>: ReprC,
impl ReprC for char_p_boxedwhere
NonNullOwned<c_char>: ReprC,
type CLayout = <NonNullOwned<c_char> as ReprC>::CLayout
sourceimpl ReprC for char_p_rawwhere
NonNullRef<c_char>: ReprC,
impl ReprC for char_p_rawwhere
NonNullRef<c_char>: ReprC,
type CLayout = <NonNullRef<c_char> as ReprC>::CLayout
sourceimpl ReprC for DynDropwhere
VirtualPtr<dyn Send + Sync + StaticDropGlue + 'static>: ReprC,
Available on crate feature dyn-traits
only.
impl ReprC for DynDropwhere
VirtualPtr<dyn Send + Sync + StaticDropGlue + 'static>: ReprC,
dyn-traits
only.type CLayout = <VirtualPtr<dyn StaticDropGlue + Send + Sync + 'static> as ReprC>::CLayout
sourceimpl ReprC for PollFuture_Layout
Available on crate features futures
and dyn-traits
only.
impl ReprC for PollFuture_Layout
futures
and dyn-traits
only.type CLayout = PollFuture_Layout
sourceimpl ReprC for Erased
Available on crate feature dyn-traits
only.
impl ReprC for Erased
dyn-traits
only.type CLayout = __opaque_Erased
sourceimpl ReprC for str_boxedwhere
slice_boxed<u8>: ReprC,
impl ReprC for str_boxedwhere
slice_boxed<u8>: ReprC,
type CLayout = <slice_boxed<u8> as ReprC>::CLayout
sourceimpl<'__usability> ReprC for DropGlueVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate feature dyn-traits
only.
impl<'__usability> ReprC for DropGlueVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
dyn-traits
only.type CLayout = DropGlueVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for DropGlueVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate feature dyn-traits
only.
impl<'__usability> ReprC for DropGlueVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
dyn-traits
only.type CLayout = DropGlueVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for StaticDropGlueVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate feature dyn-traits
only.
impl<'__usability> ReprC for StaticDropGlueVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
dyn-traits
only.type CLayout = StaticDropGlueVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for StaticDropGlueVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate feature dyn-traits
only.
impl<'__usability> ReprC for StaticDropGlueVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
dyn-traits
only.type CLayout = StaticDropGlueVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for FfiFutureExecutorVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<Box<dyn Send + FnMut() + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn FfiFuture + 'static>>) -> CLayoutOf<()>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> CLayoutOf<VirtualPtr<dyn DropGlue + 'static>>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate features futures
and dyn-traits
only.
impl<'__usability> ReprC for FfiFutureExecutorVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<Box<dyn Send + FnMut() + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn FfiFuture + 'static>>) -> CLayoutOf<()>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> CLayoutOf<VirtualPtr<dyn DropGlue + 'static>>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
futures
and dyn-traits
only.type CLayout = FfiFutureExecutorVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for FfiFutureExecutorVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<Box<dyn Send + FnMut() + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn FfiFuture + 'static>>) -> CLayoutOf<()>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> CLayoutOf<VirtualPtr<dyn DropGlue + 'static>>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate features futures
and dyn-traits
only.
impl<'__usability> ReprC for FfiFutureExecutorVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> NonNullOwned<ErasedTy>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<Box<dyn Send + FnMut() + 'static>>) -> CLayoutOf<VirtualPtr<dyn Send + FfiFuture + 'static>>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>, _: CLayoutOf<VirtualPtr<dyn FfiFuture + 'static>>) -> CLayoutOf<()>: ConcreteReprC,
unsafe extern "C" fn(_: NonNullRef<ErasedTy>) -> CLayoutOf<VirtualPtr<dyn DropGlue + 'static>>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
futures
and dyn-traits
only.type CLayout = FfiFutureExecutorVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for FfiFutureVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullMut<ErasedTy>, _: CLayoutOf<&'static mut Context<'static>>) -> CLayoutOf<PollFuture>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate features futures
and dyn-traits
only.
impl<'__usability> ReprC for FfiFutureVTable<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullMut<ErasedTy>, _: CLayoutOf<&'static mut Context<'static>>) -> CLayoutOf<PollFuture>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
futures
and dyn-traits
only.type CLayout = FfiFutureVTable_Layout<'__usability>
sourceimpl<'__usability> ReprC for FfiFutureVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullMut<ErasedTy>, _: CLayoutOf<&'static mut Context<'static>>) -> CLayoutOf<PollFuture>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
Available on crate features futures
and dyn-traits
only.
impl<'__usability> ReprC for FfiFutureVTable_Layout<'__usability>where
unsafe extern "C" fn(_: NonNullOwned<ErasedTy>): ConcreteReprC,
unsafe extern "C" fn(_: NonNullMut<ErasedTy>, _: CLayoutOf<&'static mut Context<'static>>) -> CLayoutOf<PollFuture>: ConcreteReprC,
PhantomData<*mut (<u8 as IdentityIgnoring<'__usability>>::ItSelf,)>: ConcreteReprC,
futures
and dyn-traits
only.type CLayout = FfiFutureVTable_Layout<'__usability>
sourceimpl<'a> ReprC for ErasedRef<'a>where
NonNullRef<ErasedTy>: ReprC,
Available on crate feature dyn-traits
only.
impl<'a> ReprC for ErasedRef<'a>where
NonNullRef<ErasedTy>: ReprC,
dyn-traits
only.type CLayout = <NonNullRef<Erased> as ReprC>::CLayout
sourceimpl<'lt> ReprC for char_p_ref<'lt>where
NonNullRef<c_char>: ReprC,
impl<'lt> ReprC for char_p_ref<'lt>where
NonNullRef<c_char>: ReprC,
type CLayout = <NonNullRef<c_char> as ReprC>::CLayout
sourceimpl<'lt, Ret> ReprC for RefDynFnMut0<'lt, Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, Ret> ReprC for RefDynFnMut0<'lt, Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = RefDynFnMut0_Layout<'lt, Ret>
sourceimpl<'lt, Ret> ReprC for RefDynFnMut0_Layout<'lt, Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, Ret> ReprC for RefDynFnMut0_Layout<'lt, Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = RefDynFnMut0_Layout<'lt, Ret>
sourceimpl<'lt, Ret, A1> ReprC for RefDynFnMut1<'lt, Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, Ret, A1> ReprC for RefDynFnMut1<'lt, Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = RefDynFnMut1_Layout<'lt, Ret, A1>
sourceimpl<'lt, Ret, A1> ReprC for RefDynFnMut1_Layout<'lt, Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, Ret, A1> ReprC for RefDynFnMut1_Layout<'lt, Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = RefDynFnMut1_Layout<'lt, Ret, A1>
sourceimpl<'lt, T> ReprC for slice_mut<'lt, T>where
T: 'lt,
T: ReprC,
NonNullMut<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, T> ReprC for slice_mut<'lt, T>where
T: 'lt,
T: ReprC,
NonNullMut<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = slice_mut_Layout<'lt, T>
sourceimpl<'lt, T> ReprC for slice_mut_Layout<'lt, T>where
T: 'lt,
T: ReprC,
NonNullMut<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, T> ReprC for slice_mut_Layout<'lt, T>where
T: 'lt,
T: ReprC,
NonNullMut<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = slice_mut_Layout<'lt, T>
sourceimpl<'lt, T> ReprC for slice_ref<'lt, T>where
T: 'lt,
T: ReprC,
NonNullRef<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, T> ReprC for slice_ref<'lt, T>where
T: 'lt,
T: ReprC,
NonNullRef<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = slice_ref_Layout<'lt, T>
sourceimpl<'lt, T> ReprC for slice_ref_Layout<'lt, T>where
T: 'lt,
T: ReprC,
NonNullRef<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
impl<'lt, T> ReprC for slice_ref_Layout<'lt, T>where
T: 'lt,
T: ReprC,
NonNullRef<T>: ConcreteReprC,
usize: ConcreteReprC,
PhantomData<&'lt ()>: ConcreteReprC,
type CLayout = slice_ref_Layout<'lt, T>
sourceimpl<DynTrait: ?Sized + ReprCTrait> ReprC for VirtualPtr<DynTrait>where
VirtualPtr_<NonNullOwned<Erased>, DynTrait::VTable>: ReprC,
Available on crate feature dyn-traits
only.
impl<DynTrait: ?Sized + ReprCTrait> ReprC for VirtualPtr<DynTrait>where
VirtualPtr_<NonNullOwned<Erased>, DynTrait::VTable>: ReprC,
dyn-traits
only.type CLayout = <VirtualPtr_<NonNullOwned<Erased>, <DynTrait as ReprCTrait>::VTable> as ReprC>::CLayout
sourceimpl<Ret> ReprC for ArcDynFn0<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret> ReprC for ArcDynFn0<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
alloc
only.type CLayout = ArcDynFn0_Layout<Ret>
sourceimpl<Ret> ReprC for ArcDynFn0_Layout<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret> ReprC for ArcDynFn0_Layout<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
alloc
only.type CLayout = ArcDynFn0_Layout<Ret>
sourceimpl<Ret> ReprC for BoxDynFnMut0<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret> ReprC for BoxDynFnMut0<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
alloc
only.type CLayout = BoxDynFnMut0_Layout<Ret>
sourceimpl<Ret> ReprC for BoxDynFnMut0_Layout<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret> ReprC for BoxDynFnMut0_Layout<Ret>where
Ret: ReprC,
Ret: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
alloc
only.type CLayout = BoxDynFnMut0_Layout<Ret>
sourceimpl<Ret, A1> ReprC for ArcDynFn1<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret, A1> ReprC for ArcDynFn1<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
alloc
only.type CLayout = ArcDynFn1_Layout<Ret, A1>
sourceimpl<Ret, A1> ReprC for ArcDynFn1_Layout<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret, A1> ReprC for ArcDynFn1_Layout<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Option<unsafe extern "C" fn(env_ptr: NonNull<c_void>)>: ConcreteReprC,
alloc
only.type CLayout = ArcDynFn1_Layout<Ret, A1>
sourceimpl<Ret, A1> ReprC for BoxDynFnMut1<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret, A1> ReprC for BoxDynFnMut1<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
alloc
only.type CLayout = BoxDynFnMut1_Layout<Ret, A1>
sourceimpl<Ret, A1> ReprC for BoxDynFnMut1_Layout<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
Available on crate feature alloc
only.
impl<Ret, A1> ReprC for BoxDynFnMut1_Layout<Ret, A1>where
Ret: ReprC,
A1: ReprC,
Ret: ReprC,
A1: ReprC,
NonNull<c_void>: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>, _: A1) -> Ret: ConcreteReprC,
unsafe extern "C" fn(env_ptr: NonNull<c_void>): ConcreteReprC,
alloc
only.type CLayout = BoxDynFnMut1_Layout<Ret, A1>
sourceimpl<T0, T1> ReprC for Tuple2<T0, T1>where
T0: ReprC,
T1: ReprC,
T0: ConcreteReprC,
T1: ConcreteReprC,
impl<T0, T1> ReprC for Tuple2<T0, T1>where
T0: ReprC,
T1: ReprC,
T0: ConcreteReprC,
T1: ConcreteReprC,
type CLayout = Tuple2_Layout<T0, T1>
sourceimpl<T0, T1> ReprC for Tuple2_Layout<T0, T1>where
T0: ReprC,
T1: ReprC,
T0: ConcreteReprC,
T1: ConcreteReprC,
impl<T0, T1> ReprC for Tuple2_Layout<T0, T1>where
T0: ReprC,
T1: ReprC,
T0: ConcreteReprC,
T1: ConcreteReprC,
type CLayout = Tuple2_Layout<T0, T1>
sourceimpl<T> ReprC for Box_<T>where
NonNullOwned<T>: ReprC,
Available on crate feature alloc
only.
impl<T> ReprC for Box_<T>where
NonNullOwned<T>: ReprC,
alloc
only.type CLayout = <NonNullOwned<T> as ReprC>::CLayout
sourceimpl<T> ReprC for slice_boxed<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
impl<T> ReprC for slice_boxed<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
type CLayout = slice_boxed_Layout<T>
sourceimpl<T> ReprC for slice_boxed_Layout<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
impl<T> ReprC for slice_boxed_Layout<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
type CLayout = slice_boxed_Layout<T>
sourceimpl<T> ReprC for slice_raw<T>where
T: ReprC,
NonNull<T>: ConcreteReprC,
usize: ConcreteReprC,
impl<T> ReprC for slice_raw<T>where
T: ReprC,
NonNull<T>: ConcreteReprC,
usize: ConcreteReprC,
type CLayout = slice_raw_Layout<T>
sourceimpl<T> ReprC for slice_raw_Layout<T>where
T: ReprC,
NonNull<T>: ConcreteReprC,
usize: ConcreteReprC,
impl<T> ReprC for slice_raw_Layout<T>where
T: ReprC,
NonNull<T>: ConcreteReprC,
usize: ConcreteReprC,
type CLayout = slice_raw_Layout<T>
sourceimpl<T> ReprC for safer_ffi::Vec<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
usize: ConcreteReprC,
Available on crate feature alloc
only.
impl<T> ReprC for safer_ffi::Vec<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
usize: ConcreteReprC,
alloc
only.type CLayout = Vec_Layout<T>
sourceimpl<T> ReprC for Vec_Layout<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
usize: ConcreteReprC,
Available on crate feature alloc
only.
impl<T> ReprC for Vec_Layout<T>where
T: ReprC,
NonNullOwned<T>: ConcreteReprC,
usize: ConcreteReprC,
usize: ConcreteReprC,
alloc
only.