+abstract class ResolutionLayoutBuilder
+
+ type LAYOUT: ResolutionLayout
+
+ init do end
+
+ fun build_layout(elements: Map[MClassType, Set[MType]]): LAYOUT is abstract
+
+ fun compute_ids(elements: Map[MClassType, Set[MType]]): Map[MType, Int] do
+ var ids = new HashMap[MType, Int]
+ var color = 0
+ for mclasstype, mclasstypes in elements do
+ for element in mclasstypes do
+ if ids.has_key(element) then continue
+ ids[element] = color
+ color += 1
+ end
+ end
+ return ids
+ end
+end
+
+# Layout builder for MClass using Binary Matrix (BM)
+class BMResolutionLayoutBuilder
+ super ResolutionLayoutBuilder
+
+ init do super
+
+ # Compute resolved types position using BM
+ redef fun build_layout(elements) do
+ var result = new ResolutionLayout
+ result.ids = self.compute_ids(elements)
+ result.pos = result.ids
+ return result
+ end
+end
+
+# Layout builder for resolution tables using Coloring (CL)
+class CLResolutionLayoutBuilder
+ super ResolutionLayoutBuilder
+
+ private var colorer: ResolutionColorer = new ResolutionColorer
+
+ init do super
+
+ # Compute resolved types colors
+ redef fun build_layout(elements) do
+ var result = new ResolutionLayout
+ result.ids = self.compute_ids(elements)
+ result.pos = self.colorer.colorize(elements)
+ return result
+ end
+end
+
+# Layout builder for resolution table using Perfect Hashing (PH)
+class PHResolutionLayoutBuilder
+ super ResolutionLayoutBuilder
+
+ redef type LAYOUT: PHResolutionLayout
+
+ private var hasher: ResolutionHasher
+
+ init(operator: PHOperator) do self.hasher = new ResolutionHasher(operator)
+
+ # Compute resolved types masks and hashes
+ redef fun build_layout(elements) do
+ var result = new PHResolutionLayout
+ result.ids = self.compute_ids(elements)
+ result.pos = result.ids
+ result.masks = self.hasher.compute_masks(elements, result.ids)
+ result.hashes = self.hasher.compute_hashes(elements, result.ids, result.masks)
+ return result
+ end
+
+ redef fun compute_ids(elements) do
+ var ids = new HashMap[MType, Int]
+ var color = 1
+ for mclasstype, mclasstypes in elements do
+ for element in mclasstypes do
+ if ids.has_key(element) then continue
+ ids[element] = color
+ color += 1
+ end
+ end
+ return ids
+ end
+end
+