diff --git a/c/vdmclib/src/main/VdmMap.c b/c/vdmclib/src/main/VdmMap.c index dc6de523..840d7007 100644 --- a/c/vdmclib/src/main/VdmMap.c +++ b/c/vdmclib/src/main/VdmMap.c @@ -30,6 +30,7 @@ #include "VdmMap.h" #include //FIXME remove all printf! +#include #define ASSERT_CHECK(s) assert(s->type == VDM_MAP && "Value is not a map") @@ -213,7 +214,6 @@ TVP vdmMapRng(TVP map) #else - hashtable_t *ht_create( int size ) { hashtable_t *hashtable = NULL; @@ -387,7 +387,7 @@ TVP ht_get( hashtable_t *hashtable, TVP key ) { -struct TypedValue* newMap() +TVP newMap() { struct Map* ptr = (struct Map*) malloc(sizeof(struct Map)); //TODO: work out initial size. @@ -399,6 +399,35 @@ struct TypedValue* newMap() } +TVP newMapVarToGrow(size_t size, size_t expected_size, ...) +{ + struct Map* ptr = (struct Map*) malloc(sizeof(struct Map)); + TVP key; + TVP value; + TVP theMap; + + ptr->table = ht_create(expected_size); + theMap = newTypeValue(VDM_MAP, (TypedValueType){ .ptr = ptr }); + + va_list argList; + va_start(argList, size * 2); + + for(int i = 0; i < size; i++) + { + key = vdmClone(va_arg(argList, TVP)); + value = vdmClone(va_arg(argList, TVP)); + + vdmMapAdd(theMap, key, value); + + vdmFree(key); + vdmFree(value); + } + va_end(argList); + + return theMap; + +} + void vdmMapAdd(TVP map, TVP key, TVP value) { diff --git a/c/vdmclib/src/main/VdmMap.h b/c/vdmclib/src/main/VdmMap.h index 511bace1..092a7e55 100644 --- a/c/vdmclib/src/main/VdmMap.h +++ b/c/vdmclib/src/main/VdmMap.h @@ -77,6 +77,8 @@ struct TypedValue* newMap(); //util method for adding maplets void vdmMapAdd(TVP map,TVP key, TVP value); +TVP newMapVarToGrow(size_t, size_t, ...); + //VDM map operators TVP vdmMapDom(TVP map); TVP vdmMapRng(TVP map); diff --git a/c/vdmclib/src/test/ExpressionsMap_Tests.cpp b/c/vdmclib/src/test/ExpressionsMap_Tests.cpp index a7e06e79..19ccb94d 100644 --- a/c/vdmclib/src/test/ExpressionsMap_Tests.cpp +++ b/c/vdmclib/src/test/ExpressionsMap_Tests.cpp @@ -34,7 +34,7 @@ TVP createMap1() //{} TVP map = newMap(); -// //maplet1 1|->2 + // //maplet1 1|->2 TVP key1 = newInt(1); TVP val1 =newInt(2); vdmMapAdd(map,key1,val1); @@ -383,3 +383,37 @@ TEST(Expression_Map, mapInEquals) bool map_not_eq2 = vdmMapInEquals(map1,map3); EXPECT_EQ(true, map_not_eq2); } + + +TEST(Expression_Map, newMapVarToGrow) +{ + TVP theMap = newMapVarToGrow(3, 10, newChar('a'), newInt(1), newChar('b'), newInt(2), newChar('c'), newInt(3)); + TVP val; + TVP res; + + val = vdmMapApply(theMap, newChar('a')); + res = vdmEquals(val, newInt(1)); + EXPECT_EQ(true, res->value.boolVal); + vdmFree(val); + vdmFree(res); + + val = vdmMapApply(theMap, newChar('b')); + res = vdmEquals(val, newInt(2)); + EXPECT_EQ(true, res->value.boolVal); + vdmFree(val); + vdmFree(res); + + val = vdmMapApply(theMap, newChar('c')); + res = vdmEquals(val, newInt(3)); + EXPECT_EQ(true, res->value.boolVal); + vdmFree(val); + vdmFree(res); + + val = vdmMapApply(theMap, newChar('c')); + res = vdmEquals(val, newInt(4)); + EXPECT_EQ(false, res->value.boolVal); + vdmFree(val); + vdmFree(res); + + vdmFree(theMap); +}