9494< a href =#94 id =94 data-nosnippet > 94</ a >
9595< a href =#95 id =95 data-nosnippet > 95</ a > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> fn </ span > remove(< span class ="kw-2 "> &mut </ span > < span class ="self "> self</ span > , id: Id<T::Marker>) -> T {
9696< a href =#96 id =96 data-nosnippet > 96</ a > < span class ="kw "> let </ span > (index, epoch) = id.unzip();
97- < a href =#97 id =97 data-nosnippet > 97</ a > < span class ="kw "> match </ span > mem::replace(< span class ="kw-2 "> &mut </ span > < span class ="self "> self</ span > .map[index < span class ="kw "> as </ span > usize], Element::Vacant) {
98- < a href =#98 id =98 data-nosnippet > 98</ a > Element::Occupied(value, storage_epoch) => {
99- < a href =#99 id =99 data-nosnippet > 99</ a > < span class ="macro "> assert_eq!</ span > (epoch, storage_epoch, < span class ="string "> "id epoch mismatch"</ span > );
100- < a href =#100 id =100 data-nosnippet > 100</ a > value
101- < a href =#101 id =101 data-nosnippet > 101</ a > }
102- < a href =#102 id =102 data-nosnippet > 102</ a > Element::Vacant => < span class ="macro "> panic!</ span > (< span class ="string "> "Cannot remove a vacant resource"</ span > ),
103- < a href =#103 id =103 data-nosnippet > 103</ a > }
104- < a href =#104 id =104 data-nosnippet > 104</ a > }
105- < a href =#105 id =105 data-nosnippet > 105</ a >
106- < a href =#106 id =106 data-nosnippet > 106</ a > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> fn </ span > iter(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ) -> < span class ="kw "> impl </ span > Iterator<Item = (Id<T::Marker>, < span class ="kw-2 "> &</ span > T)> {
107- < a href =#107 id =107 data-nosnippet > 107</ a > < span class ="self "> self</ span > .map
108- < a href =#108 id =108 data-nosnippet > 108</ a > .iter()
109- < a href =#109 id =109 data-nosnippet > 109</ a > .enumerate()
110- < a href =#110 id =110 data-nosnippet > 110</ a > .filter_map(< span class ="kw "> move </ span > |(index, x)| < span class ="kw "> match </ span > < span class ="kw-2 "> *</ span > x {
111- < a href =#111 id =111 data-nosnippet > 111</ a > Element::Occupied(< span class ="kw-2 "> ref </ span > value, storage_epoch) => {
112- < a href =#112 id =112 data-nosnippet > 112</ a > < span class ="prelude-val "> Some</ span > ((Id::zip(index < span class ="kw "> as </ span > Index, storage_epoch), value))
113- < a href =#113 id =113 data-nosnippet > 113</ a > }
114- < a href =#114 id =114 data-nosnippet > 114</ a > < span class ="kw "> _ </ span > => < span class ="prelude-val "> None</ span > ,
115- < a href =#115 id =115 data-nosnippet > 115</ a > })
116- < a href =#116 id =116 data-nosnippet > 116</ a > }
117- < a href =#117 id =117 data-nosnippet > 117</ a > }
118- < a href =#118 id =118 data-nosnippet > 118</ a >
119- < a href =#119 id =119 data-nosnippet > 119</ a > < span class ="kw "> impl</ span > <T> Storage<T>
120- < a href =#120 id =120 data-nosnippet > 120</ a > < span class ="kw "> where
121- < a href =#121 id =121 data-nosnippet > 121</ a > </ span > T: StorageItem + Clone,
122- < a href =#122 id =122 data-nosnippet > 122</ a > {
123- < a href =#123 id =123 data-nosnippet > 123</ a > < span class ="doccomment "> /// Get an owned reference to an item.
124- < a href =#124 id =124 data-nosnippet > 124</ a > /// Panics if there is an epoch mismatch, the entry is empty or in error.
125- < a href =#125 id =125 data-nosnippet > 125</ a > </ span > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> fn </ span > get(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > , id: Id<T::Marker>) -> T {
126- < a href =#126 id =126 data-nosnippet > 126</ a > < span class ="kw "> let </ span > (index, epoch) = id.unzip();
127- < a href =#127 id =127 data-nosnippet > 127</ a > < span class ="kw "> let </ span > (result, storage_epoch) = < span class ="kw "> match </ span > < span class ="self "> self</ span > .map.get(index < span class ="kw "> as </ span > usize) {
128- < a href =#128 id =128 data-nosnippet > 128</ a > < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> &</ span > Element::Occupied(< span class ="kw-2 "> ref </ span > v, epoch)) => (v.clone(), epoch),
129- < a href =#129 id =129 data-nosnippet > 129</ a > < span class ="prelude-val "> None </ span > | < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> &</ span > Element::Vacant) => < span class ="macro "> panic!</ span > (< span class ="string "> "{}[{:?}] does not exist"</ span > , < span class ="self "> self</ span > .kind, id),
130- < a href =#130 id =130 data-nosnippet > 130</ a > };
131- < a href =#131 id =131 data-nosnippet > 131</ a > < span class ="macro "> assert_eq!</ span > (
132- < a href =#132 id =132 data-nosnippet > 132</ a > epoch, storage_epoch,
133- < a href =#133 id =133 data-nosnippet > 133</ a > < span class ="string "> "{}[{:?}] is no longer alive"</ span > ,
134- < a href =#134 id =134 data-nosnippet > 134</ a > < span class ="self "> self</ span > .kind, id
135- < a href =#135 id =135 data-nosnippet > 135</ a > );
136- < a href =#136 id =136 data-nosnippet > 136</ a > result
137- < a href =#137 id =137 data-nosnippet > 137</ a > }
138- < a href =#138 id =138 data-nosnippet > 138</ a > }</ code > </ pre > </ div > </ section > </ main > </ body > </ html >
97+ < a href =#97 id =97 data-nosnippet > 97</ a > < span class ="kw "> let </ span > stored = < span class ="self "> self
98+ < a href =#98 id =98 data-nosnippet > 98</ a > </ span > .map
99+ < a href =#99 id =99 data-nosnippet > 99</ a > .get_mut(index < span class ="kw "> as </ span > usize)
100+ < a href =#100 id =100 data-nosnippet > 100</ a > .unwrap_or_else(|| < span class ="macro "> panic!</ span > (< span class ="string "> "{}[{:?}] does not exist"</ span > , < span class ="self "> self</ span > .kind, id));
101+ < a href =#101 id =101 data-nosnippet > 101</ a > < span class ="kw "> match </ span > mem::replace(stored, Element::Vacant) {
102+ < a href =#102 id =102 data-nosnippet > 102</ a > Element::Occupied(value, storage_epoch) => {
103+ < a href =#103 id =103 data-nosnippet > 103</ a > < span class ="macro "> assert_eq!</ span > (epoch, storage_epoch, < span class ="string "> "id epoch mismatch"</ span > );
104+ < a href =#104 id =104 data-nosnippet > 104</ a > value
105+ < a href =#105 id =105 data-nosnippet > 105</ a > }
106+ < a href =#106 id =106 data-nosnippet > 106</ a > Element::Vacant => < span class ="macro "> panic!</ span > (< span class ="string "> "Cannot remove a vacant resource"</ span > ),
107+ < a href =#107 id =107 data-nosnippet > 107</ a > }
108+ < a href =#108 id =108 data-nosnippet > 108</ a > }
109+ < a href =#109 id =109 data-nosnippet > 109</ a >
110+ < a href =#110 id =110 data-nosnippet > 110</ a > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> fn </ span > iter(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > ) -> < span class ="kw "> impl </ span > Iterator<Item = (Id<T::Marker>, < span class ="kw-2 "> &</ span > T)> {
111+ < a href =#111 id =111 data-nosnippet > 111</ a > < span class ="self "> self</ span > .map
112+ < a href =#112 id =112 data-nosnippet > 112</ a > .iter()
113+ < a href =#113 id =113 data-nosnippet > 113</ a > .enumerate()
114+ < a href =#114 id =114 data-nosnippet > 114</ a > .filter_map(< span class ="kw "> move </ span > |(index, x)| < span class ="kw "> match </ span > < span class ="kw-2 "> *</ span > x {
115+ < a href =#115 id =115 data-nosnippet > 115</ a > Element::Occupied(< span class ="kw-2 "> ref </ span > value, storage_epoch) => {
116+ < a href =#116 id =116 data-nosnippet > 116</ a > < span class ="prelude-val "> Some</ span > ((Id::zip(index < span class ="kw "> as </ span > Index, storage_epoch), value))
117+ < a href =#117 id =117 data-nosnippet > 117</ a > }
118+ < a href =#118 id =118 data-nosnippet > 118</ a > < span class ="kw "> _ </ span > => < span class ="prelude-val "> None</ span > ,
119+ < a href =#119 id =119 data-nosnippet > 119</ a > })
120+ < a href =#120 id =120 data-nosnippet > 120</ a > }
121+ < a href =#121 id =121 data-nosnippet > 121</ a > }
122+ < a href =#122 id =122 data-nosnippet > 122</ a >
123+ < a href =#123 id =123 data-nosnippet > 123</ a > < span class ="kw "> impl</ span > <T> Storage<T>
124+ < a href =#124 id =124 data-nosnippet > 124</ a > < span class ="kw "> where
125+ < a href =#125 id =125 data-nosnippet > 125</ a > </ span > T: StorageItem + Clone,
126+ < a href =#126 id =126 data-nosnippet > 126</ a > {
127+ < a href =#127 id =127 data-nosnippet > 127</ a > < span class ="doccomment "> /// Get an owned reference to an item.
128+ < a href =#128 id =128 data-nosnippet > 128</ a > /// Panics if there is an epoch mismatch, the entry is empty or in error.
129+ < a href =#129 id =129 data-nosnippet > 129</ a > </ span > < span class ="kw "> pub</ span > (< span class ="kw "> crate</ span > ) < span class ="kw "> fn </ span > get(< span class ="kw-2 "> &</ span > < span class ="self "> self</ span > , id: Id<T::Marker>) -> T {
130+ < a href =#130 id =130 data-nosnippet > 130</ a > < span class ="kw "> let </ span > (index, epoch) = id.unzip();
131+ < a href =#131 id =131 data-nosnippet > 131</ a > < span class ="kw "> let </ span > (result, storage_epoch) = < span class ="kw "> match </ span > < span class ="self "> self</ span > .map.get(index < span class ="kw "> as </ span > usize) {
132+ < a href =#132 id =132 data-nosnippet > 132</ a > < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> &</ span > Element::Occupied(< span class ="kw-2 "> ref </ span > v, epoch)) => (v.clone(), epoch),
133+ < a href =#133 id =133 data-nosnippet > 133</ a > < span class ="prelude-val "> None </ span > | < span class ="prelude-val "> Some</ span > (< span class ="kw-2 "> &</ span > Element::Vacant) => < span class ="macro "> panic!</ span > (< span class ="string "> "{}[{:?}] does not exist"</ span > , < span class ="self "> self</ span > .kind, id),
134+ < a href =#134 id =134 data-nosnippet > 134</ a > };
135+ < a href =#135 id =135 data-nosnippet > 135</ a > < span class ="macro "> assert_eq!</ span > (
136+ < a href =#136 id =136 data-nosnippet > 136</ a > epoch, storage_epoch,
137+ < a href =#137 id =137 data-nosnippet > 137</ a > < span class ="string "> "{}[{:?}] is no longer alive"</ span > ,
138+ < a href =#138 id =138 data-nosnippet > 138</ a > < span class ="self "> self</ span > .kind, id
139+ < a href =#139 id =139 data-nosnippet > 139</ a > );
140+ < a href =#140 id =140 data-nosnippet > 140</ a > result
141+ < a href =#141 id =141 data-nosnippet > 141</ a > }
142+ < a href =#142 id =142 data-nosnippet > 142</ a > }</ code > </ pre > </ div > </ section > </ main > </ body > </ html >
0 commit comments