Browse Source

Add reverse dictionary capabilities

Yentl Van Tendeloo 8 years ago
parent
commit
7c4d3814d7
3 changed files with 40 additions and 14 deletions
  1. 23 14
      bootstrap/model_management.alc
  2. 16 0
      bootstrap/primitives.alc
  3. 1 0
      interface/HUTN/includes/primitives.alh

+ 23 - 14
bootstrap/model_management.alc

@@ -17,6 +17,9 @@ Element function model_fuse(models : Element):
 	Element selected_MM
 	String type
 
+	Element reverse
+	reverse = make_reverse_dictionary(model["model"])
+
 	// Read out some data first
 	tagged_model = set_pop(models)
 	set_add(models, tagged_model)
@@ -39,8 +42,8 @@ Element function model_fuse(models : Element):
 			if (is_edge(model["model"][key])):
 				String src
 				String dst
-				src = model_name + reverseKeyLookup(model["model"], read_edge_src(model["model"][key]))
-				dst = model_name + reverseKeyLookup(model["model"], read_edge_dst(model["model"][key]))
+				src = model_name + cast_e2s(reverse[cast_id2s(read_edge_src(model["model"][key])))
+				dst = model_name + cast_e2s(reverse[cast_id2s(read_edge_dst(model["model"][key])))
 				if (bool_and(dict_in(new_model["model"], src), dict_in(new_model["model"], dst))):
 					instantiate_link(new_model, type, model_name + key, src, dst)
 				else:
@@ -63,6 +66,9 @@ Element function model_copy(src_model : Element):
 	Element second_keys
 	String type
 
+	Element reverse
+	reverse = make_reverse_dictionary(src_model["model"])
+
 	dst_model = instantiate_model(src_model["metamodel"])
 	keys = dict_keys(src_model["model"])
 	second_keys = create_node()
@@ -75,8 +81,9 @@ Element function model_copy(src_model : Element):
 			String src
 			String dst
 
-			src = reverseKeyLookup(src_model["model"], read_edge_src(src_model["model"][name]))
-			dst = reverseKeyLookup(src_model["model"], read_edge_dst(src_model["model"][name]))
+			src = reverse[cast_id2s(read_edge_src(src_model["model"][name]))]
+			dst = reverse[cast_id2s(read_edge_dst(src_model["model"][name]))]
+
 			type = read_type(src_model, name)
 
 			if (bool_and(dict_in(dst_model["model"], src), dict_in(dst_model["model"], dst))):
@@ -141,18 +148,19 @@ Void function model_join(dst_model : Element, src_model : Element, retyping_key
 	String type
 	String src
 	String dst
-	Element cached_src_model_model
 	Element elem
-	cached_src_model_model = src_model["model"]
 
 	mapping = create_node()
 
 	second_keys = create_node()
 
+	Element reverse
+	reverse = make_reverse_dictionary(src_model["model"])
+
 	keys = dict_keys(src_model["model"])
 	while (read_nr_out(keys) > 0):
 		name = set_pop(keys)
-		elem = cached_src_model_model[name]
+		elem = src_model["model"][name]
 		type = read_type(src_model, name)
 
 		if (is_edge(elem)):
@@ -160,8 +168,8 @@ Void function model_join(dst_model : Element, src_model : Element, retyping_key
 			String src
 			String dst
 
-			src = reverseKeyLookup(cached_src_model_model, read_edge_src(elem))
-			dst = reverseKeyLookup(cached_src_model_model, read_edge_dst(elem))
+			src = reverse[cast_id2s(read_edge_src(elem))]
+			dst = reverse[cast_id2s(read_edge_dst(elem))]
 
 			if (bool_and(dict_in(mapping, src), dict_in(mapping, dst))):
 				// All present, so create the link between them
@@ -197,9 +205,7 @@ Element function model_split(src_model : Element, target_metamodel : Element, re
 	String dst
 	Integer length
 	String new_type
-	Element cached_src_model_model
 	Element elem
-	cached_src_model_model = src_model["model"]
 
 	mapping = create_node()
 	length = string_len(retyping_key)
@@ -207,9 +213,12 @@ Element function model_split(src_model : Element, target_metamodel : Element, re
 	keys = dict_keys(src_model["model"])
 	second_keys = create_node()
 
+	Element reverse
+	reverse = make_reverse_dictionary(src_model["model"])
+
 	while (read_nr_out(keys) > 0):
 		name = set_pop(keys)
-		elem = cached_src_model_model[name]
+		elem = src_model["model"][name]
 
 		type = read_type(src_model, name)
 		if (string_startswith(type, retyping_key)):
@@ -219,8 +228,8 @@ Element function model_split(src_model : Element, target_metamodel : Element, re
 				String src
 				String dst
 
-				src = reverseKeyLookup(cached_src_model_model, read_edge_src(elem))
-				dst = reverseKeyLookup(cached_src_model_model, read_edge_dst(elem))
+				src = reverse[cast_id2s(read_edge_src(elem))]
+				dst = reverse[cast_id2s(read_edge_dst(elem))]
 
 				if (bool_and(dict_in(mapping, src), dict_in(mapping, dst))):
 					// All present, so create the link between them

+ 16 - 0
bootstrap/primitives.alc

@@ -349,3 +349,19 @@ Element function set_merge(a : Element, b : Element):
 	while (read_nr_out(b) > 0):
 		set_add(a, set_pop(b))
 	return a!
+
+Element make_reverse_dictionary(dict : Element):
+	Element keys
+	Element reverse
+	String key
+
+	reverse = create_node()
+	keys = dict_keys(dict)
+	while (read_nr_out(keys) > 0):
+		key = set_pop(keys)
+		key = cast_id2s(key)
+		if (dict_in(reverse, key)):
+			dict_delete(reverse, key)
+		dict_add(reverse, key, dict[key])
+
+	return reverse

+ 1 - 0
interface/HUTN/includes/primitives.alh

@@ -110,3 +110,4 @@ Element function set_to_list(s : Element)
 Element function create_tuple(a : Element, b : Element)
 Void function dict_overwrite(a : Element, b : Element, c : Element)
 Element function set_merge(sa : Element, sb : Element)
+Element function make_reverse_dictionary(dict : Element)