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}