@@ -102,12 +102,10 @@ impl<O: Ord + Copy + Send + Sync, V: Clone + Send + Sync> OrderedStore<O, V> for
102102/// A hashmap that also maintains a BTreeMap of keys ordered by a given value
103103/// This is useful for structures that need fast O(1) lookups, but also need to evict the oldest or least recently used entries
104104/// The Ordered Store must contain both the keys and values for persistence
105- pub struct OrderedHashMap < K , O , V > (
106- (
107- HashMap < K , ( O , V ) > ,
108- Box < dyn OrderedStore < O , Vec < ( K , V ) > > + Send + Sync > ,
109- ) ,
110- ) ;
105+ pub struct OrderedHashMap < K , O , V > {
106+ lookup : HashMap < K , ( O , V ) > ,
107+ ordered_lookup : Box < dyn OrderedStore < O , Vec < ( K , V ) > > + Send + Sync > ,
108+ }
111109
112110impl < K : Eq + Hash + Clone + Send + Sync , O : Ord + Clone + Send + Sync , V : Clone >
113111 OrderedHashMap < K , O , V >
@@ -121,17 +119,20 @@ impl<K: Eq + Hash + Clone + Send + Sync, O: Ord + Clone + Send + Sync, V: Clone>
121119 keyed_data. insert ( k. clone ( ) , ( order. clone ( ) , v. clone ( ) ) ) ;
122120 } )
123121 } ) ;
124- Self ( ( keyed_data, ordered_data) )
122+ Self {
123+ lookup : keyed_data,
124+ ordered_lookup : ordered_data,
125+ }
125126 }
126127}
127128
128129impl < K : Hash + Eq + Clone , O : Ord + Clone , V : Clone > OrderedHashMap < K , O , V > {
129130 pub fn len ( & self ) -> usize {
130- let ( lookup, _ ) = & self . 0 ;
131+ let lookup = & self . lookup ;
131132 lookup. len ( )
132133 }
133134 pub fn get ( & self , key : & K ) -> Option < & ( O , V ) > {
134- let ( lookup, _ ) = & self . 0 ;
135+ let lookup = & self . lookup ;
135136 lookup. get ( key)
136137 }
137138 fn get_key_value (
@@ -140,7 +141,8 @@ impl<K: Hash + Eq + Clone, O: Ord + Clone, V: Clone> OrderedHashMap<K, O, V> {
140141 & Box < dyn OrderedStore < O , Vec < ( K , V ) > > + Send + Sync > ,
141142 ) -> Option < ( O , Vec < K > ) > ,
142143 ) -> Option < ( K , O , V ) > {
143- let ( lookup, ordered_lookup) = & self . 0 ;
144+ let lookup = & self . lookup ;
145+ let ordered_lookup = & self . ordered_lookup ;
144146 selector ( ordered_lookup) . and_then ( |( _, keys) | {
145147 keys. first ( ) . and_then ( |key| {
146148 lookup
@@ -173,40 +175,42 @@ impl<K: Hash + Eq + Clone, O: Ord + Clone, V: Clone> OrderedHashMap<K, O, V> {
173175 }
174176 /// inserts a new entry with the given key and value and order
175177 pub fn insert ( & mut self , key : K , value : V , order : O ) -> Option < V > {
176- let ( lookup, order_lookup) = & mut self . 0 ;
178+ let lookup = & mut self . lookup ;
179+ let ordered_lookup = & mut self . ordered_lookup ;
177180
178181 if let Some ( ( old_order, _) ) = lookup. get ( & key) {
179182 // if entry already exists, remove it from the btree
180- if let Some ( mut keys) = order_lookup . remove ( old_order) {
183+ if let Some ( mut keys) = ordered_lookup . remove ( old_order) {
181184 keys. retain ( |k| k. 0 != key) ;
182185 // insert modified keys back into btree
183186 if !keys. is_empty ( ) {
184- order_lookup . insert ( old_order. clone ( ) , keys) ;
187+ ordered_lookup . insert ( old_order. clone ( ) , keys) ;
185188 }
186189 }
187190 }
188- let keys = match order_lookup . remove ( & order) {
191+ let keys = match ordered_lookup . remove ( & order) {
189192 Some ( mut ks) => {
190193 ks. push ( ( key. clone ( ) , value. clone ( ) ) ) ;
191194 ks
192195 }
193196 None => vec ! [ ( key. clone( ) , value. clone( ) ) ] ,
194197 } ;
195- order_lookup . insert ( order. clone ( ) , keys) ;
198+ ordered_lookup . insert ( order. clone ( ) , keys) ;
196199 lookup
197200 . insert ( key, ( order, value) )
198201 . and_then ( |( _, v) | Some ( v) )
199202 }
200203 /// removes the entry with the given key
201204 pub fn remove ( & mut self , key : & K ) -> Option < ( O , V ) > {
202- let ( lookup, order_lookup) = & mut self . 0 ;
205+ let lookup = & mut self . lookup ;
206+ let ordered_lookup = & mut self . ordered_lookup ;
203207 lookup. remove ( key) . and_then ( |( order, v) | {
204- match order_lookup . remove ( & order) {
208+ match ordered_lookup . remove ( & order) {
205209 Some ( mut keys) => {
206210 keys. retain ( |k| k. 0 != * key) ;
207211 // insert remaining keys back in
208212 if !keys. is_empty ( ) {
209- order_lookup . insert ( order. clone ( ) , keys) ;
213+ ordered_lookup . insert ( order. clone ( ) , keys) ;
210214 }
211215 }
212216 None => { }
0 commit comments