From d9fbf8a2ddcd2e2f1f11875db46d79857ee1f4ba Mon Sep 17 00:00:00 2001 From: dcode Date: Tue, 28 May 2019 15:49:56 +0200 Subject: [PATCH] Add preliminary support for map keys/values, set values Makes arrays instead of iterators for now --- std/assembly/index.d.ts | 11 +++++++---- std/assembly/map.ts | 28 ++++++++++++++++++++++++++++ std/assembly/set.ts | 14 ++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index 888960f7..5e0a6ef9 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -1293,15 +1293,18 @@ declare class Map { get(key: K): V; delete(key: K): bool; clear(): void; + keys(): K[]; // preliminary + values(): V[]; // preliminary toString(): string; } -declare class Set { +declare class Set { readonly size: i32; - has(value: T): bool; - add(value: T): void; - delete(value: T): bool; + has(value: K): bool; + add(value: K): void; + delete(value: K): bool; clear(): void; + values(): K[]; // preliminary toString(): string; } diff --git a/std/assembly/map.ts b/std/assembly/map.ts index 3aa152c9..9430ad6f 100644 --- a/std/assembly/map.ts +++ b/std/assembly/map.ts @@ -189,6 +189,34 @@ export class Map { this.entriesOffset = this.entriesCount; } + keys(): K[] { + // FIXME: this is preliminary, needs iterators/closures + var start = changetype(this.entries); + var size = this.entriesOffset; + var keys = Array.create(size); + for (let i = 0; i < size; ++i) { + let entry = changetype>(start + i * ENTRY_SIZE()); + if (!(entry.taggedNext & EMPTY)) { + keys.push(entry.key); + } + } + return keys; + } + + values(): V[] { + // FIXME: this is preliminary, needs iterators/closures + var start = changetype(this.entries); + var size = this.entriesOffset; + var values = Array.create(size); + for (let i = 0; i < size; ++i) { + let entry = changetype>(start + i * ENTRY_SIZE()); + if (!(entry.taggedNext & EMPTY)) { + values.push(entry.value); + } + } + return values; + } + toString(): string { return "[object Map]"; } diff --git a/std/assembly/set.ts b/std/assembly/set.ts index fddac80a..3fe0e03f 100644 --- a/std/assembly/set.ts +++ b/std/assembly/set.ts @@ -163,6 +163,20 @@ export class Set { this.entriesOffset = this.entriesCount; } + values(): K[] { + // FIXME: this is preliminary, needs iterators/closures + var start = changetype(this.entries); + var size = this.entriesOffset; + var values = Array.create(size); + for (let i = 0; i < size; ++i) { + let entry = changetype>(start + i * ENTRY_SIZE()); + if (!(entry.taggedNext & EMPTY)) { + values.push(entry.key); + } + } + return values; + } + toString(): string { return "[object Set]"; }