class interface FIXED_ARRAY2[E]
   --    
   --  Resizable two dimensional array.
   --  Unlike ARRAY2, the lower1 bound and the lower2 bound are 
   --  frozen to 0. Thus, one can expect better performances.
   -- 

creation
   make (new_count1, new_count2: INTEGER)
      --  Create or reset Current with new dimensions.
      --  All elements are set to the default value of type E.

      require
         new_count1 > 0;
         new_count2 > 0
      ensure
         count1 = new_count1;
         count2 = new_count2;
         all_cleared

   copy (other: like Current)
      require
         other_not_void: other /= Void
      ensure
         is_equal: is_equal(other)

   from_collection2 (model: COLLECTION2[like item])
      --   Uses model to initialize Current.

      require
         model /= Void
      ensure
         count1 = model.count1;
         count2 = model.count2

   from_collection (model: COLLECTION2[like item])
      --  Uses the model to update Current.


   from_model (model: COLLECTION[COLLECTION[E]])
      --  The model is used to fill line by line Current.
      --  Assume all sub-collections of model have the same
      --  number of lines.

      require
         model /= Void
      ensure
         count1 = model.count;
         count2 > 0 implies count2 = model.first.count

feature(s) from COLLECTION2
   --  Indexing :

   lower1: INTEGER
      --  Lower index bounds.


feature(s) from COLLECTION2
   --  Indexing :

   lower2: INTEGER
      --  Lower index bounds.


   line_minimum: INTEGER
      --  Equivalent of lower1.


   column_minimum: INTEGER
      --  Equivalent of lower2.


   upper1: INTEGER
      --  Total number of elements.


   upper2: INTEGER
      --  Total number of elements.


   line_maximum: INTEGER
      --  Equivalent of upper1.


   column_maximum: INTEGER
      --  Equivalent of upper2.


feature(s) from COLLECTION2
   --  Reading :

   item (line, column: INTEGER): E
      require
         valid_index(line,column)

feature(s) from COLLECTION2
   --  Writing :

   put (x: like item; line, column: INTEGER)
      require
         valid_index(line,column)
      ensure
         item(line,column) = x

   force (element: like item; line, column: INTEGER)
      --  Put element at position (line,column). Collection is
      --  resized first when (line,column) is not inside current
      --  bounds. New bounds are initialized with default values.

      require
         line >= 0;
         column >= 0
      ensure
         item(line,column) = element;
         count >= old count

feature(s) from COLLECTION2
   --  Index validity :

   valid_line (line: INTEGER): BOOLEAN
      ensure
         Result = (lower1 <= line and line <= upper1)

feature(s) from COLLECTION2
   --  Index validity :

   valid_index1 (line: INTEGER): BOOLEAN
      ensure
         Result = (lower1 <= line and line <= upper1)

   valid_column (column: INTEGER): BOOLEAN
      ensure
         Result = (lower2 <= column and column <= upper2)

   valid_index2 (column: INTEGER): BOOLEAN
      ensure
         Result = (lower2 <= column and column <= upper2)

   valid_index (line, column: INTEGER): BOOLEAN
      ensure
         Result = (valid_line(line) and valid_index2(column))

feature(s) from COLLECTION2
   --  Counting :

   count1: INTEGER
      --  Total number of elements.


   line_count: INTEGER
      --  Equivalent of count1.


   count2: INTEGER
      --  Total number of elements.


   column_count: INTEGER

   count: INTEGER
      --  Total number of elements.


feature(s) from COLLECTION2
   swap (line1, column1, line2, column2: INTEGER)
      --  Swap the element at index (line1,column1) with the
      --  the element at index (line2,column2).

      require
         valid_index(line1,column1);
         valid_index(line2,column2)
      ensure
         item(line1,column1) = old item(line2,column2);
         item(line2,column2) = old item(line1,column1);
         count = old count

   set_all_with (x: E)
      --   All element are set with the value x.

      ensure
         count = old count;
         count = old count

   clear_all
      --  Set all items to default values.

      ensure
         count = old count

feature(s) from COLLECTION2
   --  Creating or initializing :

   from_collection2 (model: COLLECTION2[like item])
      --   Uses model to initialize Current.

      require
         model /= Void
      ensure
         count1 = model.count1;
         count2 = model.count2

   from_model (model: COLLECTION[COLLECTION[E]])
      --  The model is used to fill line by line Current.
      --  Assume all sub-collections of model have the same
      --  number of lines.

      require
         model /= Void
      ensure
         count1 = model.count;
         count2 > 0 implies count2 = model.first.count

