File tree 1 file changed +29
-0
lines changed
1 file changed +29
-0
lines changed Original file line number Diff line number Diff line change 8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
+ use std:: fmt;
11
12
use std:: cell:: Cell ;
12
13
14
+ /// A write-once variable. When constructed, it is empty, and
15
+ /// can only be set once.
16
+ ///
17
+ /// Ivars ensure that data that can only be initialised once. A full
18
+ /// implementation is used for concurrency and blocks on a read of an
19
+ /// unfulfilled value. This implementation is more minimal and panics
20
+ /// if you attempt to read the value before it has been set. It is also
21
+ /// not `Sync`, but may be extended in the future to be usable as a true
22
+ /// concurrency type.
23
+ #[ derive( PartialEq ) ]
13
24
pub struct Ivar < T : Copy > {
14
25
data : Cell < Option < T > >
15
26
}
@@ -39,3 +50,21 @@ impl<T:Copy> Ivar<T> {
39
50
self . get ( ) . unwrap ( )
40
51
}
41
52
}
53
+
54
+ impl < T : fmt:: Debug > fmt:: Debug for Ivar < T > {
55
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
56
+ match self . get ( ) {
57
+ Some ( val) => write ! ( f, "Ivar {{ {:?} }}" , val) ,
58
+ None => f. write_str ( "Ivar { <unfulfilled> }" )
59
+ }
60
+ }
61
+ }
62
+
63
+ impl < T : Copy > Clone for Ivar < T > {
64
+ fn clone ( & self ) -> Ivar < T > {
65
+ match self . get ( ) {
66
+ Some ( val) => Ivar { data : Cell :: new ( Some ( val) ) } ,
67
+ None => Ivar :: new ( )
68
+ }
69
+ }
70
+ }
You can’t perform that action at this time.
0 commit comments