fastsim_core/simdrive/
simdrive_iter.rs1use super::RustSimDrive;
5use crate::imports::*;
6use crate::proc_macros::add_pyo3_api;
7#[cfg(feature = "pyo3")]
8use crate::pyo3imports::*;
9use rayon::prelude::*;
10
11#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
12#[add_pyo3_api(
13 #[pyo3(name = "sim_drive")]
14 #[pyo3(signature = (parallelize=None))]
15 fn sim_drive_py(&mut self, parallelize: Option<bool>) -> anyhow::Result<()> {
19 self.sim_drive(parallelize)
20 }
21
22 #[pyo3(name = "push")]
23 fn push_py(&mut self, sd: RustSimDrive) {
24 self.push(sd)
25 }
26
27 #[pyo3(name = "pop")]
28 fn pop_py(&mut self) -> Option<RustSimDrive> {
29 self.pop()
30 }
31
32 #[pyo3(name = "remove")]
33 fn remove_py(&mut self, idx: usize) {
34 self.remove(idx);
35 }
36
37 #[pyo3(name = "insert")]
38 fn insert_py(&mut self, idx: usize, sd: RustSimDrive) {
39 self.insert(idx, sd);
40 }
41)]
42pub struct SimDriveVec(pub Vec<RustSimDrive>);
43
44impl SimDriveVec {
45 pub fn sim_drive(&mut self, parallelize: Option<bool>) -> anyhow::Result<()> {
49 let parallelize = parallelize.unwrap_or(true);
50 if parallelize {
51 self.0.par_iter_mut().enumerate().try_for_each(|(i, sd)| {
52 sd.sim_drive(None, None)
53 .with_context(|| format!("simdrive idx: {}", i))
54 })?;
55 } else {
56 self.0.iter_mut().enumerate().try_for_each(|(i, sd)| {
57 sd.sim_drive(None, None)
58 .with_context(|| format!("simdrive idx: {}", i))
59 })?;
60 }
61 Ok(())
62 }
63
64 pub fn push(&mut self, sd: RustSimDrive) {
65 self.0.push(sd);
66 }
67
68 pub fn pop(&mut self) -> Option<RustSimDrive> {
69 self.0.pop()
70 }
71
72 pub fn remove(&mut self, idx: usize) {
73 self.0.remove(idx);
74 }
75
76 pub fn insert(&mut self, idx: usize, sd: RustSimDrive) {
77 self.0.insert(idx, sd);
78 }
79}
80
81impl SerdeAPI for SimDriveVec {}