Section Header
  
  
    + name    := FAST_ARRAY2[E];
  
  
    - comment :="Resizable two dimensional array.                   \
              \Unlike ARRAY2, the `lower1' bound and the `lower2' \
              \bound are frozen to 0. Thus, one can expect better \
              \performances.";
Section Inherit
    
  
    + parent_collection2:Expanded COLLECTION2[E];
  
Section Public
  
  
    + upper1:INTEGER; 
  
    + count1:INTEGER;
  
  
    + upper2:INTEGER;
  
    + count2:INTEGER;
  
  
    + count:INTEGER;
  
Section FAST_ARRAY2
    
  
    + storage:NATIVE_ARRAY[E];
  
  
    + capacity :INTEGER; 
         of `storage'.
  
Section Public
  
  
    - lower1:INTEGER := 
  
  
    - lower2:INTEGER := 
  
  
    - create (new_count1,new_count2:INTEGER) :SELF<-
  
         Create with new dimensions.
  
         All elements are set to the default value of type E.
    
  
    - make (new_count1,new_count2:INTEGER) <-
  
         Create or reset self with new dimensions.
  
         All elements are set to the default value of type E.
    
  
  
    - from_collection2 model:COLLECTION2[E] <-
  
         Uses the `model' to update self.
    
  
    - from_collection contents:COLLECTION[E] size (new_count1, new_count2:INTEGER) <-
  
          Reset all bounds using `new_count#i'.
  
          Copy all elements of `contents', line by line into Current.
  
  
    - from_model model:COLLECTION[COLLECTION[E]] <-
  
         The `model' is used to fill line by line the COLLECTION2.
  
         Assume all sub-collections of `model' have the number of items.
  
  
    - sub_collection2 (line_min,column_min:INTEGER) to (line_max,column_max:INTEGER) :SELF <-
    
  
  
 Implementation of others feature from COLLECTION2:
  
  
  
    - item (line, column:INTEGER) :E <-
      
  
    - put element:E to (line, column:INTEGER) <-
      
  
    - force element:E to (line , column :INTEGER) <-
      
  
    - copy other:SELF <-
    
  
  
 Writing.
  
  
  
    - set_all_with v:E <-
  
          All element are set with the value v.
      
  
    - all_default:BOOLEAN <-
      
  
    -  slice (l1,up1:INTEGER) to (l2,up2:INTEGER) :SELF <-
  
         Create a new collection initialized with elements of
  
         range `low'..`up'. result has the same dynamic type
  
         as self collection.
      
  
    - set_slice (l1,up1:INTEGER) to (l2,up2:INTEGER) with element:E <-
  
         Set all the elements in the range [(l1,up1),(l2,up2)] of
  
         self with the element 'element'.
      
  
    - swap (line1, column1:INTEGER) with (line2, column2:INTEGER) <-
    
  
  
 Looking and comparison:
  
  
  
    - occurrences elt:E :INTEGER <-
      
  
    - fast_occurrences elt:E :INTEGER <-
    
  
  
 Resizing:
  
  
  
    - resize (new_count1,new_count2:INTEGER) <-
    
  
  
 Looking and Searching:
  
  
  
    - has x:E :BOOLEAN <-
  
         Look for `x' using `equal' for comparison.
      
  
    - fast_has x:E :BOOLEAN <-
  
         Same as `has' but use `=' for comparison
    
  
  
 Other features:
  
  
  
    - replace_all old_value:E with new_value:E <-
      
  
    - fast_replace_all old_value:E with new_value:E <-
      
  
    - transpose <-
  
         Transpose the self 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 };
  ];