1717/// Uses cmp::compare for ordering, which compares primitive types natively, and uses common
1818/// lexicographical sorting for complex types.
1919///
20- /// All iterator functions need to be carefully used, because they are just pointers into the
20+ /// Warning: All iterator functions need to be carefully used, because they are just pointers into the
2121/// structure, and modification of the map invalidates them (without compiler being able to catch it).
2222/// Type is also named IteratorPtr, so that Iterator is free to use later.
2323/// Better guarantees would need future Move improvements that will allow references to be part of the struct,
2424/// allowing cleaner iterator APIs.
25+ ///
26+ /// That's why all functions returning iterators are prefixed with "internal_", to clarify nuances needed to make
27+ /// sure usage is correct.
28+ /// A set of inline utility methods is provided instead, to provide guaranteed valid usage to iterators.
2529module aptos_std ::ordered_map {
2630 friend aptos_std ::big_ordered_map ;
2731
@@ -146,15 +150,15 @@ module aptos_std::ordered_map {
146150
147151 /// Returns whether map contains a given key.
148152 public fun contains <K , V >(self: &OrderedMap <K , V >, key: &K ): bool {
149- !self.find (key).iter_is_end (self)
153+ !self.internal_find (key).iter_is_end (self)
150154 }
151155
152156 public fun borrow <K , V >(self: &OrderedMap <K , V >, key: &K ): &V {
153- self.find (key).iter_borrow (self)
157+ self.internal_find (key).iter_borrow (self)
154158 }
155159
156160 public fun borrow_mut <K , V >(self: &mut OrderedMap <K , V >, key: &K ): &mut V {
157- self.find (key).iter_borrow_mut (self)
161+ self.internal_find (key).iter_borrow_mut (self)
158162 }
159163
160164 /// Changes the key, while keeping the same value attached to it
@@ -317,7 +321,7 @@ module aptos_std::ordered_map {
317321 }
318322
319323 public fun prev_key <K : copy , V >(self: &OrderedMap <K , V >, key: &K ): Option <K > {
320- let it = self.lower_bound (key);
324+ let it = self.internal_lower_bound (key);
321325 if (it.iter_is_begin (self)) {
322326 option::none ()
323327 } else {
@@ -326,7 +330,7 @@ module aptos_std::ordered_map {
326330 }
327331
328332 public fun next_key <K : copy , V >(self: &OrderedMap <K , V >, key: &K ): Option <K > {
329- let it = self.lower_bound (key);
333+ let it = self.internal_lower_bound (key);
330334 if (it.iter_is_end (self)) {
331335 option::none ()
332336 } else {
@@ -346,45 +350,58 @@ module aptos_std::ordered_map {
346350
347351 // TODO: see if it is more understandable if iterator points between elements,
348352 // and there is iter_borrow_next and iter_borrow_prev, and provide iter_insert.
353+ // This is called "cursor" in rust instead.
349354
355+ /// Warning: Marked as internal, as it is safer to utilize provided inline functions instead.
356+ /// For direct usage of this method, check Warning at the top of the file corresponding to iterators.
357+ ///
350358 /// Returns an iterator pointing to the first element that is greater or equal to the provided
351359 /// key, or an end iterator if such element doesn't exist.
352- public fun lower_bound <K , V >(self: &OrderedMap <K , V >, key: &K ): IteratorPtr {
360+ public fun internal_lower_bound <K , V >(self: &OrderedMap <K , V >, key: &K ): IteratorPtr {
353361 let entries = &self.entries;
354362 let len = entries.length ();
355363
356364 let index = binary_search (key, entries, 0 , len);
357365 if (index == len) {
358- self.new_end_iter ()
366+ self.internal_new_end_iter ()
359367 } else {
360368 new_iter (index)
361369 }
362370 }
363371
372+ /// Warning: Marked as internal, as it is safer to utilize provided inline functions instead.
373+ /// For direct usage of this method, check Warning at the top of the file corresponding to iterators.
374+ ///
364375 /// Returns an iterator pointing to the element that equals to the provided key, or an end
365376 /// iterator if the key is not found.
366- public fun find <K , V >(self: &OrderedMap <K , V >, key: &K ): IteratorPtr {
367- let lower_bound = self.lower_bound (key);
368- if (lower_bound .iter_is_end (self)) {
369- lower_bound
370- } else if (lower_bound .iter_borrow_key (self) == key) {
371- lower_bound
377+ public fun internal_find <K , V >(self: &OrderedMap <K , V >, key: &K ): IteratorPtr {
378+ let internal_lower_bound = self.internal_lower_bound (key);
379+ if (internal_lower_bound .iter_is_end (self)) {
380+ internal_lower_bound
381+ } else if (internal_lower_bound .iter_borrow_key (self) == key) {
382+ internal_lower_bound
372383 } else {
373- self.new_end_iter ()
384+ self.internal_new_end_iter ()
374385 }
375386 }
376387
388+ /// Warning: Marked as internal, as it is safer to utilize provided inline functions instead.
389+ /// For direct usage of this method, check Warning at the top of the file corresponding to iterators.
390+ ///
377391 /// Returns the begin iterator.
378- public fun new_begin_iter <K , V >(self: &OrderedMap <K , V >): IteratorPtr {
392+ public fun internal_new_begin_iter <K , V >(self: &OrderedMap <K , V >): IteratorPtr {
379393 if (self.is_empty ()) {
380394 return IteratorPtr::End ;
381395 };
382396
383397 new_iter (0 )
384398 }
385399
400+ /// Warning: Marked as internal, as it is safer to utilize provided inline functions instead.
401+ /// For direct usage of this method, check Warning at the top of the file corresponding to iterators.
402+ ///
386403 /// Returns the end iterator.
387- public fun new_end_iter <K , V >(self: &OrderedMap <K , V >): IteratorPtr {
404+ public fun internal_new_end_iter <K , V >(self: &OrderedMap <K , V >): IteratorPtr {
388405 IteratorPtr::End
389406 }
390407
@@ -401,7 +418,7 @@ module aptos_std::ordered_map {
401418 if (index < map.entries.length ()) {
402419 new_iter (index)
403420 } else {
404- map.new_end_iter ()
421+ map.internal_new_end_iter ()
405422 }
406423 }
407424
@@ -581,7 +598,7 @@ module aptos_std::ordered_map {
581598
582599 /// Apply the function to a reference of each key-value pair in the map.
583600 public inline fun for_each_ref <K : copy + drop , V >(self: &OrderedMap <K , V >, f: |&K , &V |) {
584- let iter = self.new_begin_iter ();
601+ let iter = self.internal_new_begin_iter ();
585602 while (!iter.iter_is_end (self)) {
586603 f (iter.iter_borrow_key (self), iter.iter_borrow (self));
587604 iter = iter.iter_next (self);
@@ -598,7 +615,7 @@ module aptos_std::ordered_map {
598615
599616 /// Apply the function to a mutable reference of each key-value pair in the map.
600617 public inline fun for_each_mut <K : copy + drop , V >(self: &mut OrderedMap <K , V >, f: |&K , &mut V |) {
601- let iter = self.new_begin_iter ();
618+ let iter = self.internal_new_begin_iter ();
602619 while (!iter.iter_is_end (self)) {
603620 let key = *iter.iter_borrow_key (self);
604621 f (&key, iter.iter_borrow_mut (self));
@@ -674,15 +691,15 @@ module aptos_std::ordered_map {
674691 fun validate_iteration <K : drop + copy + store , V : store >(self: &OrderedMap <K , V >) {
675692 let expected_num_elements = self.length ();
676693 let num_elements = 0 ;
677- let it = self.new_begin_iter ();
694+ let it = self.internal_new_begin_iter ();
678695 while (!it.iter_is_end (self)) {
679696 num_elements += 1 ;
680697 it = it.iter_next (self);
681698 };
682699 assert !(num_elements == expected_num_elements, 2 );
683700
684701 let num_elements = 0 ;
685- let it = self.new_end_iter ();
702+ let it = self.internal_new_end_iter ();
686703 while (!it.iter_is_begin (self)) {
687704 it = it.iter_prev (self);
688705 num_elements += 1 ;
@@ -1071,41 +1088,41 @@ module aptos_std::ordered_map {
10711088 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
10721089 public fun test_iter_end_next_abort () {
10731090 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1074- map.new_end_iter ().iter_next (&map);
1091+ map.internal_new_end_iter ().iter_next (&map);
10751092 }
10761093
10771094 #[test]
10781095 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
10791096 public fun test_iter_end_borrow_key_abort () {
10801097 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1081- map.new_end_iter ().iter_borrow_key (&map);
1098+ map.internal_new_end_iter ().iter_borrow_key (&map);
10821099 }
10831100
10841101 #[test]
10851102 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
10861103 public fun test_iter_end_borrow_abort () {
10871104 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1088- map.new_end_iter ().iter_borrow (&map);
1105+ map.internal_new_end_iter ().iter_borrow (&map);
10891106 }
10901107
10911108 #[test]
10921109 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
10931110 public fun test_iter_end_borrow_mut_abort () {
10941111 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1095- map.new_end_iter ().iter_borrow_mut (&mut map);
1112+ map.internal_new_end_iter ().iter_borrow_mut (&mut map);
10961113 }
10971114
10981115 #[test]
10991116 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
11001117 public fun test_iter_begin_prev_abort () {
11011118 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1102- map.new_begin_iter ().iter_prev (&map);
1119+ map.internal_new_begin_iter ().iter_prev (&map);
11031120 }
11041121
11051122 #[test]
11061123 public fun test_iter_is_begin_from_non_empty () {
11071124 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1108- let iter = map.new_begin_iter ();
1125+ let iter = map.internal_new_begin_iter ();
11091126 assert !(iter.iter_is_begin (&map), 1 );
11101127 assert !(iter.iter_is_begin_from_non_empty (), 1 );
11111128
@@ -1114,59 +1131,59 @@ module aptos_std::ordered_map {
11141131 assert !(!iter.iter_is_begin_from_non_empty (), 1 );
11151132
11161133 let map = new <u64 , u64 >();
1117- let iter = map.new_begin_iter ();
1134+ let iter = map.internal_new_begin_iter ();
11181135 assert !(iter.iter_is_begin (&map), 1 );
11191136 assert !(!iter.iter_is_begin_from_non_empty (), 1 );
11201137 }
11211138
11221139 #[test]
11231140 public fun test_iter_remove () {
11241141 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1125- map.new_begin_iter ().iter_next (&map).iter_remove (&mut map);
1142+ map.internal_new_begin_iter ().iter_next (&map).iter_remove (&mut map);
11261143 assert !(map == new_from (vector [1 , 5 ], vector [10 , 50 ]), 1 );
11271144 }
11281145
11291146 #[test]
11301147 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
11311148 public fun test_iter_remove_abort () {
11321149 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1133- map.new_end_iter ().iter_remove (&mut map);
1150+ map.internal_new_end_iter ().iter_remove (&mut map);
11341151 }
11351152
11361153 #[test]
11371154 public fun test_iter_replace () {
11381155 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1139- map.new_begin_iter ().iter_next (&map).iter_replace (&mut map, 35 );
1156+ map.internal_new_begin_iter ().iter_next (&map).iter_replace (&mut map, 35 );
11401157 assert !(map == new_from (vector [1 , 3 , 5 ], vector [10 , 35 , 50 ]), 1 );
11411158 }
11421159
11431160 #[test]
11441161 #[expected_failure(abort_code = 0x10003 , location = Self)] /// EITER_OUT_OF_BOUNDS
11451162 public fun test_iter_replace_abort () {
11461163 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1147- map.new_end_iter ().iter_replace (&mut map, 35 );
1164+ map.internal_new_end_iter ().iter_replace (&mut map, 35 );
11481165 }
11491166
11501167 #[test]
11511168 public fun test_iter_add () {
11521169 {
11531170 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1154- map.new_begin_iter ().iter_add (&mut map, 0 , 5 );
1171+ map.internal_new_begin_iter ().iter_add (&mut map, 0 , 5 );
11551172 assert !(map == new_from (vector [0 , 1 , 3 , 5 ], vector [5 , 10 , 30 , 50 ]), 1 );
11561173 };
11571174 {
11581175 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1159- map.new_begin_iter ().iter_next (&map).iter_add (&mut map, 2 , 20 );
1176+ map.internal_new_begin_iter ().iter_next (&map).iter_add (&mut map, 2 , 20 );
11601177 assert !(map == new_from (vector [1 , 2 , 3 , 5 ], vector [10 , 20 , 30 , 50 ]), 2 );
11611178 };
11621179 {
11631180 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1164- map.new_end_iter ().iter_add (&mut map, 6 , 60 );
1181+ map.internal_new_end_iter ().iter_add (&mut map, 6 , 60 );
11651182 assert !(map == new_from (vector [1 , 3 , 5 , 6 ], vector [10 , 30 , 50 , 60 ]), 3 );
11661183 };
11671184 {
11681185 let map = new ();
1169- map.new_end_iter ().iter_add (&mut map, 1 , 10 );
1186+ map.internal_new_end_iter ().iter_add (&mut map, 1 , 10 );
11701187 assert !(map == new_from (vector [1 ], vector [10 ]), 4 );
11711188 };
11721189 }
@@ -1175,28 +1192,28 @@ module aptos_std::ordered_map {
11751192 #[expected_failure(abort_code = 0x10004 , location = Self)] /// ENEW_KEY_NOT_IN_ORDER
11761193 public fun test_iter_add_abort_1 () {
11771194 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1178- map.new_begin_iter ().iter_add (&mut map, 1 , 5 );
1195+ map.internal_new_begin_iter ().iter_add (&mut map, 1 , 5 );
11791196 }
11801197
11811198 #[test]
11821199 #[expected_failure(abort_code = 0x10004 , location = Self)] /// ENEW_KEY_NOT_IN_ORDER
11831200 public fun test_iter_add_abort_2 () {
11841201 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1185- map.new_end_iter ().iter_add (&mut map, 5 , 55 );
1202+ map.internal_new_end_iter ().iter_add (&mut map, 5 , 55 );
11861203 }
11871204
11881205 #[test]
11891206 #[expected_failure(abort_code = 0x10004 , location = Self)] /// ENEW_KEY_NOT_IN_ORDER
11901207 public fun test_iter_add_abort_3 () {
11911208 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1192- map.new_begin_iter ().iter_next (&map).iter_add (&mut map, 1 , 15 );
1209+ map.internal_new_begin_iter ().iter_next (&map).iter_add (&mut map, 1 , 15 );
11931210 }
11941211
11951212 #[test]
11961213 #[expected_failure(abort_code = 0x10004 , location = Self)] /// ENEW_KEY_NOT_IN_ORDER
11971214 public fun test_iter_add_abort_4 () {
11981215 let map = new_from (vector [1 , 3 , 5 ], vector [10 , 30 , 50 ]);
1199- map.new_begin_iter ().iter_next (&map).iter_add (&mut map, 3 , 25 );
1216+ map.internal_new_begin_iter ().iter_next (&map).iter_add (&mut map, 3 , 25 );
12001217 }
12011218
12021219 #[test]
@@ -1257,12 +1274,12 @@ module aptos_std::ordered_map {
12571274
12581275 for (i in 0 ..len) {
12591276 let element = shuffled_data.borrow (i);
1260- let it = map.find (element);
1277+ let it = map.internal_find (element);
12611278 assert !(!it.iter_is_end (&map), 6 );
12621279 assert !(it.iter_borrow_key (&map) == element, 7 );
12631280
12641281 let it_next = it.iter_next (&map);
1265- let it_after = map.lower_bound (&(*element + 1 ));
1282+ let it_after = map.internal_lower_bound (&(*element + 1 ));
12661283
12671284 assert !(it_next == it_after, 8 );
12681285 };
0 commit comments