[][src]Struct abi_stable::sabi_types::rsmallbox::RSmallBox

#[repr(C)]
pub struct RSmallBox<T, Inline> { /* fields omitted */ }

A box type which stores small values inline as an optimization.

Inline storage

Inline is the storage space on the stack (as in inline with the RSmallBox struct) where small values get stored,instead of storing them on the heap.

It has to have an alignment greater than or equal to the value being stored, otherwise storing the value on the heap.

To ensure that the inline storage has enough alignemnt you can use one of the AlignTo* types from the (reexported) alignment submodule, or from abi_stable::inline_storage::alignment.

Examples

In a nonexhaustive enum

Using an RSmallBox to store a generic type in a nonexhaustive enum.

use abi_stable::{
    sabi_types::RSmallBox,
    std_types::RString,
    reexports::SelfOps,
    StableAbi,
};

#[repr(u8)]
#[derive(StableAbi,Debug,Clone,PartialEq)]
#[sabi(kind(WithNonExhaustive(
    // Determines the maximum size of this enum in semver compatible versions.
    // This is 7 usize large because:
    //    - The enum discriminant occupies 1 usize(because the enum is usize aligned).
    //    - RSmallBox<T,[usize;4]>: is 6 usize large
    size="[usize;7]",
    // Determines the traits that are required when wrapping this enum in NonExhaustive,
    // and are then available with it.
    traits(Debug,Clone,PartialEq),
)))]
pub enum SomeEnum<T>{
    #[doc(hidden)]
    __NonExhaustive,
    Foo,
    Bar,
    // This variant was added in a newer (compatible) version of the library.
    Baz(RSmallBox<T,[usize;4]>)
}

impl<T> SomeEnum<T>{
    pub fn is_inline(&self)->bool{
        match self {
            SomeEnum::__NonExhaustive=>true,
            SomeEnum::Foo=>true,
            SomeEnum::Bar=>true,
            SomeEnum::Baz(rsbox)=>RSmallBox::is_inline(rsbox),
        }
    }

    pub fn is_heap_allocated(&self)->bool{
        !self.is_inline()
    }

}


#[repr(C)]
#[derive(StableAbi,Debug,Clone,PartialEq)]
pub struct FullName{
    pub name:RString,
    pub surname:RString,
}


let rstring="Oh boy!"
    .piped(RString::from)
    .piped(RSmallBox::new)
    .piped(SomeEnum::Baz);

let full_name=
    FullName{ name:"R__e".into(), surname:"L_____e".into() }
        .piped(RSmallBox::new)
        .piped(SomeEnum::Baz);


assert!( rstring.is_inline() );
assert!( full_name.is_heap_allocated() );


Trying out different Inline type parameters

This example demonstrates how changing the Inline type parameter can change whether an RString is stored inline or on the heap.

use abi_stable::{
    inline_storage::alignment::AlignToUsize,
    sabi_types::RSmallBox,
    std_types::RString,
    StableAbi,
};

use std::mem;

type JustRightInlineBox<T>=
    RSmallBox<T,AlignToUsize<[u8; mem::size_of::<usize>()*4 ]>>;

let string=RString::from("What is that supposed to mean?");

let small=RSmallBox::<_,[usize;3]>::new(string.clone());
let medium=RSmallBox::<_,[usize;4]>::new(string.clone());
let large=RSmallBox::<_,[usize;16]>::new(string.clone());
let not_enough_alignment=RSmallBox::<_,[u8;64]>::new(string.clone());
let just_right=JustRightInlineBox::new(string.clone());


assert!( RSmallBox::is_heap_allocated(&small) );
assert!( RSmallBox::is_inline(&medium) );
assert!( RSmallBox::is_inline(&large) );
assert!( RSmallBox::is_heap_allocated(&not_enough_alignment) );
assert!( RSmallBox::is_inline(&just_right) );

Methods

impl<T, Inline> RSmallBox<T, Inline>[src]

pub fn new(value: T) -> RSmallBox<T, Inline> where
    Inline: InlineStorage
[src]

Constructs this RSmallBox from a value.

Example

use abi_stable::{
    sabi_types::RSmallBox,
    std_types::RString,
};
 
