use super::{ConvergenceState, RuntimeState, State, UserState};
use num_traits::float::FloatCore;
use std::time::Duration;
pub struct StateView<'a, S: UserState> {
state: &'a State<S>,
}
impl<'a, S: UserState> Copy for StateView<'a, S> {}
impl<'a, S: UserState> Clone for StateView<'a, S> {
fn clone(&self) -> Self {
*self
}
}
impl<'a, S: UserState> StateView<'a, S> {
pub(crate) fn new(state: &'a State<S>) -> Self {
Self { state }
}
}
impl<'a, S> StateView<'a, S>
where
S: UserState,
<S as UserState>::Float: FloatCore,
{
pub fn iteration(&self) -> usize {
self.state.runtime.iteration()
}
pub fn duration(&self) -> Duration {
self.state.runtime.duration()
}
pub fn best_measure(&self) -> S::Float {
self.state.convergence.best()
}
pub fn current_measure(&self) -> S::Float {
self.state.convergence.current()
}
pub fn iterations_since_best(&self) -> usize {
self.state
.convergence
.iterations_since_best(self.state.runtime.iteration())
}
pub(crate) fn user<'b>(&'b self) -> &'a S {
&self.state.user
}
pub(crate) fn runtime<'b>(&'b self) -> &'a RuntimeState {
&self.state.runtime
}
pub(crate) fn convergence<'b>(&'b self) -> &'a ConvergenceState<S::Float> {
&self.state.convergence
}
}