#[cfg(not(target_pointer_width = "32"))]
use std::mem::transmute;
use std::sync::Arc;
#[cfg(target_pointer_width = "32")]
use std::sync::Mutex;
#[cfg(not(target_pointer_width = "32"))]
use std::sync::atomic::{AtomicUsize, Ordering};
#[derive(Clone)]
pub struct SharedI64
{
#[cfg(target_pointer_width = "32")]
data : Arc<Mutex<i64>>,
#[cfg(not(target_pointer_width = "32"))]
data : Arc<AtomicUsize>
}
#[cfg(target_pointer_width = "32")]
impl SharedI64
{
pub fn new(
value : i64
) -> SharedI64
{
SharedI64 {
data : Arc::new(Mutex::new(value))
}
}
pub fn set(
&self,
value : i64
)
{
let mut data = self.data.lock().unwrap();
*data = value;
}
pub fn get(&self) -> i64
{
let data = self.data.lock().unwrap();
*data
}
}
#[cfg(not(target_pointer_width = "32"))]
impl SharedI64
{
pub fn new(
value : i64
) -> SharedI64
{
unsafe {
SharedI64 {
data : Arc::new(AtomicUsize::new(transmute(value)))
}
}
}
pub fn set(
&self,
value : i64
)
{
unsafe {
self.data.store(transmute(value), Ordering::Relaxed)
}
}
pub fn get(&self) -> i64
{
unsafe {
transmute(self.data.load(Ordering::Relaxed))
}
}
}
use std::fmt::{Debug, Display, Formatter, Error};
impl Debug for SharedI64
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{:?}", self.get())
}
}
impl Display for SharedI64
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{}", self.get())
}
}
#[cfg(test)]
mod tests
{
#[test]
fn test_single()
{
let test = super::SharedI64::new(-79);
assert_eq!(test.get(), -79);
test.set(41);
assert_eq!(test.get(), 41);
}
#[test]
fn test_multiple()
{
let test1 = super::SharedI64::new(-79);
let test2 = test1.clone();
let test3 = test2.clone();
assert_eq!(test1.get(), -79);
assert_eq!(test2.get(), -79);
assert_eq!(test3.get(), -79);
test1.set(51);
assert_eq!(test1.get(), 51);
assert_eq!(test2.get(), 51);
assert_eq!(test3.get(), 51);
test2.set(31);
assert_eq!(test1.get(), 31);
assert_eq!(test2.get(), 31);
assert_eq!(test3.get(), 31);
test3.set(-11);
assert_eq!(test1.get(), -11);
assert_eq!(test2.get(), -11);
assert_eq!(test3.get(), -11);
}
}