layout_builders: merged PHLayout & PHResolutionLayout
[nit.git] / src / layout_builders.nit
index 925e5e1..5c8184b 100644 (file)
@@ -19,47 +19,31 @@ import abstract_compiler
 
 # Layouts
 
-class TypingLayout[E]
-       # Unic ids or each element
+class Layout[E: Object]
+       # Ids or each element
        var ids: Map[E, Int] = new HashMap[E, Int]
        # Fixed positions of each element in all tables
        var pos: Map[E, Int] = new HashMap[E, Int]
 end
 
-class PHTypingLayout[E]
-       super TypingLayout[E]
+class PHLayout[HOLDER: Object, E: Object]
+       super Layout[E]
        # Masks used by hash function
-       var masks: Map[E, Int] = new HashMap[E, Int]
+       var masks: Map[HOLDER, Int] = new HashMap[HOLDER, Int]
        # Positions of each element for each tables
-       var hashes: Map[E, Map[E, Int]] = new HashMap[E, Map[E, Int]]
+       var hashes: Map[HOLDER, Map[E, Int]] = new HashMap[HOLDER, Map[E, Int]]
 end
 
-class PropertyLayout[E]
+class PropertyLayout[E: Object]
        # Fixed positions of each element in all tables
        var pos: Map[E, Int] = new HashMap[E, Int]
 end
 
-# Layout for resolution tables
-class ResolutionLayout
-       # Unic ids for each resolved type
-       var ids: Map[MType, Int] = new HashMap[MType, Int]
-       # Fixed positions of resolved type
-       var pos: Map[MType, Int] = new HashMap[MType, Int]
-end
-
-class PHResolutionLayout
-       super ResolutionLayout
-       # Masks associated to each owner of a resolution table
-       var masks: Map[MClassType, Int] = new HashMap[MClassType, Int]
-       # Positions of each resolvec type for resolution tables
-       var hashes: Map[MClassType, Map[MType, Int]] = new HashMap[MClassType, Map[MType, Int]]
-end
-
 # Builders
 
-abstract class TypingLayoutBuilder[E]
+abstract class TypingLayoutBuilder[E: Object]
 
-       type LAYOUT: TypingLayout[E]
+       type LAYOUT: Layout[E]
 
        private var mmodule: MModule
        init(mmodule: MModule) do self.mmodule = mmodule
@@ -88,7 +72,7 @@ class BMTypeLayoutBuilder
 
        # Compute mtypes ids and position using BM
        redef fun build_layout(mtypes) do
-               var result = new TypingLayout[MType]
+               var result = new Layout[MType]
                result.ids = self.compute_ids(mtypes)
                result.pos = result.ids
                return result
@@ -110,7 +94,7 @@ class CLTypeLayoutBuilder
 
        # Compute mtypes ids and position using BM
        redef fun build_layout(mtypes) do
-               var result = new TypingLayout[MType]
+               var result = new Layout[MType]
                result.ids = self.compute_ids(mtypes)
                result.pos = self.colorer.colorize(mtypes)
                return result
@@ -123,12 +107,12 @@ end
 class PHTypeLayoutBuilder
        super TypingLayoutBuilder[MType]
 
-       redef type LAYOUT: PHTypingLayout[MType]
+       redef type LAYOUT: PHLayout[MType, MType]
 
        private var hasher: PerfectHasher[MType, MType]
 
        init(mmodule: MModule, operator: PHOperator) do
-               super
+               super(mmodule)
                self.hasher = new PerfectHasher[MType, MType](operator)
        end
 
@@ -144,7 +128,7 @@ class PHTypeLayoutBuilder
 
        # Compute mtypes ids and position using BM
        redef fun build_layout(mtypes) do
-               var result = new PHTypingLayout[MType]
+               var result = new PHLayout[MType, MType]
                var conflicts = build_conflicts(mtypes)
                result.ids = self.compute_ids(mtypes)
                result.masks = self.hasher.compute_masks(conflicts, result.ids)
@@ -173,7 +157,7 @@ class BMClassLayoutBuilder
 
        # Compute mclasses ids and position using BM
        redef fun build_layout(mclasses) do
-               var result = new TypingLayout[MClass]
+               var result = new Layout[MClass]
                result.ids = self.compute_ids(mclasses)
                result.pos = result.ids
                return result
@@ -195,7 +179,7 @@ class CLClassLayoutBuilder
 
        # Compute mclasses ids and position using BM
        redef fun build_layout(mclasses) do
-               var result = new TypingLayout[MClass]
+               var result = new Layout[MClass]
                result.ids = self.compute_ids(mclasses)
                result.pos = self.colorer.colorize(mclasses)
                return result
@@ -208,12 +192,12 @@ end
 class PHClassLayoutBuilder
        super TypingLayoutBuilder[MClass]
 
-       redef type LAYOUT: PHTypingLayout[MClass]
+       redef type LAYOUT: PHLayout[MClass, MClass]
 
        private var hasher: PerfectHasher[MClass, MClass]
 
        init(mmodule: MModule, operator: PHOperator) do
