Struct OpaqueFnPtr

Source
pub struct OpaqueFnPtr(/* private fields */);
Expand description

The void* equivalent for a function pointer, for when you need to handle “some fn”.

Some platforms (WASM, AVR) have non-uniform representations for “code” and “data” pointers. Such platforms are referred to as “Harvard Architectures”.

Rust does not have a good way for talking about “some” function pointer, so it’s pretty common to cast to a usize or a raw pointer to make it easier. The entire point of strict provenance is to make you not do usize casts, so obviously we’re not a fan of that. But the other approach also isn’t great because Oxford Casts Are A Mess.

So really you want to stay in “definitely doing function pointers”, which means you want a proper opaque function pointer type. This type attempts to be that but is honestly not very good at it, because it immediately runs into the exact problem it’s trying to solve: Rust makes it really hard to talk about “some” function pointer, so we can’t actually describe its interface!

This really needs proper language support.

(In the meantime, func as usize and usize as func are genuinely the less evil casts here! Don’t do Oxford Casts if you want your code to be maximally portable!)

Implementations§

Source§

impl OpaqueFnPtr

Source

pub unsafe fn from_fn<T>(func: T) -> Self

Create an OpaqueFnPtr from some fn.

Rust doesn’t have a good way to express, so this just takes “anything” and it’s up to you to make sure you’re actually feeding in a function pointer.

If you feed in anything else, it is Undefined Behaviour.

Source

pub unsafe fn to_fn<T>(self) -> T

Create a fn from an OpaqueFnPtr.

Rust doesn’t have a good way to express, so this just takes “anything” and it’s up to you to make sure you’re actually feeding in a function pointer type.

If you feed in anything else, it is Undefined Behaviour.

Source

pub fn addr(self) -> usize

Get the address of the function pointer.

Note that while you can compare this to a data pointer, the result will almost certainly be meaningless, especially on platforms like WASM and AVR where function pointers are in a separate address-space from data pointers.

See pointer::addr for details.

Trait Implementations§

Source§

impl Clone for OpaqueFnPtr

Source§

fn clone(&self) -> OpaqueFnPtr

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for OpaqueFnPtr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for OpaqueFnPtr

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for OpaqueFnPtr

Source§

fn cmp(&self, other: &OpaqueFnPtr) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for OpaqueFnPtr

Source§

fn eq(&self, other: &OpaqueFnPtr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for OpaqueFnPtr

Source§

fn partial_cmp(&self, other: &OpaqueFnPtr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Copy for OpaqueFnPtr

Source§

impl Eq for OpaqueFnPtr

Source§

impl StructuralPartialEq for OpaqueFnPtr

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.