Trait objc2::encode::RefEncode

source ·
pub unsafe trait RefEncode {
    const ENCODING_REF: Encoding;
}
Expand description

Types whoose references has an Objective-C type-encoding.

Implementing this for T provides Encode implementations for:

  • *const T
  • *mut T
  • &T
  • &mut T
  • NonNull<T>
  • Option<&T>
  • Option<&mut T>
  • Option<NonNull<T>>

Reasoning behind this trait’s existence

External crates cannot implement Encode for pointers or Options containing references, so instead, they can implement this trait. Additionally it would be very cumbersome if every type had to implement Encode for all possible pointer types.

Finally, having this trait allows for much cleaner generic code that need to represent types that can be encoded as pointers.

Safety

References to the object must be FFI-safe.

See the nomicon entry on representing opaque structs for information on how to represent objects that you don’t know the layout of (or use extern type (RFC-1861) if you’re using nightly).

Objective-C will make assumptions about the type (like its size, alignment and ABI) from its encoding, so the implementer must verify that the encoding is accurate.

Concretely, Self::ENCODING_REF must match the result of running @encode in Objective-C with a pointer to the type in question.

Required Associated Constants§

source

const ENCODING_REF: Encoding

The Objective-C type-encoding for a reference of this type.

Should be one of Encoding::Object, Encoding::Block, Encoding::Class, Encoding::Pointer, Encoding::Sel or Encoding::Unknown.

Examples

This is usually implemented either as an object pointer:

const ENCODING_REF: Encoding = Encoding::Object;

Or as a pointer to the type, delegating the rest to the Encode implementation:

const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);

Implementations on Foreign Types§

source§

impl RefEncode for i64

source§

impl<Ret: EncodeReturn, A: Encode> RefEncode for unsafe extern "C" fn(_: A, ...) -> Ret

source§

impl<T: RefEncode + OptionEncode> RefEncode for Option<T>

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret

source§

impl RefEncode for AtomicU8

Available on target_has_atomic="8" only.
source§

impl RefEncode for AtomicU16

Available on target_has_atomic="16" only.
source§

impl RefEncode for AtomicI16

Available on target_has_atomic="16" only.
source§

impl<Ret: EncodeReturn, A: Encode> RefEncode for extern "C" fn(_: A, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret

source§

impl<T: RefEncode + ?Sized> RefEncode for NonNull<T>

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret

source§

impl RefEncode for *const c_void

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, ...) -> Ret

source§

impl RefEncode for NonZeroI16

source§

const ENCODING_REF: Encoding = i16::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode> RefEncode for extern "C" fn(_: A, _: B, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret

source§

impl<T: RefEncode + ?Sized> RefEncode for UnsafeCell<T>

source§

const ENCODING_REF: Encoding = T::ENCODING_REF

source§

impl<'a, T: RefEncode + ?Sized> RefEncode for &'a T

source§

impl<T: RefEncode> RefEncode for AtomicPtr<T>

Available on target_has_atomic="ptr" only.
source§

impl<Ret: EncodeReturn, A: Encode> RefEncode for extern "C" fn(_: A) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, ...) -> Ret

source§

impl RefEncode for NonZeroUsize

source§

const ENCODING_REF: Encoding = usize::ENCODING_REF

source§

impl RefEncode for NonZeroU64

source§

const ENCODING_REF: Encoding = u64::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret

source§

impl RefEncode for u8

Pointers to u8 use the special Encoding::String encoding.

source§

const ENCODING_REF: Encoding = Encoding::String

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode> RefEncode for unsafe extern "C" fn(_: A) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode> RefEncode for extern "C" fn(_: A, _: B) -> Ret

source§

impl RefEncode for NonZeroI64

source§

const ENCODING_REF: Encoding = i64::ENCODING_REF

source§

impl RefEncode for NonZeroIsize

source§

const ENCODING_REF: Encoding = isize::ENCODING_REF

source§

impl RefEncode for f32

source§

impl RefEncode for AtomicI8

Available on target_has_atomic="8" only.
source§

impl RefEncode for usize

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, ...) -> Ret

source§

impl RefEncode for *mut c_void

source§

impl RefEncode for AtomicUsize

Available on target_has_atomic="ptr" only.
source§