-               super
+               super(mmodule)
                self.hasher = new PerfectHasher[MClass, MClass](operator)
        end
 
@@ -229,7 +213,7 @@ class PHClassLayoutBuilder
 
        # Compute mclasses ids and position using BM
        redef fun build_layout(mclasses) do
-               var result = new PHTypingLayout[MClass]
+               var result = new PHLayout[MClass, MClass]
                var conflicts = build_conflicts(mclasses)
                result.ids = self.compute_ids(mclasses)
                result.masks = self.hasher.compute_masks(conflicts, result.ids)
@@ -254,9 +238,6 @@ abstract class PropertyLayoutBuilder[E: MProperty]
 
        type LAYOUT: PropertyLayout[E]
 
-       private var mmodule: MModule
-       init(mmodule: MModule) do self.mmodule = mmodule
-
        # Compute properties ids and position
        fun build_layout(mclasses: Set[MClass]): LAYOUT is abstract
 end
@@ -267,9 +248,8 @@ class CLPropertyLayoutBuilder[E: MProperty]
 
        private var colorer: MPropertyColorer[E]
 
-       init(mmodule: MModule) do
-               super
-               self.colorer = new MPropertyColorer[E](mmodule)
+       init(colorer: MPropertyColorer[E]) do
+               self.colorer = colorer
        end
 
        # Compute mclasses ids and position using BM
@@ -288,7 +268,7 @@ end
 
 abstract class ResolutionLayoutBuilder
 
-       type LAYOUT: ResolutionLayout
+       type LAYOUT: Layout[MType]
 
        init do end
 
@@ -316,7 +296,7 @@ class BMResolutionLayoutBuilder
 
        # Compute resolved types position using BM
        redef fun build_layout(elements) do
-               var result = new ResolutionLayout
+               var result = new Layout[MType]
                result.ids = self.compute_ids(elements)
                result.pos = result.ids
                return result
@@ -333,7 +313,7 @@ class CLResolutionLayoutBuilder
 
        # Compute resolved types colors
        redef fun build_layout(elements) do
-               var result = new ResolutionLayout
+               var result = new Layout[MType]
                result.ids = self.compute_ids(elements)
                result.pos = self.colorer.colorize(elements)
                return result
@@ -344,7 +324,7 @@ end
 class PHResolutionLayoutBuilder
        super ResolutionLayoutBuilder
 
-       redef type LAYOUT: PHResolutionLayout
+       redef type LAYOUT: PHLayout[MClassType, MType]
 
        private var hasher: PerfectHasher[MClassType, MType]
 
@@ -352,7 +332,7 @@ class PHResolutionLayoutBuilder
 
        # Compute resolved types masks and hashes
        redef fun build_layout(elements) do
-               var result = new PHResolutionLayout
+               var result = new PHLayout[MClassType, MType]
                result.ids = self.compute_ids(elements)
                result.pos = result.ids
                result.masks = self.hasher.compute_masks(elements, result.ids)
@@ -538,7 +518,7 @@ private class MClassColorer
 end
 
 # MProperty coloring
-private class MPropertyColorer[E: MProperty]
+abstract class MPropertyColorer[E: MProperty]
 
        private var mmodule: MModule
        private var class_colorer: MClassColorer
@@ -610,10 +590,49 @@ private class MPropertyColorer[E: MProperty]
        end
 
        # Filter properties
-       private fun properties(mclass: MClass): Set[E] do
-               var properties = new HashSet[E]
+       private fun properties(mclass: MClass): Set[E] is abstract
+end
+
+# Coloring for MMethods
+class MMethodColorer
+       super MPropertyColorer[MMethod]
+
+       init(mmodule: MModule) do super
+
+       redef fun properties(mclass) do
+               var properties = new HashSet[MMethod]
+               for mprop in self.mmodule.properties(mclass) do
+                       if mprop isa MMethod then properties.add(mprop)
+               end
+               return properties
+       end
+end
+
+# Coloring for MMAttributes
+class MAttributeColorer
+       super MPropertyColorer[MAttribute]
+
+       init(mmodule: MModule) do super
+
+       redef fun properties(mclass) do
+               var properties = new HashSet[MAttribute]
+               for mprop in self.mmodule.properties(mclass) do
+                       if mprop isa MAttribute then properties.add(mprop)
+               end
+               return properties
+       end
+end
+
+# Coloring for MVirtualTypeProps
+class MVirtualTypePropColorer
+       super MPropertyColorer[MVirtualTypeProp]
+
+       init(mmodule: MModule) do super
+
+       redef fun properties(mclass) do
+               var properties = new HashSet[MVirtualTypeProp]
                for mprop in self.mmodule.properties(mclass) do
-                       if mprop isa E then properties.add(mprop)
+                       if mprop isa MVirtualTypeProp then properties.add(mprop)
                end
                return properties
        end
@@ -684,7 +703,7 @@ end
 # Perfect Hashing (PH)
 # T = type of holder
 # U = type of elements to hash
-private class PerfectHasher[T, U]
+private class PerfectHasher[T: Object, U: Object]
 
        var operator: PHOperator