File tree Expand file tree Collapse file tree 2 files changed +52
-1
lines changed Expand file tree Collapse file tree 2 files changed +52
-1
lines changed Original file line number Diff line number Diff line change 2
2
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
3
3
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4
4
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5
- refs/heads/try: 9d20ed7bf97e533e0cc5d7be2c3ec5d5dfd30e98
5
+ refs/heads/try: 910a32c7c777296be0992bf0d6f2d66261c407d6
6
6
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
Original file line number Diff line number Diff line change @@ -84,6 +84,57 @@ fn may<T>(opt: t<T>, f: fn(T)) {
84
84
alt opt { none { /* nothing */ } some( t) { f ( t) ; } }
85
85
}
86
86
87
+ /*
88
+ Function: unwrap
89
+
90
+ Moves a value out of an option type and returns it. Useful primarily
91
+ for getting strings, vectors and unique pointers out of option types
92
+ without copying them.
93
+ */
94
+ fn unwrap < T > ( -opt : t < T > ) -> T unsafe {
95
+ let addr = alt opt {
96
+ some( x) { ptr:: addr_of ( x) }
97
+ none { fail "option none" }
98
+ } ;
99
+ let liberated_value = unsafe :: reinterpret_cast ( * addr) ;
100
+ unsafe :: leak ( opt) ;
101
+ ret liberated_value;
102
+ }
103
+
104
+ #[ test]
105
+ fn test_unwrap_ptr ( ) {
106
+ let x = ~0 ;
107
+ let addr_x = ptr:: addr_of ( * x) ;
108
+ let opt = some ( x) ;
109
+ let y = unwrap ( opt) ;
110
+ let addr_y = ptr:: addr_of ( * y) ;
111
+ assert addr_x == addr_y;
112
+ }
113
+
114
+ #[ test]
115
+ fn test_unwrap_str ( ) {
116
+ let x = "test" ;
117
+ let addr_x = str:: as_buf ( x) { |buf| ptr:: addr_of ( buf) } ;
118
+ let opt = some ( x) ;
119
+ let y = unwrap ( opt) ;
120
+ let addr_y = str:: as_buf ( y) { |buf| ptr:: addr_of ( buf) } ;
121
+ assert addr_x == addr_y;
122
+ }
123
+
124
+ #[ test]
125
+ fn test_unwrap_resource ( ) {
126
+ resource r( i: @mutable int) {
127
+ * i += 1 ;
128
+ }
129
+ let i = @mutable 0 ;
130
+ {
131
+ let x = r ( i) ;
132
+ let opt = some ( x) ;
133
+ let y = unwrap ( opt) ;
134
+ }
135
+ assert * i == 1 ;
136
+ }
137
+
87
138
// Local Variables:
88
139
// mode: rust;
89
140
// fill-column: 78;
You can’t perform that action at this time.
0 commit comments