Skip to content

Safe store for one value of each type, with interior mutability.

License

Unknown and 2 other licenses found

Licenses found

Unknown
LICENSE.md
Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

Ratysz/resources

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

resources

Latest Version Documentation License CI

This crate provides the Resources struct: a container that stores at most one value of each specific type, and allows safely and concurrently accessing any of them with interior mutability, without violating borrow rules.

It's intended to be used as an implementation of storage for data that is not associated with any specific entity in an ECS (entity component system), but still needs concurrent access by systems.

Cargo features

  • fetch - when enabled, exposes Resources::fetch() that allows retrieving up to 16 resources with a one-liner.

Example

use resources::*;

struct SomeNumber(usize);

struct SomeString(&'static str);

fn main() {
    let mut resources = Resources::new();
    resources.insert(SomeNumber(4));
    resources.insert(SomeString("Hello!"));
    let resources = resources;  // This shadows the mutable binding with an immutable one.

    {
        let mut some_number = resources.get_mut::<SomeNumber>().unwrap();
        let mut some_string = resources.get_mut::<SomeString>().unwrap();

        // Immutably borrowing a resource that's already borrowed mutably is not allowed.
        assert!(resources.get::<SomeNumber>().is_err());

        some_number.0 = 2;
        some_string.0 = "Bye!";
    }

    // The mutable borrows now went out of scope, so it's okay to borrow again however needed.
    assert_eq!(resources.get::<SomeNumber>().unwrap().0, 2);

    // Multiple immutable borrows are okay.
    let some_string1 = resources.get::<SomeString>().unwrap();
    let some_string2 = resources.get::<SomeString>().unwrap();
    assert_eq!(some_string1.0, some_string2.0);
}

About

Safe store for one value of each type, with interior mutability.

Resources

License

Unknown and 2 other licenses found

Licenses found

Unknown
LICENSE.md
Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Languages