impl RefEncode for AtomicI64

Available on target_has_atomic="64" only.
source§

impl<T: Encode, const LENGTH: usize> RefEncode for [T; LENGTH]

source§

impl RefEncode for AtomicIsize

Available on target_has_atomic="ptr" only.
source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J) -> Ret

source§

impl RefEncode for AtomicU64

Available on target_has_atomic="64" only.
source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret

source§

impl<Ret: EncodeReturn> RefEncode for extern "C" fn() -> Ret

source§

impl RefEncode for f64

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K) -> Ret

source§

impl<T: RefEncode + ?Sized> RefEncode for *const T

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F) -> Ret

source§

impl RefEncode for NonZeroU16

source§

const ENCODING_REF: Encoding = u16::ENCODING_REF

source§

impl RefEncode for NonZeroI8

source§

const ENCODING_REF: Encoding = i8::ENCODING_REF

source§

impl RefEncode for NonZeroU32

source§

const ENCODING_REF: Encoding = u32::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I) -> Ret

source§

impl RefEncode for i8

Pointers to i8 use the special Encoding::String encoding.

source§

const ENCODING_REF: Encoding = Encoding::String

source§

impl<T: RefEncode + ?Sized> RefEncode for ManuallyDrop<T>

source§

const ENCODING_REF: Encoding = T::ENCODING_REF

source§

impl<T: RefEncode + ?Sized> RefEncode for Cell<T>

source§

const ENCODING_REF: Encoding = T::ENCODING_REF

source§

impl RefEncode for i32

source§

impl<T: RefEncode> RefEncode for Wrapping<T>

source§

const ENCODING_REF: Encoding = T::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret

source§

impl RefEncode for NonZeroI32

source§

const ENCODING_REF: Encoding = i32::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret

source§

impl RefEncode for i16

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret

source§

impl RefEncode for NonNull<c_void>

source§

impl RefEncode for AtomicI32

Available on target_has_atomic="32" only.
source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, ...) -> Ret

source§

impl RefEncode for u64

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, ...) -> Ret

source§

impl<'a, T: RefEncode + ?Sized> RefEncode for &'a mut T

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode, L: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, ...) -> Ret

source§

impl RefEncode for u16

source§

impl RefEncode for isize

source§

impl RefEncode for AtomicU32

Available on target_has_atomic="32" only.
source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode, L: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, ...) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode, L: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E) -> Ret

source§

impl<T: RefEncode + ?Sized> RefEncode for *mut T

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, ...) -> Ret

source§

impl<T: RefEncode> RefEncode for MaybeUninit<T>

source§

const ENCODING_REF: Encoding = T::ENCODING_REF

source§

impl RefEncode for u32

source§

impl<Ret: EncodeReturn> RefEncode for unsafe extern "C" fn() -> Ret

source§

impl RefEncode for NonZeroU8

source§

const ENCODING_REF: Encoding = u8::ENCODING_REF

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode> RefEncode for unsafe extern "C" fn(_: A, _: B) -> Ret

source§

impl<Ret: EncodeReturn, A: Encode, B: Encode, C: Encode, D: Encode, E: Encode, F: Encode, G: Encode, H: Encode, I: Encode, J: Encode, K: Encode, L: Encode> RefEncode for extern "C" fn(_: A, _: B, _: C, _: D, _: E, _: F, _: G, _: H, _: I, _: J, _: K, _: L, ...) -> Ret

Implementors§

source§

impl RefEncode for Exception

source§

const ENCODING_REF: Encoding = Encoding::Object

source§

impl RefEncode for AnyClass

source§

const ENCODING_REF: Encoding = Encoding::Class

source§

impl RefEncode for AnyObject

source§

const ENCODING_REF: Encoding = Encoding::Object

source§

impl RefEncode for AnyProtocol

source§

const ENCODING_REF: Encoding = Encoding::Object

source§

impl RefEncode for Bool

source§

impl RefEncode for NSObject

source§

const ENCODING_REF: Encoding = <AnyObject as crate::RefEncode>::ENCODING_REF

source§

impl RefEncode for NSZone

source§

impl<P: ?Sized + ProtocolType> RefEncode for ProtocolObject<P>

source§

const ENCODING_REF: Encoding = Encoding::Object