rebound-rs 4.6.0-alpha.1

Rust wrapper for the REBOUND N-body simulation library.
Documentation
use core::pin::Pin;

use rebound_bind as rb;

use super::{_Simulation, Simulation, SimulationRead, SimulationWrite};

pub struct SimulationRef<'a> {
    pub(crate) inner: &'a _Simulation,
}

impl<'a> SimulationRef<'a> {
    pub(crate) fn new(inner: &'a _Simulation) -> Self {
        Self { inner }
    }
}

impl<'a> From<&'a Simulation> for SimulationRef<'a> {
    fn from(simulation: &'a Simulation) -> Self {
        simulation.as_ref()
    }
}

impl<'a> SimulationRead for SimulationRef<'a> {
    fn raw(&self) -> *const rb::reb_simulation {
        &raw const self.inner.raw
    }
}

pub struct SimulationRefMut<'a> {
    pub(crate) inner: Pin<&'a mut _Simulation>,
}

impl<'a> SimulationRefMut<'a> {
    pub(crate) fn new(inner: Pin<&'a mut _Simulation>) -> Self {
        Self { inner }
    }

    pub fn as_ref(&self) -> SimulationRef<'_> {
        SimulationRef::new(self.inner.as_ref().get_ref())
    }

    pub fn as_mut(&mut self) -> SimulationRefMut<'_> {
        SimulationRefMut::new(self.inner.as_mut())
    }
}

impl<'a> From<&'a mut Simulation> for SimulationRefMut<'a> {
    fn from(simulation: &'a mut Simulation) -> Self {
        simulation.as_mut()
    }
}

impl<'a> SimulationRead for SimulationRefMut<'a> {
    fn raw(&self) -> *const rb::reb_simulation {
        &raw const self.inner.as_ref().get_ref().raw
    }
}

impl<'a> SimulationWrite for SimulationRefMut<'a> {
    fn raw_mut(&mut self) -> *mut rb::reb_simulation {
        unsafe { &raw mut self.inner.as_mut().get_unchecked_mut().raw }
    }
}