Skip to main content

gwr_components/store/
object_store.rs

1// Copyright (c) 2023 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 objects.
15///
16/// The returned [Store] is the registered component.
17pub struct ObjectStore<T>(std::marker::PhantomData<T>);
18
19impl<T> ObjectStore<T>
20where
21    T: SimObject,
22{
23    /// Basic store constructor
24    ///
25    /// Returns a `SimError` if `capacity` is 0.
26    pub fn new_and_register_with_renames(
27        engine: &Engine,
28        clock: &Clock,
29        parent: &Rc<Entity>,
30        name: &str,
31        aka: Option<&Aka>,
32        capacity: usize,
33    ) -> Result<Rc<Store<T>>, SimError> {
34        let entity = Rc::new(Entity::new(parent, name));
35        entity.track_capacity(capacity, "objects");
36        let store = Rc::new(Store::new(engine, clock, &entity, aka, capacity, |_| 1)?);
37        engine.register(store.clone());
38        Ok(store)
39    }
40
41    /// Basic store constructor
42    ///
43    /// Returns a `SimError` if `capacity` is 0.
44    pub fn new_and_register(
45        engine: &Engine,
46        clock: &Clock,
47        parent: &Rc<Entity>,
48        name: &str,
49        capacity: usize,
50    ) -> Result<Rc<Store<T>>, SimError> {
51        Self::new_and_register_with_renames(engine, clock, parent, name, None, capacity)
52    }
53}