use std::mem::transmute;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
#[derive(Clone)]
pub struct SharedF32
{
data : Arc<AtomicUsize>
}
impl SharedF32
{
pub fn new(
value : f32
) -> SharedF32
{
unsafe {
SharedF32 {
data : Arc::new(AtomicUsize::new(transmute::<f32, u32>(value) as usize))
}
}
}
pub fn set(
&self,
val : f32
)
{
unsafe {
self.data.store(
transmute::<f32, u32>(val) as usize,
Ordering::Relaxed
);
}
}
pub fn get(&self) -> f32
{
unsafe {
transmute(self.data.load(Ordering::Relaxed) as u32)
}
}
}
use std::fmt::{Debug, Display, Formatter, Error};
impl Debug for SharedF32
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{:?}", self.get())
}
}
impl Display for SharedF32
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{}", self.get())
}
}
#[cfg(test)]
mod tests
{
#[test]
fn test_single()
{
let test = super::SharedF32::new(-79.23);
assert_eq!(test.get(), -79.23);
test.set(41.78);
assert_eq!(test.get(), 41.78);
}
#[test]
fn test_multiple()
{
let test1 = super::SharedF32::new(-79.6);
let test2 = test1.clone();
let test3 = test2.clone();
assert_eq!(test1.get(), -79.6);
assert_eq!(test2.get(), -79.6);
assert_eq!(test3.get(), -79.6);
test1.set(51.98);
assert_eq!(test1.get(), 51.98);
assert_eq!(test2.get(), 51.98);
assert_eq!(test3.get(), 51.98);
test2.set(31.77);
assert_eq!(test1.get(), 31.77);
assert_eq!(test2.get(), 31.77);
assert_eq!(test3.get(), 31.77);
test3.set(-11.101);
assert_eq!(test1.get(), -11.101);
assert_eq!(test2.get(), -11.101);
assert_eq!(test3.get(), -11.101);
}
}