Skip to main content

gwr_components/store/
byte_store.rs

1// Copyright (c) 2026 Graphcore Ltd. All rights reserved.
2
3use std::rc::Rc;
4
5use gwr_engine::engine::Engine;
6use gwr_engine::time::clock::Clock;
7use gwr_engine::traits::SimObject;
8use gwr_engine::types::SimError;
9use gwr_track::entity::Entity;
10use gwr_track::tracker::aka::Aka;
11
12use super::Store;
13
14/// Builds stores that support a configurable number of bytes.
15///
16/// Objects must support the [SimObject] trait. The returned [Store] uses
17/// [`total_bytes`](gwr_engine::traits::TotalBytes::total_bytes) to decide
18/// whether there is enough free byte capacity to accept each object.
19pub struct ByteStore<T>(std::marker::PhantomData<T>);
20
21impl<T> ByteStore<T>
22where
23    T: SimObject,
24{
25    /// Basic byte-store constructor.
26    ///
27    /// Returns a `SimError` if `capacity_bytes` is 0.
28    pub fn new_and_register_with_renames(
29        engine: &Engine,
30        clock: &Clock,
31        parent: &Rc<Entity>,
32        name: &str,
33        aka: Option<&Aka>,
34        capacity_bytes: usize,
35    ) -> Result<Rc<Store<T>>, SimError> {
36        let entity = Rc::new(Entity::new(parent, name));
37        entity.track_capacity(capacity_bytes, "bytes");
38        let store = Rc::new(Store::new(
39            engine,
40            clock,
41            &entity,
42            aka,
43            capacity_bytes,
44            |value: &T| value.total_bytes(),
45        )?);
46        store.set_capacity_unit("bytes");
47        engine.register(store.clone());
48        Ok(store)
49    }
50
51    /// Basic byte-store constructor.
52    ///
53    /// Returns a `SimError` if `capacity_bytes` is 0.
54    pub fn new_and_register(
55        engine: &Engine,
56        clock: &Clock,
57        parent: &Rc<Entity>,
58        name: &str,
59        capacity_bytes: usize,
60    ) -> Result<Rc<Store<T>>, SimError> {
61        Self::new_and_register_with_renames(engine, clock, parent, name, None, capacity_bytes)
62    }
63}