/[eiffelstudio]/branches/CAT_mono/Src/Eiffel/eiffel/genericity/cl_type_i.e
ViewVC logotype

Diff of /branches/CAT_mono/Src/Eiffel/eiffel/genericity/cl_type_i.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 8805 by manus, Wed Dec 10 17:30:55 1997 UTC revision 9655 by manus, Sun Mar 15 02:15:49 1998 UTC
# Line 3  Line 3 
3  class CL_TYPE_I  class CL_TYPE_I
4    
5  inherit  inherit
   
6          TYPE_I          TYPE_I
7                  redefine                  redefine
8                          is_reference,                          is_reference,
# Line 18  inherit Line 17  inherit
17    
18  feature  feature
19    
20          base_id: CLASS_ID;          base_id: CLASS_ID
21                          -- Base class id of the type class                          -- Base class id of the type class
22    
23          is_expanded: BOOLEAN;          is_expanded: BOOLEAN
24                          -- Is the type expanded?                          -- Is the type expanded?
25    
26          is_separate: BOOLEAN;          is_separate: BOOLEAN
27                          -- Is the type separate?                          -- Is the type separate?
28    
29          set_base_id (c: CLASS_ID) is          set_base_id (c: CLASS_ID) is
30                          -- Assign `c' to `base_id'.                          -- Assign `c' to `base_id'.
31                  do                  do
32                          base_id := c;                          base_id := c
33                  end;                  end
34    
35          set_is_expanded (b: BOOLEAN) is          set_is_expanded (b: BOOLEAN) is
36                          -- Assign `b' to `is_expanded'.                          -- Assign `b' to `is_expanded'.
37                  do                  do
38                          is_expanded := b;                          is_expanded := b
39                  end;                  end
40    
41          set_is_separate (b: BOOLEAN) is          set_is_separate (b: BOOLEAN) is
42                          -- Assign `b' to `is_separate'.                          -- Assign `b' to `is_separate'.
43                  do                  do
44                          is_separate := b;                          is_separate := b
45                  end;                  end
46    
47          meta_generic: META_GENERIC is          meta_generic: META_GENERIC is
48                          -- Meta generic array describing the type class                          -- Meta generic array describing the type class
49                  do                  do
50                          -- No meta generic in non-generic type                          -- No meta generic in non-generic type
51                  end;                  end
52    
53          base_class: CLASS_C is          base_class: CLASS_C is
54                          -- Base class associated to the class type                          -- Base class associated to the class type
55                  do                  do
56                          Result := System.class_of_id (base_id);                          Result := System.class_of_id (base_id)
57                  end;                  end
58    
59          is_valid: BOOLEAN is          is_valid: BOOLEAN is
60                          -- Is the base class still in the system ?                          -- Is the base class still in the system ?
61                  do                  do
62                          Result := base_class /= Void;                          Result := base_class /= Void
63                  end;                  end
64    
65          is_reference: BOOLEAN is          is_reference: BOOLEAN is
66                          -- Is the type a reference type ?                          -- Is the type a reference type ?
67                  do                  do
68                          Result := not is_expanded;                          Result := not is_expanded
69                  end;                  end;
70    
71          same_as (other: TYPE_I): BOOLEAN is          same_as (other: TYPE_I): BOOLEAN is
72                          -- Is `other' equal to Current ?                          -- Is `other' equal to Current ?
73                  local                  local
74                          other_cl_type: CL_TYPE_I;                          other_cl_type: CL_TYPE_I
75                  do                  do
76                          other_cl_type ?= other;                          other_cl_type ?= other
77                          Result := other_cl_type /= Void -- FIXME                          Result := other_cl_type /= Void -- FIXME
78                                          and then equal (other_cl_type.base_id, base_id)                                          and then equal (other_cl_type.base_id, base_id)
79                                          and then other_cl_type.is_expanded = is_expanded                                          and then other_cl_type.is_expanded = is_expanded
80                                          and then other_cl_type.is_separate = is_separate                                          and then other_cl_type.is_separate = is_separate
81                                          and then other_cl_type.meta_generic = Void                                          and then other_cl_type.meta_generic = Void
82                  end;                  end
83    
84          instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is          instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is
85                          -- Instantiation of Current in context of `other'                          -- Instantiation of Current in context of `other'
86                  require else                  require else
87                          True                          True
88                  do                  do
89                          Result := Current;                          Result := Current
90                  end;                  end
91    
92          description: ATTR_DESC is          description: ATTR_DESC is
93                          -- Type description for skeletons                          -- Type description for skeletons
# Line 99  feature Line 98  feature
98                          ref: REFERENCE_DESC                          ref: REFERENCE_DESC
99                  do                  do
100                          if is_expanded then                          if is_expanded then
101                                  !!exp;                                  !!exp
102                                  is_expanded := False;                                  is_expanded := False
103    
104                                  types := base_class.types;                                  types := base_class.types
105                                  pos := types.index;                                  pos := types.index
106                                  types.compare_references                                  types.compare_references
107                                  types.search (Current);                                  types.search (Current)
108                                  exp.set_class_type (types.item);                                  exp.set_class_type (types.item)
109                                  types.go_i_th (pos);                                  types.go_i_th (pos)
110    
111                                  is_expanded := True;                                  is_expanded := True
112                                  Result := exp;                                  Result := exp
113                          elseif is_separate then                          elseif is_separate then
114                                  -- FIXME                                  -- FIXME
115                                  Result := c_type.description                                  Result := c_type.description
116                          else                          else
117                                  Result := c_type.description;                                  Result := c_type.description
118                          end;                          end
119    
120                          ref ?= Result                          ref ?= Result
121                          if ref /= Void then                          if ref /= Void then
122                                  ref.set_class_type_i (Current)                                  ref.set_class_type_i (Current)
123                          end                          end
124                  end;                  end
125    
126          c_type: TYPE_C is          c_type: TYPE_C is
127                          -- Associated C type                          -- Associated C type
128                  do                  do
129                          Result := Reference_c_type;                          Result := Reference_c_type
130                  end;                  end
131    
132          append_signature (st: STRUCTURED_TEXT) is          append_signature (st: STRUCTURED_TEXT) is
133                  do                  do
134                          if is_expanded then                          if is_expanded then
135                                  st.add_string ("expanded ");                                  st.add_string ("expanded ")
136                          elseif is_separate then                          elseif is_separate then
137                                  st.add_string ("separate ");                                  st.add_string ("separate ")
138                          end;                          end
139                          base_class.append_signature (st)                          base_class.append_signature (st)
140                  end;                  end
141    
142          dump (file: FILE) is          dump (file: FILE) is
143                  local                  local
144                          s: STRING                          s: STRING
145                  do                  do
146                          if is_expanded then                          if is_expanded then
147                                  file.putstring ("expanded ");                                  file.putstring ("expanded ")
148                          elseif is_separate then                          elseif is_separate then
149                                  file.putstring ("separate ");                                  file.putstring ("separate ")
150                          end;                          end
151                          s := clone (base_class.name);                          s := clone (base_class.name)
152                          s.to_upper;                          s.to_upper
153                          file.putstring (s);                          file.putstring (s)
154                  end;                  end
155    
156          has_associated_class_type: BOOLEAN is          has_associated_class_type: BOOLEAN is
157                          -- Has `Current' an associated class type?                          -- Has `Current' an associated class type?
# Line 179  feature Line 178  feature
178                  require                  require
179                          has: has_associated_class_type                          has: has_associated_class_type
180                  local                  local
181                          types: TYPE_LIST;                          types: TYPE_LIST
182                          pos: INTEGER;                          pos: INTEGER
183                  do                  do
184                          if is_expanded then                          if is_expanded then
185                                  Result := associated_expanded_class_type                                  Result := associated_expanded_class_type
186                          elseif is_separate then                          elseif is_separate then
187                                  Result := associated_separate_class_type                                  Result := associated_separate_class_type
188                          else                          else
189                                  types := base_class.types;                                  types := base_class.types
190                                  pos := types.index;                                  pos := types.index
191                                  types.compare_references                                  types.compare_references
192                                  types.search (Current);                                  types.search (Current)
193                                  Result := types.item;                                  Result := types.item
194                                  types.go_i_th (pos);                                  types.go_i_th (pos)
195                          end;                          end
196                  end;                  end
197    
198          associated_expanded_class_type: CLASS_TYPE is          associated_expanded_class_type: CLASS_TYPE is
199                          -- Associated expanded class type                          -- Associated expanded class type
# Line 202  feature Line 201  feature
201                          is_expanded: is_expanded                          is_expanded: is_expanded
202                          has: has_associated_class_type                          has: has_associated_class_type
203                  do                  do
204                          is_expanded := false;                          is_expanded := false
205                          Result := associated_class_type;                          Result := associated_class_type
206                          is_expanded := true;                          is_expanded := true
207                  end;                  end
208    
209          associated_separate_class_type: CLASS_TYPE is          associated_separate_class_type: CLASS_TYPE is
210                          -- Associated separate class type                          -- Associated separate class type
# Line 213  feature Line 212  feature
212                          is_separate: is_separate                          is_separate: is_separate
213                          has: has_associated_class_type                          has: has_associated_class_type
214                  do                  do
215                          is_separate := false;                          is_separate := false
216                          Result := associated_class_type;                          Result := associated_class_type
217                          is_separate := true;                          is_separate := true
218                  end;                  end
219    
220          type_id: INTEGER is          type_id: INTEGER is
221                          -- Type id of the correponding class type                          -- Type id of the correponding class type
222                  do                  do
223                          Result := associated_class_type.type_id;                          Result := associated_class_type.type_id
224                  end;                  end
225    
226          expanded_type_id: INTEGER is          expanded_type_id: INTEGER is
227                          -- Type id of the corresponding expanded class type                          -- Type id of the corresponding expanded class type
228                  do                  do
229                          Result := associated_expanded_class_type.type_id                          Result := associated_expanded_class_type.type_id
230                  end;                  end
231    
232          generate_cecil_value (file: INDENT_FILE) is          generate_cecil_value (file: INDENT_FILE) is
233                          -- Generate cecil value                          -- Generate cecil value
234                  do                  do
235                                  -- FIXME????: separate                                  -- FIXME????: separate
236                          if not is_expanded then                          if not is_expanded then
237                                  file.putstring ("SK_DTYPE");                                  file.putstring ("SK_DTYPE")
238                          else                          else
239                                  file.putstring ("SK_EXP + (uint32) ");                                  file.putstring ("SK_EXP + (uint32) ")
240                                  file.putint (base_id.id);                                  file.putint (base_id.id)
241                          end;                          end
242                  end;                  end
243    
244          hash_code: INTEGER is          hash_code: INTEGER is
245                          -- Hash code for current type                          -- Hash code for current type
246                  do                  do
247                          Result := Other_code + base_id.hash_code                          Result := Other_code + base_id.hash_code
248                  end;                  end
249    
250          sk_value: INTEGER is          sk_value: INTEGER is
251                          -- Generate SK value associated to the current type.                          -- Generate SK value associated to the current type.
252                  do                  do
253                                  -- FIXME????: separate                                  -- FIXME????: separate
254                          if not is_expanded then                          if not is_expanded then
255                                  Result := Sk_ref + (type_id - 1);                                  Result := Sk_ref + (type_id - 1)
256                          else                          else
257                                  is_expanded := False;                                  is_expanded := False
258                                  Result := Sk_exp + (type_id - 1);                                  Result := Sk_exp + (type_id - 1)
259                                  is_expanded := True;                                  is_expanded := True
260                          end;                          end
261                  end;                  end
262    
263          cecil_value: INTEGER is          cecil_value: INTEGER is
264                  do                  do
# Line 268  feature Line 267  feature
267                                  Result := Sk_dtype                                  Result := Sk_dtype
268                          else                          else
269                                  Result := Sk_exp + base_id.id                                  Result := Sk_exp + base_id.id
270                          end;                          end
271                  end;                  end
272    
273  feature -- Array optimization  feature -- Array optimization
274    
275          conforms_to_array: BOOLEAN is          conforms_to_array: BOOLEAN is
276                  do                  do
277                          Result := base_class.conform_to (array_class_c)                          Result := base_class.conform_to (array_class_c)
278                  end;                  end
279    
280  feature {NONE} -- Array optimization  feature {NONE} -- Array optimization
281    
282          array_class_c: CLASS_C is          array_class_c: CLASS_C is
283                  once                  once
284                          Result := System.array_class.compiled_class                          Result := System.array_class.compiled_class
285                  end;                  end
286    
287  feature  feature
288    
289          type_a: CL_TYPE_A is          type_a: CL_TYPE_A is
290                  do                  do
291                          !!Result                          !!Result
292                          Result.set_is_expanded (is_expanded);                          Result.set_is_expanded (is_expanded)
293                          Result.set_is_separate (is_separate);                          Result.set_is_separate (is_separate)
294                          Result.set_base_class_id (base_id)                          Result.set_base_class_id (base_id)
295                  end                  end
296    

Legend:
Removed from v.8805  
changed lines
  Added in v.9655

  ViewVC Help
Powered by ViewVC 1.1.23