Skip to main content

FixedBlockMemory

Struct FixedBlockMemory 

Source
pub struct FixedBlockMemory { /* private fields */ }
Available on crate features test-util only.
Expand description

A memory provider that uses fixed-size memory blocks.

Every memory capacity reservation is cut into into blocks of fixed size and delegated to the Rust global allocator, which provides the actual memory capacity.

This provider is meant for test scenarios where a specific memory block size is important, such as when testing edge cases of multi-block byte sequence handling. You can go down as low as 1 byte per block to simulate extreme memory fragmentation. All user code is expected to correctly operate with memory blocks of any size, including single-byte blocks.

§Performance

This memory provider is a simple implementation that does not perform any pooling or performance optimization, so should not be used in real code.

§Examples

Reserving memory returns capacity rounded up to the block size:

use std::num::NonZero;

use bytesbuf::BytesView;
use bytesbuf::mem::Memory;
use bytesbuf::mem::testing::FixedBlockMemory;

// Create a memory provider with 16-byte blocks.
let memory = FixedBlockMemory::new(NonZero::new(16).unwrap());

// Request 10 bytes - capacity is rounded up to 16 (one full block).
let buf = memory.reserve(10);
assert_eq!(buf.capacity(), 16);

// Request 20 bytes - capacity is rounded up to 32 (two full blocks).
let buf = memory.reserve(20);
assert_eq!(buf.capacity(), 32);

// Data spanning multiple blocks is split across slices.
let mut data = BytesView::copied_from_slice(b"Hello, world! This is a test!", &memory);
assert_eq!(data.len(), 29);
assert_eq!(data.first_slice().len(), 16); // First block is full.
data.advance(16);
assert_eq!(data.first_slice().len(), 13); // Remaining 13 bytes in second block.

Implementations§

Source§

impl FixedBlockMemory

Source

pub fn new(block_size: NonZero<BlockSize>) -> Self

Creates a new instance of the memory provider.

Source

pub fn reserve(&self, min_bytes: usize) -> BytesBuf

Reserves at least min_bytes bytes of memory capacity.

The requested amount min_bytes is rounded up to the nearest multiple of the fixed block size.

Returns a BytesBuf that can be used to fill the reserved memory with data.

The memory reservation request will always be fulfilled, obtaining more memory from the operating system if necessary.

§Zero-sized reservations

Reserving zero bytes of memory is a valid operation and will return a BytesBuf with zero bytes of capacity.

§Panics

May panic if the operating system runs out of memory.

Trait Implementations§

Source§

impl Clone for FixedBlockMemory

Source§

fn clone(&self) -> FixedBlockMemory

Returns a duplicate 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 FixedBlockMemory

Source§

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

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

impl Memory for FixedBlockMemory

Source§

fn reserve(&self, min_bytes: usize) -> BytesBuf

Reserves at least min_bytes bytes of memory capacity. Read more

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> 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> MemoryShared for T
where T: Memory + Send + Sync + 'static,