Expand description

Continuously read and write to memory using random offsets and lengths

RandomAccessMemory is a complete implementation of random-access-storage for in-memory storage.

See also random-access-disk for on-disk storage that can be swapped with this.

Examples

Reading, writing, deleting and truncating:

use random_access_storage::RandomAccess;
use random_access_memory::RandomAccessMemory;

let mut storage = RandomAccessMemory::default();
storage.write(0, b"hello").await.unwrap();
storage.write(5, b" world").await.unwrap();
assert_eq!(storage.read(0, 11).await.unwrap(), b"hello world");
assert_eq!(storage.len().await.unwrap(), 11);
storage.del(5, 2).await.unwrap();
assert_eq!(storage.read(5, 2).await.unwrap(), [0, 0]);
assert_eq!(storage.len().await.unwrap(), 11);
storage.truncate(2).await.unwrap();
assert_eq!(storage.len().await.unwrap(), 2);
storage.truncate(5).await.unwrap();
assert_eq!(storage.len().await.unwrap(), 5);
assert_eq!(storage.read(0, 5).await.unwrap(), [b'h', b'e', 0, 0, 0]);

In order to get benefits from the swappable interface, you will in most cases want to use generic functions for storage manipulation:

use random_access_storage::RandomAccess;
use random_access_memory::RandomAccessMemory;
use std::fmt::Debug;

let mut storage = RandomAccessMemory::default();
write_hello_world(&mut storage).await;
assert_eq!(read_hello_world(&mut storage).await, b"hello world");

/// Write with swappable storage
async fn write_hello_world<T>(storage: &mut T)
where T: RandomAccess + Debug + Send,
{
  storage.write(0, b"hello").await.unwrap();
  storage.write(5, b" world").await.unwrap();
}

/// Read with swappable storage
async fn read_hello_world<T>(storage: &mut T) -> Vec<u8>
where T: RandomAccess + Debug + Send,
{
  storage.read(0, 11).await.unwrap()
}

Structs