feature(s) from COLLECTION2
   --  Looking and comparison :

   all_cleared: BOOLEAN
      --  Are all items set to default values ?


   same_as (other: COLLECTION2[E]): BOOLEAN
      --  Unlike is_equal, this feature can be used to compare
      --  distinct implementation of COLLECTION2.

      require
         other /= Void
      ensure
         Result implies standard_same_as(other)

feature(s) from COLLECTION2
   --  Printing :

   fill_tagged_out_memory
      --  Append a viewable information in tagged_out_memory in 
      --  order to affect the behavior of out, tagged_out, etc.


feature(s) from COLLECTION2
   --  Miscellaneous features :

   nb_occurrences (elt: E): INTEGER
      --  Number of occurrences using equal.
      --  See also fast_nb_occurrences to chose
      --  the apropriate one.

      ensure
         Result >= 0;
         Result >= 0

   fast_nb_occurrences (elt: E): INTEGER
      --  Number of occurrences using =.

      ensure
         Result >= 0;
         Result >= 0

   has (x: like item): BOOLEAN
      --  Look for x using equal for comparison.      


   fast_has (x: like item): BOOLEAN
      --  Same as has but use = for comparison      


   replace_all (old_value, new_value: like item)
      --  Replace all occurences of the element old_value by new_value 
      --  using equal for comparison.
      --  See also fast_replace_all to choose the apropriate one.

      ensure
         count = old count;
         nb_occurrences(old_value) = 0

   fast_replace_all (old_value, new_value: like item)
      --  Replace all occurences of the element old_value by new_value 
      --  using operator = for comparison.
      --  See also replace_all to choose the apropriate one.

      ensure
         count = old count;
         fast_nb_occurrences(old_value) = 0

   sub_collection2 (line_min, line_max, column_min, column_max: INTEGER): like Current
      --  Create a new object using selected area of Current.

      require
         valid_index(line_min,column_min);
         valid_index(line_min,column_min)
      ensure
         Result /= Void

   set_area (element: like item; line_min, line_max, column_min, column_max: INTEGER)
      --  Set all the elements of the selected area rectangle with element.

      require
         valid_index(line_min,line_max);
         valid_index(column_min,column_max)
      ensure
         count = old count

feature(s) from FIXED_ARRAY2
   make (new_count1, new_count2: INTEGER)
      --  Create or reset Current with new dimensions.
      --  All elements are set to the default value of type E.

      require
         new_count1 > 0;
         new_count2 > 0
      ensure
         count1 = new_count1;
         count2 = new_count2;
         all_cleared

   from_collection (model: COLLECTION2[like item])
      --  Uses the model to update Current.


feature(s) from FIXED_ARRAY2
   --  Implementation of others feature from COLLECTION2 :

   copy (other: like Current)
      require
         other_not_void: other /= Void
      ensure
         is_equal: is_equal(other)

   is_equal (other: like Current): BOOLEAN
      require
         other_not_void: other /= Void
      ensure
         consistent: standard_is_equal(other) implies Result;
         symmetric: Result implies other.is_equal(Current)

feature(s) from FIXED_ARRAY2
   --  Writing :

   slice (l1, up1, l2, up2: INTEGER): like Current
      --  Create a new collection initialized with elements of
      --  range low..up. Result has the same dynamic type 
      --  as Current collection.


   set_slice (element: like item; l1, up1, l2, up2: INTEGER)
      --  Set all the elements in the 
      --  range [(l1,up1),(l2,up2)] of
      --  Current with the element 'element'.


feature(s) from FIXED_ARRAY2
   --  Resizing :

   resize (new_count1, new_count2: INTEGER)
      require
         new_count1 > 0;
         new_count2 > 0
      ensure
         upper1 = new_count1 - 1;
         count1 = new_count1;
         upper2 = new_count2 - 1;
         count2 = new_count2;
         count = new_count1 * new_count2

feature(s) from FIXED_ARRAY2
   --  Other features :

   transpose
      --  Transpose the Current array


   to_external: POINTER
      --  Gives C access to the internal storage (may be dangerous).


invariant
   count1 = upper1 + 1;
   count2 = upper2 + 1;
   count = count1 * count2;
   capacity >= count;

end of FIXED_ARRAY2[E]