Skip to content

Commit 53e5cb4

Browse files
committed
iterators and utilities
1 parent 3ffc938 commit 53e5cb4

File tree

6 files changed

+522
-340
lines changed

6 files changed

+522
-340
lines changed

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

Lines changed: 312 additions & 116 deletions
Large diffs are not rendered by default.

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

Lines changed: 46 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ allowing cleaner iterator APIs.
3939
- [Function `add`](#0x1_ordered_map_add)
4040
- [Function `upsert`](#0x1_ordered_map_upsert)
4141
- [Function `remove`](#0x1_ordered_map_remove)
42+
- [Function `remove_or_none`](#0x1_ordered_map_remove_or_none)
4243
- [Function `contains`](#0x1_ordered_map_contains)
4344
- [Function `borrow`](#0x1_ordered_map_borrow)
4445
- [Function `borrow_mut`](#0x1_ordered_map_borrow_mut)
@@ -77,7 +78,6 @@ allowing cleaner iterator APIs.
7778
- [Function `destroy`](#0x1_ordered_map_destroy)
7879
- [Function `for_each`](#0x1_ordered_map_for_each)
7980
- [Function `for_each_ref`](#0x1_ordered_map_for_each_ref)
80-
- [Function `for_each_ref_friend`](#0x1_ordered_map_for_each_ref_friend)
8181
- [Function `for_each_mut`](#0x1_ordered_map_for_each_mut)
8282
- [Function `new_iter`](#0x1_ordered_map_new_iter)
8383
- [Function `binary_search`](#0x1_ordered_map_binary_search)
@@ -515,6 +515,39 @@ Aborts with EKEY_NOT_FOUND if <code>key</code> doesn't exist.
515515

516516

517517

518+
</details>
519+
520+
<a id="0x1_ordered_map_remove_or_none"></a>
521+
522+
## Function `remove_or_none`
523+
524+
Remove a key/value pair from the map.
525+
Returns none if <code>key</code> doesn't exist.
526+
527+
528+
<pre><code><b>public</b> <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_remove_or_none">remove_or_none</a>&lt;K: drop, V&gt;(self: &<b>mut</b> <a href="ordered_map.md#0x1_ordered_map_OrderedMap">ordered_map::OrderedMap</a>&lt;K, V&gt;, key: &K): <a href="../../aptos-stdlib/../move-stdlib/doc/option.md#0x1_option_Option">option::Option</a>&lt;V&gt;
529+
</code></pre>
530+
531+
532+
533+
<details>
534+
<summary>Implementation</summary>
535+
536+
537+
<pre><code><b>public</b> <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_remove_or_none">remove_or_none</a>&lt;K: drop, V&gt;(self: &<b>mut</b> <a href="ordered_map.md#0x1_ordered_map_OrderedMap">OrderedMap</a>&lt;K, V&gt;, key: &K): Option&lt;V&gt; {
538+
<b>let</b> len = self.entries.<a href="ordered_map.md#0x1_ordered_map_length">length</a>();
539+
<b>let</b> index = <a href="ordered_map.md#0x1_ordered_map_binary_search">binary_search</a>(key, &self.entries, 0, len);
540+
<b>if</b> (index &lt; len && key == &self.entries[index].key) {
541+
<b>let</b> <a href="ordered_map.md#0x1_ordered_map_Entry">Entry</a> { key: _, value } = self.entries.<a href="ordered_map.md#0x1_ordered_map_remove">remove</a>(index);
542+
<a href="../../aptos-stdlib/../move-stdlib/doc/option.md#0x1_option_some">option::some</a>(value)
543+
} <b>else</b> {
544+
<a href="../../aptos-stdlib/../move-stdlib/doc/option.md#0x1_option_none">option::none</a>()
545+
}
546+
}
547+
</code></pre>
548+
549+
550+
518551
</details>
519552

520553
<a id="0x1_ordered_map_contains"></a>
@@ -1689,9 +1722,6 @@ Apply the function to each key-value pair in the map, consuming it.
16891722

16901723
Apply the function to a reference of each key-value pair in the map.
16911724

1692-
Current implementation is O(n * log(n)). After function values will be optimized
1693-
to O(n).
1694-
16951725

16961726
<pre><code><b>public</b> <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_ref">for_each_ref</a>&lt;K: <b>copy</b>, drop, V&gt;(self: &<a href="ordered_map.md#0x1_ordered_map_OrderedMap">ordered_map::OrderedMap</a>&lt;K, V&gt;, f: |&K, &V|)
16971727
</code></pre>
@@ -1703,29 +1733,13 @@ to O(n).
17031733

17041734

17051735
<pre><code><b>public</b> inline <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_ref">for_each_ref</a>&lt;K: <b>copy</b> + drop, V&gt;(self: &<a href="ordered_map.md#0x1_ordered_map_OrderedMap">OrderedMap</a>&lt;K, V&gt;, f: |&K, &V|) {
1706-
// This implementation is innefficient: O(log(n)) for next_key / borrow lookups every time,
1707-
// but is the only one available through the <b>public</b> API.
1708-
<b>if</b> (!self.<a href="ordered_map.md#0x1_ordered_map_is_empty">is_empty</a>()) {
1709-
<b>let</b> (k, v) = self.<a href="ordered_map.md#0x1_ordered_map_borrow_front">borrow_front</a>();
1710-
f(k, v);
1711-
1712-
<b>let</b> cur_k = self.<a href="ordered_map.md#0x1_ordered_map_next_key">next_key</a>(k);
1713-
<b>while</b> (cur_k.is_some()) {
1714-
<b>let</b> k = cur_k.destroy_some();
1715-
f(&k, self.<a href="ordered_map.md#0x1_ordered_map_borrow">borrow</a>(&k));
1716-
1717-
cur_k = self.<a href="ordered_map.md#0x1_ordered_map_next_key">next_key</a>(&k);
1718-
};
1719-
};
1720-
1721-
// TODO: <b>if</b> we make iterator api <b>public</b> <b>update</b> <b>to</b>:
1722-
// <b>let</b> iter = self.<a href="ordered_map.md#0x1_ordered_map_new_begin_iter">new_begin_iter</a>();
1723-
// <b>while</b> (!iter.<a href="ordered_map.md#0x1_ordered_map_iter_is_end">iter_is_end</a>(self)) {
1724-
// f(iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_key">iter_borrow_key</a>(self), iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow">iter_borrow</a>(self));
1725-
// iter = iter.<a href="ordered_map.md#0x1_ordered_map_iter_next">iter_next</a>(self);
1726-
// }
1736+
<b>let</b> iter = self.<a href="ordered_map.md#0x1_ordered_map_new_begin_iter">new_begin_iter</a>();
1737+
<b>while</b> (!iter.<a href="ordered_map.md#0x1_ordered_map_iter_is_end">iter_is_end</a>(self)) {
1738+
f(iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_key">iter_borrow_key</a>(self), iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow">iter_borrow</a>(self));
1739+
iter = iter.<a href="ordered_map.md#0x1_ordered_map_iter_next">iter_next</a>(self);
1740+
}
17271741

1728-
// TODO: once <b>move</b> supports private functions udpate <b>to</b>:
1742+
// TODO: once <b>move</b> supports private functions <b>update</b> <b>to</b>:
17291743
// <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_for_each_ref">vector::for_each_ref</a>(
17301744
// &self.entries,
17311745
// |entry| {
@@ -1737,34 +1751,6 @@ to O(n).
17371751

17381752

17391753

1740-
</details>
1741-
1742-
<a id="0x1_ordered_map_for_each_ref_friend"></a>
1743-
1744-
## Function `for_each_ref_friend`
1745-
1746-
1747-
1748-
<pre><code><b>public</b>(<b>friend</b>) <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_ref_friend">for_each_ref_friend</a>&lt;K: <b>copy</b>, drop, V&gt;(self: &<a href="ordered_map.md#0x1_ordered_map_OrderedMap">ordered_map::OrderedMap</a>&lt;K, V&gt;, f: |&K, &V|)
1749-
</code></pre>
1750-
1751-
1752-
1753-
<details>
1754-
<summary>Implementation</summary>
1755-
1756-
1757-
<pre><code><b>public</b>(<b>friend</b>) inline <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_ref_friend">for_each_ref_friend</a>&lt;K: <b>copy</b> + drop, V&gt;(self: &<a href="ordered_map.md#0x1_ordered_map_OrderedMap">OrderedMap</a>&lt;K, V&gt;, f: |&K, &V|) {
1758-
<b>let</b> iter = self.<a href="ordered_map.md#0x1_ordered_map_new_begin_iter">new_begin_iter</a>();
1759-
<b>while</b> (!iter.<a href="ordered_map.md#0x1_ordered_map_iter_is_end">iter_is_end</a>(self)) {
1760-
f(iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_key">iter_borrow_key</a>(self), iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow">iter_borrow</a>(self));
1761-
iter = iter.<a href="ordered_map.md#0x1_ordered_map_iter_next">iter_next</a>(self);
1762-
}
1763-
}
1764-
</code></pre>
1765-
1766-
1767-
17681754
</details>
17691755

17701756
<a id="0x1_ordered_map_for_each_mut"></a>
@@ -1773,9 +1759,6 @@ to O(n).
17731759

17741760
Apply the function to a mutable reference of each key-value pair in the map.
17751761

1776-
Current implementation is O(n * log(n)). After function values will be optimized
1777-
to O(n).
1778-
17791762

17801763
<pre><code><b>public</b> <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_mut">for_each_mut</a>&lt;K: <b>copy</b>, drop, V&gt;(self: &<b>mut</b> <a href="ordered_map.md#0x1_ordered_map_OrderedMap">ordered_map::OrderedMap</a>&lt;K, V&gt;, f: |&K, &<b>mut</b> V|)
17811764
</code></pre>
@@ -1787,32 +1770,12 @@ to O(n).
17871770

17881771

17891772
<pre><code><b>public</b> inline <b>fun</b> <a href="ordered_map.md#0x1_ordered_map_for_each_mut">for_each_mut</a>&lt;K: <b>copy</b> + drop, V&gt;(self: &<b>mut</b> <a href="ordered_map.md#0x1_ordered_map_OrderedMap">OrderedMap</a>&lt;K, V&gt;, f: |&K, &<b>mut</b> V|) {
1790-
// This implementation is innefficient: O(log(n)) for next_key / borrow lookups every time,
1791-
// but is the only one available through the <b>public</b> API.
1792-
<b>if</b> (!self.<a href="ordered_map.md#0x1_ordered_map_is_empty">is_empty</a>()) {
1793-
<b>let</b> (k, _v) = self.<a href="ordered_map.md#0x1_ordered_map_borrow_front">borrow_front</a>();
1794-
1795-
<b>let</b> k = *k;
1796-
<b>let</b> done = <b>false</b>;
1797-
<b>while</b> (!done) {
1798-
f(&k, self.<a href="ordered_map.md#0x1_ordered_map_borrow_mut">borrow_mut</a>(&k));
1799-
1800-
<b>let</b> cur_k = self.<a href="ordered_map.md#0x1_ordered_map_next_key">next_key</a>(&k);
1801-
<b>if</b> (cur_k.is_some()) {
1802-
k = cur_k.destroy_some();
1803-
} <b>else</b> {
1804-
done = <b>true</b>;
1805-
}
1806-
};
1807-
};
1808-
1809-
// TODO: <b>if</b> we make iterator api <b>public</b> <b>update</b> <b>to</b>:
1810-
// <b>let</b> iter = self.<a href="ordered_map.md#0x1_ordered_map_new_begin_iter">new_begin_iter</a>();
1811-
// <b>while</b> (!iter.<a href="ordered_map.md#0x1_ordered_map_iter_is_end">iter_is_end</a>(self)) {
1812-
// <b>let</b> key = *iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_key">iter_borrow_key</a>(self);
1813-
// f(key, iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_mut">iter_borrow_mut</a>(self));
1814-
// iter = iter.<a href="ordered_map.md#0x1_ordered_map_iter_next">iter_next</a>(self);
1815-
// }
1773+
<b>let</b> iter = self.<a href="ordered_map.md#0x1_ordered_map_new_begin_iter">new_begin_iter</a>();
1774+
<b>while</b> (!iter.<a href="ordered_map.md#0x1_ordered_map_iter_is_end">iter_is_end</a>(self)) {
1775+
<b>let</b> key = *iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_key">iter_borrow_key</a>(self);
1776+
f(&key, iter.<a href="ordered_map.md#0x1_ordered_map_iter_borrow_mut">iter_borrow_mut</a>(self));
1777+
iter = iter.<a href="ordered_map.md#0x1_ordered_map_iter_next">iter_next</a>(self);
1778+
}
18161779

18171780
// TODO: once <b>move</b> supports private functions udpate <b>to</b>:
18181781
// <a href="../../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_for_each_mut">vector::for_each_mut</a>(

0 commit comments

Comments
 (0)