summaryrefslogtreecommitdiffstats
path: root/src/system.rs
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2024-09-30 12:01:07 -0400
committerJon Santmyer <jon@jonsantmyer.com>2024-09-30 12:01:07 -0400
commit63bd19127f66dda81007fcd0d8857e978740101f (patch)
tree781e971abde6f79b35b457927129066df42d955e /src/system.rs
downloadsystemic-63bd19127f66dda81007fcd0d8857e978740101f.tar.gz
systemic-63bd19127f66dda81007fcd0d8857e978740101f.tar.bz2
systemic-63bd19127f66dda81007fcd0d8857e978740101f.zip
First commitHEADmaster
Diffstat (limited to 'src/system.rs')
-rw-r--r--src/system.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/system.rs b/src/system.rs
new file mode 100644
index 0000000..d11ea3a
--- /dev/null
+++ b/src/system.rs
@@ -0,0 +1,78 @@
+use super::units::*;
+use super::orbital::*;
+use std::vec::Vec;
+use std::rc::Rc;
+use std::cell::RefCell;
+
+pub struct System
+{
+ pub orbitals : Rc<RefCell<Vec<Orbital>>>,
+}
+
+pub struct SystemBuilder
+{
+ orbitals : Rc<RefCell<Vec<Orbital>>>,
+}
+
+impl System
+{
+ fn orbital_set(&self, orbitals : &mut [Orbital], i : usize)
+ -> (&mut Orbital, Option<&mut Orbital>)
+ {
+ //The orbital vector must first be converted to a mutable span, so that I can access the raw data.
+ assert!(i < orbitals.len());
+ unsafe {
+ //From the orbital span, take a raw pointer from the given index,
+ //cast to a pointer to a mutable Orbital, and dereference.
+ let orbital = &mut *(orbitals.get_unchecked_mut(i) as *mut Orbital);
+ //Assuming the orbital is a valid object, check for the parent orbital.
+ match orbital.origin() {
+ Some(origin_i) => {
+ //Make sure the origin index does not break rules.
+ assert!(origin_i != i, "Object cannot orbit itself");
+ assert!(origin_i < orbitals.len());
+ let origin = &mut *(orbitals.get_unchecked_mut(origin_i) as *mut Orbital);
+ (orbital, Some(origin))
+ },
+ None => (orbital, None)
+ }
+ }
+ }
+
+ pub fn tick(&self, t : Second)
+ {
+ let orbitals = &mut self.orbitals.borrow_mut()[..];
+ for i in 0..orbitals.len() {
+ let orbital_set = self.orbital_set(orbitals, i);
+ match orbital_set.1 {
+ Some(origin) => { orbital_set.0.tick(origin, t); },
+ None => {}
+ }
+ }
+ }
+}
+
+impl SystemBuilder
+{
+ pub fn new() -> SystemBuilder
+ {
+ SystemBuilder {
+ orbitals : Rc::new(RefCell::new(vec![]))
+ }
+ }
+
+ pub fn add_body(&self, orbital : Orbital) -> usize
+ {
+ let mut orbitals = self.orbitals.borrow_mut();
+ let new_ind = orbitals.len();
+ orbitals.push(orbital);
+ new_ind
+ }
+
+ pub fn build(self) -> System
+ {
+ System {
+ orbitals : self.orbitals
+ }
+ }
+}