From 451267880a83e1e9d120e03971b4c0a678347bc9 Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 04:23:52 -0800 Subject: [PATCH 01/13] Add upsert and destroy also to vector --- .../aptos-stdlib/sources/simple_map.move | 61 +++++++++++++++++++ .../framework/move-stdlib/sources/vector.move | 13 ++++ 2 files changed, 74 insertions(+) diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 3217ffa691ea8..c5294799ae794 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -77,6 +77,38 @@ module aptos_std::simple_map { vector::push_back(&mut map.data, Element { key, value }); } + public inline fun upsert( + map: &mut SimpleMap, + key: Key, + value: Value, + drop: |Key, Value| + ) { + let len = std::vector::length(&map.data); + let i = 0; + while (i < len) { + let element = vector::borrow(&mut map.data, i); + if (&element.key == &key) { + break + }; + i = i + 1; + }; + if (i == len) { + vector::push_back(&mut map.data, Element { key, value }); + } else { + let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i); + vector::push_back(&mut map.data, Element { key, value}); + drop(_k, _v); + } + } + + public inline fun destroy( + map: SimpleMap, + d: |Key, Value| + ) { + let SimpleMap { data } = map; + std::vector::destroy(data, |e| { let Element { key, value } = e; d(key, value) }); + } + public fun remove( map: &mut SimpleMap, key: &Key, @@ -158,4 +190,33 @@ module aptos_std::simple_map { destroy_empty(map); } + + struct OnlyMove has store { val: u64 } + + #[test] + public fun upsert_test() { + let map = create(); + // test adding 3 elements using upsert + upsert(&mut map, 1, OnlyMove { val: 1 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert(&mut map, 2, OnlyMove { val: 2 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert(&mut map, 3, OnlyMove { val: 3 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + + assert!(length(&map) == 3, 0); + assert!(contains_key(&map, &1), 1); + assert!(contains_key(&map, &2), 2); + assert!(contains_key(&map, &3), 3); + assert!(borrow(&map, &1).val == 1, 4); + assert!(borrow(&map, &2).val == 2, 5); + assert!(borrow(&map, &3).val == 3, 6); + + // change mapping 1->1 to 1->4 + upsert(&mut map, 1, OnlyMove { val: 4 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + + assert!(length(&map) == 3, 7); + assert!(contains_key(&map, &1), 8); + assert!(borrow(&map, &1).val == 4, 9); + + std::debug::print(&b"done"); + destroy(map, |_k, _v| { let OnlyMove { val: _ } = _v; }); + } } diff --git a/aptos-move/framework/move-stdlib/sources/vector.move b/aptos-move/framework/move-stdlib/sources/vector.move index 5b7b4ae6cc877..9a5ad0bd6a9f3 100644 --- a/aptos-move/framework/move-stdlib/sources/vector.move +++ b/aptos-move/framework/move-stdlib/sources/vector.move @@ -262,6 +262,19 @@ module std::vector { result } + /// Destroy a vector + public inline fun destroy( + v: vector, + d: |Element| + ) { + let len = length(&v); + while (len != 0) { + d(pop_back(&mut v)); + len = len - 1; + }; + destroy_empty(v); + } + // ================================================================= // Module Specification From 781f86d78e4421c1402fbd14e6d7bf610839e39c Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 11:58:40 -0800 Subject: [PATCH 02/13] Improve libs --- .../framework/aptos-stdlib/doc/simple_map.md | 94 +++++++++++++++++++ .../aptos-stdlib/sources/simple_map.move | 79 ++++++++++++++-- .../framework/move-stdlib/sources/option.move | 5 + 3 files changed, 170 insertions(+), 8 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index 28842d37953ab..02a7344aec19a 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -21,6 +21,9 @@ This module provides a solution for sorted maps, that is it has the properties t - [Function `contains_key`](#0x1_simple_map_contains_key) - [Function `destroy_empty`](#0x1_simple_map_destroy_empty) - [Function `add`](#0x1_simple_map_add) +- [Function `to_vec`](#0x1_simple_map_to_vec) +- [Function `split_element`](#0x1_simple_map_split_element) +- [Function `upsert`](#0x1_simple_map_upsert) - [Function `remove`](#0x1_simple_map_remove) - [Function `find`](#0x1_simple_map_find) - [Specification](#@Specification_1) @@ -320,6 +323,97 @@ Map key is not found + + + + +## Function `to_vec` + + + +
public fun to_vec<Key: store, Value: store>(map: simple_map::SimpleMap<Key, Value>): vector<simple_map::Element<Key, Value>>
+
+ + + +
+Implementation + + +
public fun to_vec<Key: store, Value: store>(
+    map: SimpleMap<Key, Value>): vector<Element<Key, Value>> {
+    let SimpleMap { data } = map;
+    data
+}
+
+ + + +
+ + + +## Function `split_element` + + + +
public fun split_element<Key: store, Value: store>(e: simple_map::Element<Key, Value>): (Key, Value)
+
+ + + +
+Implementation + + +
public fun split_element<Key: store, Value: store>(e: Element<Key, Value>): (Key, Value) {
+    let Element { key, value} = e;
+    (key, value)
+}
+
+ + + +
+ + + +## Function `upsert` + + + +
public fun upsert<Key: store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): (option::Option<Key>, option::Option<Value>)
+
+ + + +
+Implementation + + +
public fun upsert<Key: store, Value: store>(
+    map: &mut SimpleMap<Key, Value>,
+    key: Key,
+    value: Value
+): (Option<Key>, Option<Value>) {
+    let len = std::vector::length(&map.data);
+    let i = 0;
+    while (i < len) {
+        let element = vector::borrow(&mut map.data, i);
+        if (&element.key == &key) {
+            let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i);
+            vector::push_back(&mut map.data, Element { key, value});
+            return (option::some(_k), option::some(_v))
+        };
+        i = i + 1;
+    };
+    vector::push_back(&mut map.data, Element { key, value });
+    return (option::none(), option::none())
+}
+
+ + +
diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index c5294799ae794..b1af8d5b7c530 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -8,6 +8,7 @@ module aptos_std::simple_map { use std::error; use std::option; use std::vector; + use std::option::Option; /// Map key already exists const EKEY_ALREADY_EXISTS: u64 = 1; @@ -77,7 +78,38 @@ module aptos_std::simple_map { vector::push_back(&mut map.data, Element { key, value }); } - public inline fun upsert( + public fun to_vec( + map: SimpleMap): vector> { + let SimpleMap { data } = map; + data + } + + public fun split_element(e: Element): (Key, Value) { + let Element { key, value} = e; + (key, value) + } + + public fun upsert( + map: &mut SimpleMap, + key: Key, + value: Value + ): (Option, Option) { + let len = std::vector::length(&map.data); + let i = 0; + while (i < len) { + let element = vector::borrow(&mut map.data, i); + if (&element.key == &key) { + let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i); + vector::push_back(&mut map.data, Element { key, value}); + return (option::some(_k), option::some(_v)) + }; + i = i + 1; + }; + vector::push_back(&mut map.data, Element { key, value }); + return (option::none(), option::none()) + } + + public inline fun upsert_drop( map: &mut SimpleMap, key: Key, value: Value, @@ -105,8 +137,8 @@ module aptos_std::simple_map { map: SimpleMap, d: |Key, Value| ) { - let SimpleMap { data } = map; - std::vector::destroy(data, |e| { let Element { key, value } = e; d(key, value) }); + let vec = to_vec(map); + std::vector::destroy(vec, |e| { let (_k, _v) = split_element(e); d(_k, _v) }); } public fun remove( @@ -191,15 +223,47 @@ module aptos_std::simple_map { destroy_empty(map); } + #[test_only] struct OnlyMove has store { val: u64 } #[test] public fun upsert_test() { let map = create(); // test adding 3 elements using upsert - upsert(&mut map, 1, OnlyMove { val: 1 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); - upsert(&mut map, 2, OnlyMove { val: 2 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); - upsert(&mut map, 3, OnlyMove { val: 3 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + let (_, o1) = upsert(&mut map, 1, OnlyMove { val: 1 } ); + let (_, o2) = upsert(&mut map, 2, OnlyMove { val: 2 } ); + let (_, o3) = upsert(&mut map, 3, OnlyMove { val: 3 } ); + + assert!(length(&map) == 3, 0); + assert!(contains_key(&map, &1), 1); + assert!(contains_key(&map, &2), 2); + assert!(contains_key(&map, &3), 3); + assert!(borrow(&map, &1).val == 1, 4); + assert!(borrow(&map, &2).val == 2, 5); + assert!(borrow(&map, &3).val == 3, 6); + + // change mapping 1->1 to 1->4 + let (_, o4) = upsert(&mut map, 1, OnlyMove { val: 4 } ); + + assert!(length(&map) == 3, 7); + assert!(contains_key(&map, &1), 8); + assert!(borrow(&map, &1).val == 4, 9); + + option::destroy(o1, |o| { let OnlyMove { val: _ } = o; }); + option::destroy(o2, |o| { let OnlyMove { val: _ } = o; }); + option::destroy(o3, |o| { let OnlyMove { val: _ } = o; }); + option::destroy(o4, |o| { let OnlyMove { val: _ } = o; }); + + destroy(map, |_k, _v| { let OnlyMove { val: _ } = _v; }); + } + + #[test] + public fun upsert_drop_test() { + let map = create(); + // test adding 3 elements using upsert + upsert_drop(&mut map, 1, OnlyMove { val: 1 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert_drop(&mut map, 2, OnlyMove { val: 2 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert_drop(&mut map, 3, OnlyMove { val: 3 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); assert!(length(&map) == 3, 0); assert!(contains_key(&map, &1), 1); @@ -210,13 +274,12 @@ module aptos_std::simple_map { assert!(borrow(&map, &3).val == 3, 6); // change mapping 1->1 to 1->4 - upsert(&mut map, 1, OnlyMove { val: 4 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert_drop(&mut map, 1, OnlyMove { val: 4 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); assert!(length(&map) == 3, 7); assert!(contains_key(&map, &1), 8); assert!(borrow(&map, &1).val == 4, 9); - std::debug::print(&b"done"); destroy(map, |_k, _v| { let OnlyMove { val: _ } = _v; }); } } diff --git a/aptos-move/framework/move-stdlib/sources/option.move b/aptos-move/framework/move-stdlib/sources/option.move index 2c3772cc61e27..0eca121bb1af7 100644 --- a/aptos-move/framework/move-stdlib/sources/option.move +++ b/aptos-move/framework/move-stdlib/sources/option.move @@ -324,6 +324,11 @@ module std::option { is_some(o) && p(borrow(o)) } + public inline fun destroy(o: Option, d: |Element|) { + let vec = to_vec(o); + vector::destroy(vec, d); + } + spec module {} // switch documentation context back to module level spec module { From e3c599c133789aedb9bfb825e821b023d36eda8c Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 12:30:39 -0800 Subject: [PATCH 03/13] Remove drop version --- .../framework/aptos-stdlib/doc/simple_map.md | 22 ++--- .../aptos-stdlib/sources/simple_map.move | 97 ++++--------------- 2 files changed, 27 insertions(+), 92 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index 02a7344aec19a..650ed9968c9a9 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -382,7 +382,7 @@ Map key is not found -
public fun upsert<Key: store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): (option::Option<Key>, option::Option<Value>)
+
public fun upsert<Key: copy, drop, store, Value: copy, drop, store>(map: &mut simple_map::SimpleMap<Key, Value>, key: &Key, value: &Value)
 
