feat: add remove() method to Map class with native implementation and tests

This commit is contained in:
Bob Nystrom
2015-01-26 01:42:36 +00:00
parent a83205ef89
commit f647680184
7 changed files with 142 additions and 46 deletions
+14 -11
View File
@@ -736,11 +736,11 @@ DEF_NATIVE(map_subscript)
{
if (!validateKey(vm, args, 1)) return PRIM_ERROR;
Value value;
if (wrenMapGet(AS_MAP(args[0]), args[1], &value)) RETURN_VAL(value);
ObjMap* map = AS_MAP(args[0]);
uint32_t index = wrenMapFind(map, args[1]);
if (index == UINT32_MAX) RETURN_NULL;
// Not found.
RETURN_NULL;
RETURN_VAL(map->entries[index].value);
}
DEF_NATIVE(map_subscriptSetter)
@@ -753,11 +753,7 @@ DEF_NATIVE(map_subscriptSetter)
DEF_NATIVE(map_clear)
{
ObjMap* map = AS_MAP(args[0]);
wrenReallocate(vm, map->entries, 0, 0);
map->entries = NULL;
map->capacity = 0;
map->count = 0;
wrenMapClear(vm, AS_MAP(args[0]));
RETURN_NULL;
}
@@ -765,8 +761,7 @@ DEF_NATIVE(map_containsKey)
{
if (!validateKey(vm, args, 1)) return PRIM_ERROR;
Value dummy;
RETURN_BOOL(wrenMapGet(AS_MAP(args[0]), args[1], &dummy));
RETURN_BOOL(wrenMapFind(AS_MAP(args[0]), args[1]) != UINT32_MAX);
}
DEF_NATIVE(map_count)
@@ -800,6 +795,13 @@ DEF_NATIVE(map_iterate)
RETURN_FALSE;
}
DEF_NATIVE(map_remove)
{
if (!validateKey(vm, args, 1)) return PRIM_ERROR;
RETURN_VAL(wrenMapRemoveKey(vm, AS_MAP(args[0]), args[1]));
}
DEF_NATIVE(map_keyIteratorValue)
{
ObjMap* map = AS_MAP(args[0]);
@@ -1499,6 +1501,7 @@ void wrenInitializeCore(WrenVM* vm)
NATIVE(vm->mapClass, "clear", map_clear);
NATIVE(vm->mapClass, "containsKey ", map_containsKey);
NATIVE(vm->mapClass, "count", map_count);
NATIVE(vm->mapClass, "remove ", map_remove);
NATIVE(vm->mapClass, "iterate_ ", map_iterate);
NATIVE(vm->mapClass, "keyIteratorValue_ ", map_keyIteratorValue);
NATIVE(vm->mapClass, "valueIteratorValue_ ", map_valueIteratorValue);