@@ -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 >< ; K: drop, V> ; (self: &<b >mut</b > <a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >ordered_map::OrderedMap</a >< ; K, V> ; , key: &K): <a href =" ../../aptos-stdlib/../move-stdlib/doc/option.md#0x1_option_Option " >option::Option</a >< ; V> ;
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 >< ; K: drop, V> ; (self: &<b >mut</b > <a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >OrderedMap</a >< ; K, V> ; , key: &K): Option< ; V> ; {
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 < ; 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
16901723Apply 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 >< ; K: <b >copy</b >, drop, V> ; (self: &<a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >ordered_map::OrderedMap</a >< ; K, V> ; , 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 >< ; K: <b >copy</b > + drop, V> ; (self: &<a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >OrderedMap</a >< ; K, V> ; , 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 >< ; K: <b >copy</b >, drop, V> ; (self: &<a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >ordered_map::OrderedMap</a >< ; K, V> ; , 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 >< ; K: <b >copy</b > + drop, V> ; (self: &<a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >OrderedMap</a >< ; K, V> ; , 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
17741760Apply 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 >< ; K: <b >copy</b >, drop, V> ; (self: &<b >mut</b > <a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >ordered_map::OrderedMap</a >< ; K, V> ; , 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 >< ; K: <b >copy</b > + drop, V> ; (self: &<b >mut</b > <a href =" ordered_map.md#0x1_ordered_map_OrderedMap " >OrderedMap</a >< ; K, V> ; , 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