Shared

Struct Shared 

Source
pub struct Shared<T> { /* private fields */ }
Expand description

A typed wrapper for a reference.

This is identical in layout to AnyObj, but provides a statically type-checked container.

Implementations§

Source§

impl<T> Shared<T>
where T: Any,

Source

pub fn new(value: T) -> Result<Self>

Construct a new typed shared value.

§Examples
use rune::Value;
use rune::runtime::Shared;
use rune::alloc::String;

let string = String::try_from("Hello World")?;
let string = Shared::new(string)?;
let string = Value::from(string);

let string = string.into_any_obj()?;
assert_eq!(string.borrow_ref::<String>()?.as_str(), "Hello World");
Source

pub fn take(self) -> Result<T, AnyObjError>

Take the owned value of type T.

This consumes any live references of the value and accessing them in the future will result in an error.

§Errors

This errors if the underlying value is not owned.

Source

pub fn into_ref(self) -> Result<Ref<T>, AnyObjError>

Downcast into an owned value of type Ref<T>.

§Errors

This errors in case the underlying value is not owned, non-owned references cannot be coerced into Ref<T>.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

let reference = value.clone().into_ref()?;
assert!(value.borrow_ref().is_ok());
assert_eq!(reference.0, 42);
Source

pub fn into_mut(self) -> Result<Mut<T>, AnyObjError>

Downcast into an owned value of type Mut<T>.

§Errors

This errors in case the underlying value is not owned, non-owned references cannot be coerced into Mut<T>.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

let mut mutable = value.clone().into_mut()?;
assert!(value.borrow_ref().is_err());
mutable.0 += 1;
drop(mutable);

assert_eq!(value.borrow_ref()?.0, 43);
Source

pub fn borrow_ref(&self) -> Result<BorrowRef<'_, T>, AnyObjError>

Borrow a shared reference to the value while checking for shared access.

This prevents other exclusive accesses from being performed while the guard returned from this function is live.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

let borrowed = value.borrow_ref()?;
assert!(value.borrow_ref().is_ok());
drop(borrowed);
assert!(value.borrow_ref().is_ok());
Source

pub fn borrow_mut(&self) -> Result<BorrowMut<'_, T>, AnyObjError>

Borrow an exclusive reference to the value.

This prevents other accesses from being performed while the guard returned from this function is live.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

let borrowed = value.borrow_mut()?;
assert!(value.borrow_ref().is_err());
drop(borrowed);
assert!(value.borrow_ref().is_ok());
Source

pub fn is_readable(&self) -> bool

Test if the value is sharable.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

{
    assert!(value.is_writable());

    let borrowed = value.borrow_mut()?;
    assert!(!value.is_writable());
    drop(borrowed);
    assert!(value.is_writable());
}

let foo = Struct(42);

{
    let (value, guard) = unsafe { Value::from_ref(&foo)? };
    let value = value.into_shared::<Struct>()?;
    assert!(value.is_readable());
    assert!(!value.is_writable());
}

let mut foo = Struct(42);

{
    let (value, guard) = unsafe { Value::from_mut(&mut foo)? };
    let value = value.into_shared::<Struct>()?;
    assert!(value.is_readable());
    assert!(value.is_writable());
}
Source

pub fn is_writable(&self) -> bool

Test if a value is writable.

§Examples
use rune::{Any, Value};

#[derive(Any)]
struct Struct(u32);

let value = Value::new(Struct(42))?;
let value = value.into_shared::<Struct>()?;

{
    assert!(value.is_writable());

    let borrowed = value.borrow_mut()?;
    assert!(!value.is_writable());
    drop(borrowed);
    assert!(value.is_writable());
}

let foo = Struct(42);

{
    let (value, guard) = unsafe { Value::from_ref(&foo)? };
    let value = value.into_shared::<Struct>()?;
    assert!(value.is_readable());
    assert!(!value.is_writable());
}

let mut foo = Struct(42);

{
    let (value, guard) = unsafe { Value::from_mut(&mut foo)? };
    let value = value.into_shared::<Struct>()?;
    assert!(value.is_readable());
    assert!(value.is_writable());
}
Source

pub fn type_hash(&self) -> Hash

Access the underlying type id for the data.

Source

pub fn type_info(&self) -> TypeInfo

Access full type info for the underlying type.

Trait Implementations§

Source§

impl<T> Clone for Shared<T>
where T: Any,

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
Source§

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

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for Shared<T>
where T: Any,

Source§

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

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

impl<T> Drop for Shared<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> From<Shared<T>> for Value
where T: Any,

Conversion from a Shared<T> into a Value.

§Examples

use rune::Value;
use rune::runtime::Shared;
use rune::alloc::String;

let string = String::try_from("Hello World")?;
let string = Shared::new(string)?;
let string = Value::from(string);

let string = string.into_any_obj()?;
assert_eq!(string.borrow_ref::<String>()?.as_str(), "Hello World");
Source§

fn from(value: Shared<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> FromValue for Shared<T>
where T: AnyMarker,

Source§

fn from_value(value: Value) -> Result<Self, RuntimeError>

Try to convert to the given type, from the given value.
Source§

impl<T> MaybeTypeOf for Shared<T>
where T: MaybeTypeOf,

Source§

fn maybe_type_of() -> Result<DocType>

Type information for the given type.
Source§

impl<T> ToValue for Shared<T>
where T: AnyMarker,

Source§

fn to_value(self) -> Result<Value, RuntimeError>

Convert into a value.
Source§

impl<T> TryClone for Shared<T>
where T: Any,

Source§

fn try_clone(&self) -> Result<Self>

Try to clone the current value, raising an allocation error if it’s unsuccessful.
Source§

fn try_clone_from(&mut self, source: &Self) -> Result<()>

Performs copy-assignment from source. Read more
Source§

impl<T> TypeHash for Shared<T>
where T: TypeHash,

Source§

const HASH: Hash = T::HASH

The complete type hash of the type including type parameters which uniquely identifiers a given type. Read more
Source§

impl<T> TypeOf for Shared<T>
where T: TypeOf,

Source§

const PARAMETERS: Hash = T::PARAMETERS

Type parameters for the type. Read more
Source§

const STATIC_TYPE_INFO: AnyTypeInfo = T::STATIC_TYPE_INFO

Access diagnostical type information for the current type. Read more
Source§

fn type_info() -> TypeInfo

Get type info associated with the current type.

Auto Trait Implementations§

§

impl<T> Freeze for Shared<T>

§

impl<T> !RefUnwindSafe for Shared<T>

§

impl<T> !Send for Shared<T>

§

impl<T> !Sync for Shared<T>

§

impl<T> Unpin for Shared<T>
where T: Unpin,

§

impl<T> !UnwindSafe for Shared<T>

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoReturn for T
where T: ToValue,

Source§

fn into_return(self) -> Result<Value, VmError>

Convert something into a return value.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.
Source§

impl<T> TryToOwned for T
where T: TryClone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn try_to_owned(&self) -> Result<T, Error>

Creates owned data from borrowed data, usually by cloning. Read more
Source§

impl<T> UnsafeToValue for T
where T: ToValue,

Source§

type Guard = ()

The type used to guard the unsafe value conversion.
Source§

unsafe fn unsafe_to_value( self, ) -> Result<(Value, <T as UnsafeToValue>::Guard), RuntimeError>

Convert into a value. Read more
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,