use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
#[derive(Clone)]
pub struct SharedBool
{
data : Arc<AtomicBool>
}
impl SharedBool
{
pub fn new(
value : bool
) -> SharedBool
{
SharedBool {
data : Arc::new(AtomicBool::new(value))
}
}
pub fn set(
&self,
value : bool
)
{
self.data.store(value, Ordering::Relaxed);
}
pub fn get(&self) -> bool
{
self.data.load(Ordering::Relaxed)
}
}
use std::fmt::{Debug, Display, Formatter, Error};
impl Debug for SharedBool
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{:?}", self.get())
}
}
impl Display for SharedBool
{
fn fmt(
&self,
f : &mut Formatter
) -> Result<(), Error>
{
write!(f, "{}", self.get())
}
}
#[cfg(test)]
mod tests
{
#[test]
fn test_single()
{
let test = super::SharedBool::new(false);
assert_eq!(test.get(), false);
test.set(true);
assert_eq!(test.get(), true);
}
#[test]
fn test_multiple()
{
let test1 = super::SharedBool::new(true);
let test2 = test1.clone();
let test3 = test2.clone();
assert_eq!(test1.get(), true);
assert_eq!(test2.get(), true);
assert_eq!(test3.get(), true);
test1.set(false);
assert_eq!(test1.get(), false);
assert_eq!(test2.get(), false);
assert_eq!(test3.get(), false);
test2.set(true);
assert_eq!(test1.get(), true);
assert_eq!(test2.get(), true);
assert_eq!(test3.get(), true);
test3.set(false);
assert_eq!(test1.get(), false);
assert_eq!(test2.get(), false);
assert_eq!(test3.get(), false);
}
}