let xbox=RSmallBox::<_,[usize;4]>::new(RString::from("one"));
 

pub fn as_mut_ptr(this: &mut Self) -> *mut T[src]

Gets a raw pointer into the underlying data.

Example

use abi_stable::{
    sabi_types::RSmallBox,
    std_types::RString,
};
 
let mut play=RSmallBox::<_,[usize;4]>::new(RString::from("station"));
 
let play_addr=&mut play as *mut RSmallBox<_,_> as usize;
let heap_addr=RSmallBox::as_mut_ptr(&mut play) as usize;
 
assert_eq!(play_addr,heap_addr);

pub fn as_ptr(this: &Self) -> *const T[src]

Gets a raw pointer into the underlying data.

Example

use abi_stable::{
    sabi_types::RSmallBox,
    reexports::SelfOps,
    std_types::RVec,
};
 
let mut generations=vec![1,2,3,4,5,6,7,8]
    .piped(RVec::from)
    .piped(RSmallBox::<_,[usize;2]>::new);
 
let generations_addr=&mut generations as *mut RSmallBox<_,_> as usize;
let heap_addr=RSmallBox::as_ptr(&mut generations) as usize;
 
assert_ne!(generations_addr,heap_addr);

pub fn from_move_ptr(from_ptr: MovePtr<T>) -> Self where
    Inline: InlineStorage
[src]

Constructs this RSmallBox from a MovePtr.

Example

use abi_stable::{
    pointer_trait::OwnedPointer,
    sabi_types::RSmallBox,
    std_types::RBox,
};
 
let rbox=RBox::new(1000_u64);
let rsbox:RSmallBox<u64,[u64;1]>=
    rbox.in_move_ptr(|x| RSmallBox::<u64,[u64;1]>::from_move_ptr(x) );
 
assert_eq!( *rsbox, 1000_u64 );

pub fn move_<Inline2>(this: Self) -> RSmallBox<T, Inline2> where
    Inline2: InlineStorage
[src]

Converts this RSmallBox into another one with a differnet inline size.

Example

use abi_stable::sabi_types::RSmallBox;
 
let old=RSmallBox::<u64,[u8;4]>::new(599_u64);
assert!( ! RSmallBox::is_inline(&old) );

let new=RSmallBox::move_::<[u64;1]>(old);
assert!( RSmallBox::is_inline(&new) );
assert_eq!(*new,599_u64);

pub fn is_inline(this: &Self) -> bool[src]

Queries whether the value is stored inline.

Example

use abi_stable::{
    sabi_types::RSmallBox,
    std_types::RString,
};
 
let heap=RSmallBox::<u64,[u8;4]>::new(599_u64);
assert!( ! RSmallBox::is_inline(&heap) );

let inline=RSmallBox::<RString,[usize;4]>::new("hello".into());
assert!( RSmallBox::is_inline(&inline) );

pub fn is_heap_allocated(this: &Self) -> bool[src]

Queries whether the value is stored on the heap.

Example

use abi_stable::{
    sabi_types::RSmallBox,
    std_types::RHashMap,
};
 
let heap=RSmallBox::<_,[u8;4]>::new(String::new());
assert!( RSmallBox::is_heap_allocated(&heap) );

let inline=RSmallBox::<_,[usize;3]>::new(RHashMap::<u8,()>::new());
assert!( ! RSmallBox::is_heap_allocated(&inline) );

pub fn into_inner(this: Self) -> T[src]

Unwraps this pointer into its owned value.

Example

use abi_stable::sabi_types::RSmallBox;
 
let rbox=RSmallBox::<_,[usize;3]>::new(vec![0,1,2]);
assert_eq!( RSmallBox::into_inner(rbox), vec![0,1,2] );

Trait Implementations

impl<T, Inline> GetStaticEquivalent_ for RSmallBox<T, Inline> where
    T: __StableAbi,
    Inline: __GetStaticEquivalent_
[src]

type StaticEquivalent = _static_RSmallBox<__GetStaticEquivalent<T>, __GetStaticEquivalent<Inline>>

impl<T, Inline> SharedStableAbi for RSmallBox<T, Inline> where
    T: __StableAbi,
    Inline: __GetStaticEquivalent_
