- Rust 100%
|
Some checks failed
ci / test - macos-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: false,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: true,
debug: false,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - ubuntu-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - windows-latest; stable rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: false,
error_in_core: false
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - macos-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - ubuntu-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: false,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: false,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
ci / test - windows-latest; nightly rust; features: {
std: true,
debug: true,
unsafe_impl: true,
ptr_metadata: true,
error_in_core: true
}
(push) Has been cancelled
Check SemVer / build (push) Has been cancelled
ci / lint (push) Has been cancelled
ci / miri (push) Has been cancelled
Signed-off-by: Tin Švagelj <tin.svagelj@live.com> |
||
|---|---|---|
| .github/workflows | ||
| doc | ||
| examples | ||
| src | ||
| .gitignore | ||
| build.rs | ||
| Cargo.toml | ||
| LICENSE_APACHE | ||
| LICENSE_MIT | ||
| LICENSE_ZLIB | ||
| README.md | ||
contiguous_mem
contiguous_mem is space optimized a vector like collection that can store entries of varying layouts close in memory while retaining type information at the reference level.
Use Case

* Both Vec and ContiguousMemory have one
level of indirection that's not shown for sake of simplicity.
You need to store several different types and ensure their close proximity on the heap to reduce cache misses, but which/how many is determined at runtime.
Key Features
no_stdsupport!- Interface similar to
Vec. - Support for dynamic resizing of allocated memory while keeping the existing references functional (for safe implementations).
- Exhaustively tested with Miri.
- Limited downstream dependencies (only polyfills).
- sptr is used as polyfill for Strict Provenance and required for MIRI.
- allocator-api2 is used as polyfill for the allocator API.
Getting Started
Add the crate to your dependencies:
[dependencies]
contiguous_mem = { version = "0.5" }
Disable default features (std feature) for use in no_std environments:
[dependencies]
contiguous_mem = { version = "0.5", default-feature = false, features = ["unsafe_impl"] }
Features
no_std- enablesno_stddependencies for atomics, mutexes and rwlocksdebug- enablesderive(Debug)on structures unrelated to error handlingptr_metadata<nightly> - allows casting references intodyn Traiterror_in_core<nightly> - enables support forcore::error::Errorinno_stdenvironmentunsafe_impl(default) - enablesUnsafeContiguousMemory
Usage
use contiguous_mem::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Data {
value: u32,
}
fn main() {
// Create a ContiguousMemory instance
let mut memory = ContiguousMemory::new();
// Store data in the memory container
let data = Data { value: 42 };
let stored_number: ContiguousEntryRef<u64, _> = memory.push(22u64);
let stored_data: ContiguousEntryRef<Data, _> = memory.push(data);
// Retrieve and use the stored data
assert_eq!(*stored_data.get(), data);
assert_eq!(*stored_number.get(), 22);
}
* Note that reference types returned by store are inferred and only shown here for demonstration purposes.
Returned references have semantics similar to
RefCell.
For more usage examples see the examples directory.
Stability
This crate has almost complete test coverage and is tested with Miri. It doesn't rely on any weird language quirks, but it does deal with memory management.
There's a lot of unsafe code due to the nature of the crate, but again, it's covered by tests and Miri.
Alternatives
- manually managing memory to ensure contiguous placement of data
- prone to errors and requires unsafe code
- multiple levels of indirection (
Vec<Box<dyn Trait>>) - for storing types with uniform
Layout, when you only need to erase their types at the container level see: - using a custom allocator like
blink-alloc to ensure contiguous
placement of data
- requires
allocator_apifeature blink-allocprovides a similar functionality as this crate without theallocator_apifeature; intended for use in loops so it doesn't support freeing some values while retaining other
- requires
Contributions
Contributions are welcome, feel free to create an issue or a pull request.
All contributions to the project are licensed under the Zlib/MIT/Apache 2.0 license unless you explicitly state otherwise.
License
This project is licensed under Zlib, MIT, or Apache-2.0 license, choose whichever suits your use case the best.