shareable/
shared_isize.rs

1/* Copyright 2016 Joshua Gentry
2 *
3 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4 * http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5 * <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6 * option. This file may not be copied, modified, or distributed
7 * except according to those terms.
8 */
9use std::sync::Arc;
10use std::sync::atomic::{AtomicIsize, Ordering};
11
12
13//*************************************************************************************************
14/// Shareable isize data element.
15///
16/// # Examples
17///
18/// ```
19/// use std::sync::mpsc;
20/// use std::thread;
21/// use shareable::SharedIsize;
22///
23/// // Multiple threads, atomic values are used.
24/// let value1 = SharedIsize::new(63);
25/// let value2 = value1.clone();
26///
27/// let (tx, rx) = mpsc::channel();
28///
29/// let thread = thread::spawn(move || {
30///     rx.recv();
31///     assert_eq!(value2.get(), 31);
32/// });
33///
34/// value1.set(31);
35///
36/// tx.send(());
37/// thread.join().unwrap();
38/// ```
39#[derive(Clone)]
40pub struct SharedIsize
41{
42    //---------------------------------------------------------------------------------------------
43    /// The internal data element.
44    data : Arc<AtomicIsize>
45}
46
47impl SharedIsize
48{
49    //********************************************************************************************
50    /// Construct a new instance of the object.
51    pub fn new(
52        value : isize
53        ) -> SharedIsize
54    {
55        SharedIsize {
56            data : Arc::new(AtomicIsize::new(value))
57        }
58    }
59
60    //********************************************************************************************
61    /// Set the value of the object.
62    pub fn set(
63        &self,
64        value : isize
65        )
66    {
67        self.data.store(value, Ordering::Relaxed);
68    }
69
70    //********************************************************************************************
71    /// Returns the value of the object.
72    pub fn get(&self) -> isize
73    {
74        self.data.load(Ordering::Relaxed)
75    }
76}
77
78use std::fmt::{Debug, Display, Formatter, Error};
79
80impl Debug for SharedIsize
81{
82    //*********************************************************************************************
83    /// Implementation of Debug.
84    fn fmt(
85        &self,
86        f : &mut Formatter
87        ) -> Result<(), Error>
88    {
89        write!(f, "{:?}", self.get())
90    }
91}
92
93impl Display for SharedIsize
94{
95    //*********************************************************************************************
96    /// Implementation of Display.
97    fn fmt(
98        &self,
99        f : &mut Formatter
100        ) -> Result<(), Error>
101    {
102        write!(f, "{}", self.get())
103    }
104}
105
106#[cfg(test)]
107mod tests
108{
109
110    //*********************************************************************************************
111    /// Test that get/set work with only 1 instance.
112    #[test]
113    fn test_single()
114    {
115        let test = super::SharedIsize::new(79);
116
117        assert_eq!(test.get(), 79);
118        test.set(41);
119        assert_eq!(test.get(), 41);
120    }
121
122    //*********************************************************************************************
123    /// Test that get/set work with multiple instances.
124    #[test]
125    fn test_multiple()
126    {
127        let test1 = super::SharedIsize::new(-79);
128        let test2 = test1.clone();
129        let test3 = test2.clone();
130
131        assert_eq!(test1.get(), -79);
132        assert_eq!(test2.get(), -79);
133        assert_eq!(test3.get(), -79);
134
135        test1.set(-51);
136
137        assert_eq!(test1.get(), -51);
138        assert_eq!(test2.get(), -51);
139        assert_eq!(test3.get(), -51);
140
141        test2.set(-31);
142
143        assert_eq!(test1.get(), -31);
144        assert_eq!(test2.get(), -31);
145        assert_eq!(test3.get(), -31);
146
147        test3.set(11);
148
149        assert_eq!(test1.get(), 11);
150        assert_eq!(test2.get(), 11);
151        assert_eq!(test3.get(), 11);
152    }
153}