[src]

type IsNonZeroType = False

Whether this type has a single invalid bit-pattern. Read more

type Kind = __ValueKind

The kind of abi stability of this type,there are 2: Read more

impl<T, Inline> GetPointerKind for RSmallBox<T, Inline>[src]

impl<T, O, Inline> CanTransmuteElement<O> for RSmallBox<T, Inline>[src]

type TransmutedPtr = RSmallBox<O, Inline>

The type of the pointer after it's element type has been changed.

impl<T, Inline> OwnedPointer for RSmallBox<T, Inline>[src]

impl<T: Send, Inline> Send for RSmallBox<T, Inline>[src]

impl<T: Sync, Inline> Sync for RSmallBox<T, Inline>[src]

impl<T, Inline> Drop for RSmallBox<T, Inline>[src]

impl<T, Inline> Into<RBox<T>> for RSmallBox<T, Inline> where
    Inline: InlineStorage
[src]

Converts a RSmallBox into an RBox,currently this allocates.

impl<T, Inline> From<RBox<T>> for RSmallBox<T, Inline> where
    Inline: InlineStorage
[src]

Converts an RBox into an RSmallBox,currently this allocates.

impl<T, Inline> Clone for RSmallBox<T, Inline> where
    T: Clone,
    Inline: InlineStorage
[src]

impl<T, Inline> Default for RSmallBox<T, Inline> where
    T: Default,
    Inline: InlineStorage
[src]

impl<T, Inline> Eq for RSmallBox<T, Inline> where
    T: Eq,
    Inline: Eq
[src]

impl<T, Inline> Ord for RSmallBox<T, Inline> where
    T: Ord,
    Inline: Ord
[src]

impl<T, Inline> PartialEq<RSmallBox<T, Inline>> for RSmallBox<T, Inline> where
    T: PartialEq,
    Inline: PartialEq
[src]

impl<T, Inline> PartialOrd<RSmallBox<T, Inline>> for RSmallBox<T, Inline> where
    T: PartialOrd,
    Inline: PartialOrd
[src]

impl<T, Inline> Display for RSmallBox<T, Inline> where
    T: Display
[src]

impl<T, Inline> Debug for RSmallBox<T, Inline> where
    T: Debug,
    Inline: Debug
[src]

impl<T, Inline> Deref for RSmallBox<T, Inline>[src]

type Target = T

The resulting type after dereferencing.

impl<T, Inline> DerefMut for RSmallBox<T, Inline>[src]

impl<T, Inline> Hash for RSmallBox<T, Inline> where
    T: Hash,
    Inline: Hash
[src]

impl<'de, T, Inline> Deserialize<'de> for RSmallBox<T, Inline> where
    Inline: InlineStorage,
    T: Deserialize<'de>, 
[src]

impl<T, Inline> Serialize for RSmallBox<T, Inline> where
    T: Serialize
[src]

Auto Trait Implementations

impl<T, Inline> Unpin for RSmallBox<T, Inline> where
    Inline: Unpin,
    T: Unpin

impl<T, Inline> UnwindSafe for RSmallBox<T, Inline> where
    Inline: UnwindSafe,
    T: RefUnwindSafe + UnwindSafe

impl<T, Inline> RefUnwindSafe for RSmallBox<T, Inline> where
    Inline: RefUnwindSafe,
    T: RefUnwindSafe

Blanket Implementations

impl<This> GetConstGenericVTable for This where
    This: StableAbi + Eq + PartialEq<This> + Debug + Send + Sync
[src]

impl<This> StableAbi for This where
    This: SharedStableAbi<Kind = ValueKind>, 
[src]

impl<This> TransmuteElement for This where
    This: ?Sized
[src]

impl<'a, T> BorrowOwned<'a> for T where
    T: 'a + Clone
[src]

type ROwned = T

type RBorrowed = &'a T

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> From<T> for T[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> TypeIdentity for T where
    T: ?Sized
[src]

type Type = T

The same type as Self. Read more

impl<T> SelfOps for T where
    T: ?Sized
[src]

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The error type returned when the conversion fails.

impl<T> DeserializeOwned for T where
    T: Deserialize<'de>, 
[src]