@@ -391,24 +391,22 @@ Map key is not found Implementation -
public fun upsert<Key: store, Value: store>(
+
public fun upsert<Key: store + drop + copy, Value: store + drop + copy>(
     map: &mut SimpleMap<Key, Value>,
-    key: Key,
-    value: Value
-): (Option<Key>, Option<Value>) {
+    key: &Key,
+    value: &Value
+) {
     let len = std::vector::length(&map.data);
     let i = 0;
     while (i < len) {
-        let element = vector::borrow(&mut map.data, i);
-        if (&element.key == &key) {
-            let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i);
-            vector::push_back(&mut map.data, Element { key, value});
-            return (option::some(_k), option::some(_v))
+        let element = vector::borrow_mut(&mut map.data, i);
+        if (&element.key == key) {
+            element.value = *value;
+            return
         };
         i = i + 1;
     };
-    vector::push_back(&mut map.data, Element { key, value });
-    return (option::none(), option::none())
+    vector::push_back(&mut map.data, Element { key: *key, value: *value });
 }
 
diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index b1af8d5b7c530..01364c155f72f 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -8,7 +8,6 @@ module aptos_std::simple_map { use std::error; use std::option; use std::vector; - use std::option::Option; /// Map key already exists const EKEY_ALREADY_EXISTS: u64 = 1; @@ -89,48 +88,22 @@ module aptos_std::simple_map { (key, value) } - public fun upsert( + public fun upsert( map: &mut SimpleMap, - key: Key, - value: Value - ): (Option, Option) { - let len = std::vector::length(&map.data); - let i = 0; - while (i < len) { - let element = vector::borrow(&mut map.data, i); - if (&element.key == &key) { - let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i); - vector::push_back(&mut map.data, Element { key, value}); - return (option::some(_k), option::some(_v)) - }; - i = i + 1; - }; - vector::push_back(&mut map.data, Element { key, value }); - return (option::none(), option::none()) - } - - public inline fun upsert_drop( - map: &mut SimpleMap, - key: Key, - value: Value, - drop: |Key, Value| + key: &Key, + value: &Value ) { let len = std::vector::length(&map.data); let i = 0; while (i < len) { - let element = vector::borrow(&mut map.data, i); - if (&element.key == &key) { - break + let element = vector::borrow_mut(&mut map.data, i); + if (&element.key == key) { + element.value = *value; + return }; i = i + 1; }; - if (i == len) { - vector::push_back(&mut map.data, Element { key, value }); - } else { - let Element {key: _k, value: _v} = vector::swap_remove(&mut map.data, i); - vector::push_back(&mut map.data, Element { key, value}); - drop(_k, _v); - } + vector::push_back(&mut map.data, Element { key: *key, value: *value }); } public inline fun destroy( @@ -223,63 +196,27 @@ module aptos_std::simple_map { destroy_empty(map); } - #[test_only] - struct OnlyMove has store { val: u64 } - #[test] public fun upsert_test() { - let map = create(); - // test adding 3 elements using upsert - let (_, o1) = upsert(&mut map, 1, OnlyMove { val: 1 } ); - let (_, o2) = upsert(&mut map, 2, OnlyMove { val: 2 } ); - let (_, o3) = upsert(&mut map, 3, OnlyMove { val: 3 } ); - - assert!(length(&map) == 3, 0); - assert!(contains_key(&map, &1), 1); - assert!(contains_key(&map, &2), 2); - assert!(contains_key(&map, &3), 3); - assert!(borrow(&map, &1).val == 1, 4); - assert!(borrow(&map, &2).val == 2, 5); - assert!(borrow(&map, &3).val == 3, 6); - - // change mapping 1->1 to 1->4 - let (_, o4) = upsert(&mut map, 1, OnlyMove { val: 4 } ); - - assert!(length(&map) == 3, 7); - assert!(contains_key(&map, &1), 8); - assert!(borrow(&map, &1).val == 4, 9); - - option::destroy(o1, |o| { let OnlyMove { val: _ } = o; }); - option::destroy(o2, |o| { let OnlyMove { val: _ } = o; }); - option::destroy(o3, |o| { let OnlyMove { val: _ } = o; }); - option::destroy(o4, |o| { let OnlyMove { val: _ } = o; }); - - destroy(map, |_k, _v| { let OnlyMove { val: _ } = _v; }); - } - - #[test] - public fun upsert_drop_test() { - let map = create(); + let map = create(); // test adding 3 elements using upsert - upsert_drop(&mut map, 1, OnlyMove { val: 1 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); - upsert_drop(&mut map, 2, OnlyMove { val: 2 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); - upsert_drop(&mut map, 3, OnlyMove { val: 3 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert(&mut map, &1, &1 ); + upsert(&mut map, &2, &2 ); + upsert(&mut map, &3, &3 ); assert!(length(&map) == 3, 0); assert!(contains_key(&map, &1), 1); assert!(contains_key(&map, &2), 2); assert!(contains_key(&map, &3), 3); - assert!(borrow(&map, &1).val == 1, 4); - assert!(borrow(&map, &2).val == 2, 5); - assert!(borrow(&map, &3).val == 3, 6); + assert!(borrow(&map, &1) == &1, 4); + assert!(borrow(&map, &2) == &2, 5); + assert!(borrow(&map, &3) == &3, 6); // change mapping 1->1 to 1->4 - upsert_drop(&mut map, 1, OnlyMove { val: 4 }, |_k, _v| { let OnlyMove { val: _ } = _v; }); + upsert(&mut map, &1, &4 ); assert!(length(&map) == 3, 7); assert!(contains_key(&map, &1), 8); - assert!(borrow(&map, &1).val == 4, 9); - - destroy(map, |_k, _v| { let OnlyMove { val: _ } = _v; }); + assert!(borrow(&map, &1) == &4, 9); } } From 45b1f66d1ea0b7977b81fe1a75ef6f4d7db11eb0 Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 13:02:38 -0800 Subject: [PATCH 04/13] remove destroy --- .../framework/aptos-stdlib/sources/simple_map.move | 8 -------- .../framework/move-stdlib/sources/option.move | 5 ----- .../framework/move-stdlib/sources/vector.move | 13 ------------- 3 files changed, 26 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 01364c155f72f..f6adb843b15a5 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -106,14 +106,6 @@ module aptos_std::simple_map { vector::push_back(&mut map.data, Element { key: *key, value: *value }); } - public inline fun destroy( - map: SimpleMap, - d: |Key, Value| - ) { - let vec = to_vec(map); - std::vector::destroy(vec, |e| { let (_k, _v) = split_element(e); d(_k, _v) }); - } - public fun remove( map: &mut SimpleMap, key: &Key, diff --git a/aptos-move/framework/move-stdlib/sources/option.move b/aptos-move/framework/move-stdlib/sources/option.move index 0eca121bb1af7..2c3772cc61e27 100644 --- a/aptos-move/framework/move-stdlib/sources/option.move +++ b/aptos-move/framework/move-stdlib/sources/option.move @@ -324,11 +324,6 @@ module std::option { is_some(o) && p(borrow(o)) } - public inline fun destroy(o: Option, d: |Element|) { - let vec = to_vec(o); - vector::destroy(vec, d); - } - spec module {} // switch documentation context back to module level spec module { diff --git a/aptos-move/framework/move-stdlib/sources/vector.move b/aptos-move/framework/move-stdlib/sources/vector.move index 9a5ad0bd6a9f3..5b7b4ae6cc877 100644 --- a/aptos-move/framework/move-stdlib/sources/vector.move +++ b/aptos-move/framework/move-stdlib/sources/vector.move @@ -262,19 +262,6 @@ module std::vector { result } - /// Destroy a vector - public inline fun destroy( - v: vector, - d: |Element| - ) { - let len = length(&v); - while (len != 0) { - d(pop_back(&mut v)); - len = len - 1; - }; - destroy_empty(v); - } - // ================================================================= // Module Specification From 7ecb497a078ade043e57549e6e85199729de3319 Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 14:35:20 -0800 Subject: [PATCH 05/13] remove to_vec, split_element --- .../framework/aptos-stdlib/sources/simple_map.move | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index f6adb843b15a5..973bf3d47a1bc 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -77,17 +77,6 @@ module aptos_std::simple_map { vector::push_back(&mut map.data, Element { key, value }); } - public fun to_vec( - map: SimpleMap): vector> { - let SimpleMap { data } = map; - data - } - - public fun split_element(e: Element): (Key, Value) { - let Element { key, value} = e; - (key, value) - } - public fun upsert( map: &mut SimpleMap, key: &Key, From 26865fad9024f099528da3c38c29380d6841e8ad Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 14:41:57 -0800 Subject: [PATCH 06/13] generate docs --- .../framework/aptos-stdlib/doc/simple_map.md | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index 650ed9968c9a9..af3d5d9295289 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -21,8 +21,6 @@ This module provides a solution for sorted maps, that is it has the properties t - [Function `contains_key`](#0x1_simple_map_contains_key) - [Function `destroy_empty`](#0x1_simple_map_destroy_empty) - [Function `add`](#0x1_simple_map_add) -- [Function `to_vec`](#0x1_simple_map_to_vec) -- [Function `split_element`](#0x1_simple_map_split_element) - [Function `upsert`](#0x1_simple_map_upsert) - [Function `remove`](#0x1_simple_map_remove) - [Function `find`](#0x1_simple_map_find) @@ -323,57 +321,6 @@ Map key is not found - - - - -## Function `to_vec` - - - -
public fun to_vec<Key: store, Value: store>(map: simple_map::SimpleMap<Key, Value>): vector<simple_map::Element<Key, Value>>
-
- - - -
-Implementation - - -
public fun to_vec<Key: store, Value: store>(
-    map: SimpleMap<Key, Value>): vector<Element<Key, Value>> {
-    let SimpleMap { data } = map;
-    data
-}
-
- - - -
- - - -## Function `split_element` - - - -
public fun split_element<Key: store, Value: store>(e: simple_map::Element<Key, Value>): (Key, Value)
-
- - - -
-Implementation - - -
public fun split_element<Key: store, Value: store>(e: Element<Key, Value>): (Key, Value) {
-    let Element { key, value} = e;
-    (key, value)
-}
-
- - -
From e4fe1a8eb1712dc7b689a1cf239e29562dd397a2 Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 14:43:12 -0800 Subject: [PATCH 07/13] generate docs --- aptos-move/framework/aptos-stdlib/sources/simple_map.move | 1 + 1 file changed, 1 insertion(+) diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 973bf3d47a1bc..ce83fc7e92db0 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -77,6 +77,7 @@ module aptos_std::simple_map { vector::push_back(&mut map.data, Element { key, value }); } + /// Insert key/value pair or update an existing key to a new value public fun upsert( map: &mut SimpleMap, key: &Key, From 4b9001b6f88c1dc69385d670050e66662c77c020 Mon Sep 17 00:00:00 2001 From: gerben Date: Thu, 2 Mar 2023 14:44:43 -0800 Subject: [PATCH 08/13] generate docs --- aptos-move/framework/aptos-stdlib/doc/simple_map.md | 1 + 1 file changed, 1 insertion(+) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index af3d5d9295289..e3b943aab899a 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -327,6 +327,7 @@ Map key is not found ## Function `upsert` +Insert key/value pair or update an existing key to a new value
public fun upsert<Key: copy, drop, store, Value: copy, drop, store>(map: &mut simple_map::SimpleMap<Key, Value>, key: &Key, value: &Value)

From 4f1ac0eb841c667da0ba91520606f293c1ad3bc3 Mon Sep 17 00:00:00 2001
From: gerben 
Date: Thu, 2 Mar 2023 14:47:16 -0800
Subject: [PATCH 09/13] remove std

---
 aptos-move/framework/aptos-stdlib/doc/simple_map.md       | 2 +-
 aptos-move/framework/aptos-stdlib/sources/simple_map.move | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md
index e3b943aab899a..71562994c414f 100644
--- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md
+++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md
@@ -344,7 +344,7 @@ Insert key/value pair or update an existing key to a new value
     key: &Key,
     value: &Value
 ) {
-    let len = std::vector::length(&map.data);
+    let len = vector::length(&map.data);
     let i = 0;
     while (i < len) {
         let element = vector::borrow_mut(&mut map.data, i);
diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move
index ce83fc7e92db0..639c67bd84d4c 100644
--- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move
+++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move
@@ -83,7 +83,7 @@ module aptos_std::simple_map {
         key: &Key,
         value: &Value
     ) {
-        let len = std::vector::length(&map.data);
+        let len = vector::length(&map.data);
         let i = 0;
         while (i < len) {
             let element = vector::borrow_mut(&mut map.data, i);

From d3e1f984a53216cbb3d407cb57285ff7f2772865 Mon Sep 17 00:00:00 2001
From: gerben 
Date: Tue, 14 Mar 2023 13:17:15 -0700
Subject: [PATCH 10/13] Remove drop and copy

---
 .../framework/aptos-stdlib/doc/simple_map.md  | 26 ++++++++-------
 .../aptos-stdlib/sources/simple_map.move      | 32 +++++++++++--------
 2 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md
index 41b9cb78554aa..561e00eb0a00a 100644
--- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md
+++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md
@@ -331,7 +331,7 @@ Map key is not found
 Insert key/value pair or update an existing key to a new value
 
 
-
public fun upsert<Key: copy, drop, store, Value: copy, drop, store>(map: &mut simple_map::SimpleMap<Key, Value>, key: &Key, value: &Value)
+
public fun upsert<Key: store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): (option::Option<Key>, option::Option<Value>)
 
@@ -340,22 +340,26 @@ Insert key/value pair or update an existing key to a new value Implementation -
public fun upsert<Key: store + drop + copy, Value: store + drop + copy>(
+
public fun upsert<Key: store, Value: store>(
     map: &mut SimpleMap<Key, Value>,
-    key: &Key,
-    value: &Value
-) {
-    let len = vector::length(&map.data);
+    key: Key,
+    value: Value
+): (std::option::Option<Key>, std::option::Option<Value>) {
+    let data = &mut map.data;
+    let len = vector::length(data);
     let i = 0;
     while (i < len) {
-        let element = vector::borrow_mut(&mut map.data, i);
-        if (&element.key == key) {
-            element.value = *value;
-            return
+        let element = vector::borrow(data, i);
+        if (&element.key == &key) {
+            vector::push_back(data, Element { key, value});
+            vector::swap(data, i, len);
+            let Element { key, value } = vector::pop_back(data);
+            return (std::option::some(key), std::option::some(value))
         };
         i = i + 1;
     };
-    vector::push_back(&mut map.data, Element { key: *key, value: *value });
+    vector::push_back(&mut map.data, Element { key, value });
+    (std::option::none(), std::option::none())
 }
 
diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 2cc115b400611..70a6cd07931e4 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -78,22 +78,26 @@ module aptos_std::simple_map { } /// Insert key/value pair or update an existing key to a new value - public fun upsert( + public fun upsert( map: &mut SimpleMap, - key: &Key, - value: &Value - ) { - let len = vector::length(&map.data); + key: Key, + value: Value + ): (std::option::Option, std::option::Option) { + let data = &mut map.data; + let len = vector::length(data); let i = 0; while (i < len) { - let element = vector::borrow_mut(&mut map.data, i); - if (&element.key == key) { - element.value = *value; - return + let element = vector::borrow(data, i); + if (&element.key == &key) { + vector::push_back(data, Element { key, value}); + vector::swap(data, i, len); + let Element { key, value } = vector::pop_back(data); + return (std::option::some(key), std::option::some(value)) }; i = i + 1; }; - vector::push_back(&mut map.data, Element { key: *key, value: *value }); + vector::push_back(&mut map.data, Element { key, value }); + (std::option::none(), std::option::none()) } /// Transform the map into two vectors with the keys and values respectively @@ -205,9 +209,9 @@ module aptos_std::simple_map { public fun upsert_test() { let map = create(); // test adding 3 elements using upsert - upsert(&mut map, &1, &1 ); - upsert(&mut map, &2, &2 ); - upsert(&mut map, &3, &3 ); + upsert(&mut map, 1, 1 ); + upsert(&mut map, 2, 2 ); + upsert(&mut map, 3, 3 ); assert!(length(&map) == 3, 0); assert!(contains_key(&map, &1), 1); @@ -218,7 +222,7 @@ module aptos_std::simple_map { assert!(borrow(&map, &3) == &3, 6); // change mapping 1->1 to 1->4 - upsert(&mut map, &1, &4 ); + upsert(&mut map, 1, 4 ); assert!(length(&map) == 3, 7); assert!(contains_key(&map, &1), 8); From 0ab40a6092e8a9ef478d94817a09961b4be45c7c Mon Sep 17 00:00:00 2001 From: gerben Date: Tue, 14 Mar 2023 14:06:09 -0700 Subject: [PATCH 11/13] Add drop constrain for key --- aptos-move/framework/aptos-stdlib/doc/simple_map.md | 12 ++++++------ .../framework/aptos-stdlib/sources/simple_map.move | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index 561e00eb0a00a..25fb4a824dae2 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -331,7 +331,7 @@ Map key is not found Insert key/value pair or update an existing key to a new value -
public fun upsert<Key: store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): (option::Option<Key>, option::Option<Value>)
+
public fun upsert<Key: drop, store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): option::Option<Value>
 
@@ -340,11 +340,11 @@ Insert key/value pair or update an existing key to a new value Implementation -
public fun upsert<Key: store, Value: store>(
+
public fun upsert<Key: store + drop, Value: store>(
     map: &mut SimpleMap<Key, Value>,
     key: Key,
     value: Value
-): (std::option::Option<Key>, std::option::Option<Value>) {
+): std::option::Option<Value> {
     let data = &mut map.data;
     let len = vector::length(data);
     let i = 0;
@@ -353,13 +353,13 @@ Insert key/value pair or update an existing key to a new value
         if (&element.key == &key) {
             vector::push_back(data, Element { key, value});
             vector::swap(data, i, len);
-            let Element { key, value } = vector::pop_back(data);
-            return (std::option::some(key), std::option::some(value))
+            let Element { key: _, value } = vector::pop_back(data);
+            return std::option::some(value)
         };
         i = i + 1;
     };
     vector::push_back(&mut map.data, Element { key, value });
-    (std::option::none(), std::option::none())
+    std::option::none()
 }
 
diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 70a6cd07931e4..9ae0fd90f5ccd 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -78,11 +78,11 @@ module aptos_std::simple_map { } /// Insert key/value pair or update an existing key to a new value - public fun upsert( + public fun upsert( map: &mut SimpleMap, key: Key, value: Value - ): (std::option::Option, std::option::Option) { + ): std::option::Option { let data = &mut map.data; let len = vector::length(data); let i = 0; @@ -91,13 +91,13 @@ module aptos_std::simple_map { if (&element.key == &key) { vector::push_back(data, Element { key, value}); vector::swap(data, i, len); - let Element { key, value } = vector::pop_back(data); - return (std::option::some(key), std::option::some(value)) + let Element { key: _, value } = vector::pop_back(data); + return std::option::some(value) }; i = i + 1; }; vector::push_back(&mut map.data, Element { key, value }); - (std::option::none(), std::option::none()) + std::option::none() } /// Transform the map into two vectors with the keys and values respectively From b1fb42d0c5867372e73371efd2224e55a737eb9c Mon Sep 17 00:00:00 2001 From: gerben Date: Tue, 14 Mar 2023 14:09:55 -0700 Subject: [PATCH 12/13] Drop drop constrain for key --- .../framework/aptos-stdlib/sources/simple_map.move | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/sources/simple_map.move b/aptos-move/framework/aptos-stdlib/sources/simple_map.move index 9ae0fd90f5ccd..70a6cd07931e4 100644 --- a/aptos-move/framework/aptos-stdlib/sources/simple_map.move +++ b/aptos-move/framework/aptos-stdlib/sources/simple_map.move @@ -78,11 +78,11 @@ module aptos_std::simple_map { } /// Insert key/value pair or update an existing key to a new value - public fun upsert( + public fun upsert( map: &mut SimpleMap, key: Key, value: Value - ): std::option::Option { + ): (std::option::Option, std::option::Option) { let data = &mut map.data; let len = vector::length(data); let i = 0; @@ -91,13 +91,13 @@ module aptos_std::simple_map { if (&element.key == &key) { vector::push_back(data, Element { key, value}); vector::swap(data, i, len); - let Element { key: _, value } = vector::pop_back(data); - return std::option::some(value) + let Element { key, value } = vector::pop_back(data); + return (std::option::some(key), std::option::some(value)) }; i = i + 1; }; vector::push_back(&mut map.data, Element { key, value }); - std::option::none() + (std::option::none(), std::option::none()) } /// Transform the map into two vectors with the keys and values respectively From 901936f3ea4765bbddc2cf28371ba182e28c3b65 Mon Sep 17 00:00:00 2001 From: gerben Date: Tue, 14 Mar 2023 14:13:14 -0700 Subject: [PATCH 13/13] generate doc --- aptos-move/framework/aptos-stdlib/doc/simple_map.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/aptos-move/framework/aptos-stdlib/doc/simple_map.md b/aptos-move/framework/aptos-stdlib/doc/simple_map.md index 25fb4a824dae2..561e00eb0a00a 100644 --- a/aptos-move/framework/aptos-stdlib/doc/simple_map.md +++ b/aptos-move/framework/aptos-stdlib/doc/simple_map.md @@ -331,7 +331,7 @@ Map key is not found Insert key/value pair or update an existing key to a new value -
public fun upsert<Key: drop, store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): option::Option<Value>
+
public fun upsert<Key: store, Value: store>(map: &mut simple_map::SimpleMap<Key, Value>, key: Key, value: Value): (option::Option<Key>, option::Option<Value>)
 
@@ -340,11 +340,11 @@ Insert key/value pair or update an existing key to a new value Implementation -
public fun upsert<Key: store + drop, Value: store>(
+
public fun upsert<Key: store, Value: store>(
     map: &mut SimpleMap<Key, Value>,
     key: Key,
     value: Value
-): std::option::Option<Value> {
+): (std::option::Option<Key>, std::option::Option<Value>) {
     let data = &mut map.data;
     let len = vector::length(data);
     let i = 0;
@@ -353,13 +353,13 @@ Insert key/value pair or update an existing key to a new value
         if (&element.key == &key) {
             vector::push_back(data, Element { key, value});
             vector::swap(data, i, len);
-            let Element { key: _, value } = vector::pop_back(data);
-            return std::option::some(value)
+            let Element { key, value } = vector::pop_back(data);
+            return (std::option::some(key), std::option::some(value))
         };
         i = i + 1;
     };
     vector::push_back(&mut map.data, Element { key, value });
-    std::option::none()
+    (std::option::none(), std::option::none())
 }