- var mclasses = new HashSet[MClass]
- mclasses.add_all(mmbuilder.model.mclasses)
-
- # classes coloration
- if modelbuilder.toolcontext.opt_use_mod_perfect_hashing.value then
- # set type unique id
- for mclass in mclasses do
- self.class_ids[mclass] = self.class_ids.length + 1
- end
-
- var class_coloring = new ClassModPerfectHashing(mainmodule)
- self.class_colors = class_coloring.compute_masks(mclasses, class_ids)
- self.class_tables = class_coloring.hash_type_tables(mclasses, class_ids, class_colors)
- self.class_coloring = class_coloring
- self.header.add_decl("int HASH(int, int);")
- var v = new_visitor
- v.add_decl("int HASH(int mask, int id) \{")
- v.add_decl("return mask % id;")
- v.add_decl("\}")
- else if modelbuilder.toolcontext.opt_use_and_perfect_hashing.value then
- # set type unique id
- for mclass in mclasses do
- self.class_ids[mclass] = self.class_ids.length + 1
- end
-
- var class_coloring = new ClassAndPerfectHashing(mainmodule)
- self.class_colors = class_coloring.compute_masks(mclasses, class_ids)
- self.class_tables = class_coloring.hash_type_tables(mclasses, class_ids, class_colors)
- self.class_coloring = class_coloring
- self.header.add_decl("int HASH(int, int);")
- var v = new_visitor
- v.add_decl("int HASH(int mask, int id) \{")
- v.add_decl("return mask & id;")
- v.add_decl("\}")
- else
- # set type unique id
- for mclass in mclasses do
- self.class_ids[mclass] = self.class_ids.length + 1
+ # Class coloring
+ var mclasses = new HashSet[MClass].from(mmbuilder.model.mclasses)
+ var poset = mainmodule.flatten_mclass_hierarchy
+ var colorer = new POSetColorer[MClass]
+ colorer.colorize(poset)
+ class_ids = colorer.ids
+ class_colors = colorer.colors
+ class_tables = self.build_class_typing_tables(mclasses)
+
+ # lookup vt to build layout with
+ var vts = new HashMap[MClass, Set[MVirtualTypeProp]]
+ for mclass in mclasses do
+ vts[mclass] = new HashSet[MVirtualTypeProp]
+ for mprop in self.mainmodule.properties(mclass) do
+ if mprop isa MVirtualTypeProp then
+ vts[mclass].add(mprop)
+ end