use std::sync::OnceLock;
use std::time::Instant;
static START_TIME: OnceLock<Instant> = OnceLock::new();
pub fn get_tick_count() -> i64 {
let start = *START_TIME.get_or_init(Instant::now);
start.elapsed().as_nanos() as i64
}
pub fn get_tick_frequency() -> f64 {
1_000_000_000.0
}
#[derive(Debug, Default, Copy, Clone, PartialEq)]
pub struct Range {
pub start: i32,
pub end: i32,
}
impl Range {
pub fn new(start: i32, end: i32) -> Self {
Self { start, end }
}
pub fn size(&self) -> i32 {
self.end - self.start
}
pub fn empty(&self) -> bool {
self.start == self.end
}
pub fn all() -> Self {
Self::new(i32::MIN, i32::MAX)
}
}
pub fn set_log_level(level: log::LevelFilter) {
log::set_max_level(level);
}
pub fn get_log_level() -> log::LevelFilter {
log::max_level()
}
pub fn border_interpolate(p: i32, len: i32, border_type: crate::core::types::BorderTypes) -> i32 {
if p >= 0 && p < len {
return p;
}
use crate::core::types::BorderTypes;
match border_type {
BorderTypes::Replicate => {
if p < 0 {
0
} else {
len - 1
}
}
BorderTypes::Reflect => {
let mut p = p;
if len == 1 {
return 0;
}
loop {
if p < 0 {
p = -p - 1;
} else if p >= len {
p = 2 * len - p - 1;
} else {
break;
}
}
p
}
BorderTypes::Reflect101 => {
let mut p = p;
if len == 1 {
return 0;
}
loop {
if p < 0 {
p = -p;
} else if p >= len {
p = 2 * len - p - 2;
} else {
break;
}
}
p
}
BorderTypes::Wrap => {
if p < 0 {
(p % len + len) % len
} else {
p % len
}
}
BorderTypes::Constant => -1,
_ => -1,
}
}
#[cfg(not(feature = "parallel"))]
pub trait ParIterFallback<'a, T: 'a> {
type Iter: Iterator<Item = &'a T>;
type IterMut: Iterator<Item = &'a mut T>;
fn par_iter(&'a self) -> Self::Iter;
fn par_iter_mut(&'a mut self) -> Self::IterMut;
fn par_chunks_mut(&'a mut self, size: usize) -> std::slice::ChunksMut<'a, T>;
}
#[cfg(not(feature = "parallel"))]
impl<'a, T: 'a> ParIterFallback<'a, T> for [T] {
type Iter = std::slice::Iter<'a, T>;
type IterMut = std::slice::IterMut<'a, T>;
fn par_iter(&'a self) -> Self::Iter {
self.iter()
}
fn par_iter_mut(&'a mut self) -> Self::IterMut {
self.iter_mut()
}
fn par_chunks_mut(&'a mut self, size: usize) -> std::slice::ChunksMut<'a, T> {
self.chunks_mut(size)
}
}