Skip to content

Commit 19940e0

Browse files
igor-aptosJakeSilverman
authored andcommitted
rename iterator-creating functions to _fname_internal
1 parent af3cfcd commit 19940e0

File tree

8 files changed

+383
-291
lines changed

8 files changed

+383
-291
lines changed

aptos-move/framework/aptos-framework/doc/big_ordered_map.md

Lines changed: 109 additions & 91 deletions
Large diffs are not rendered by default.

aptos-move/framework/aptos-framework/doc/ordered_map.md

Lines changed: 86 additions & 52 deletions
Large diffs are not rendered by default.

aptos-move/framework/aptos-framework/sources/datastructures/big_ordered_map.move

Lines changed: 104 additions & 85 deletions
Large diffs are not rendered by default.

aptos-move/framework/aptos-framework/sources/datastructures/big_ordered_map.spec.move

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ spec aptos_std::big_ordered_map {
9797
pragma verify = false;
9898
}
9999

100-
spec lower_bound {
100+
spec internal_lower_bound {
101101
pragma opaque;
102102
pragma verify = false;
103103
}
@@ -221,17 +221,17 @@ spec aptos_std::big_ordered_map {
221221
}
222222

223223

224-
spec find {
224+
spec internal_find {
225225
pragma opaque;
226226
pragma verify = false;
227227
}
228228

229-
spec new_begin_iter {
229+
spec internal_new_begin_iter {
230230
pragma opaque;
231231
pragma verify = false;
232232
}
233233

234-
spec new_end_iter {
234+
spec internal_new_end_iter {
235235
pragma opaque;
236236
pragma verify = false;
237237
}

aptos-move/framework/aptos-framework/sources/datastructures/ordered_map.move

Lines changed: 60 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,15 @@
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.
2529
module 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

Comments
 (0)