Section Header
  
  
    + name        := ARRAY3[E];
  
    - comment     :=" General prurpose, resizable, three dimensional array..";
    
Section Inherit
  
  
    + parent_collection3:Expanded COLLECTION3[E];
  
Section Public
  
  
    + lower1:INTEGER;
  
    + lower2:INTEGER;
  
    + lower3:INTEGER;
  
  
    + upper1:INTEGER;
  
    + upper2:INTEGER;
  
    + upper3:INTEGER;
  
  
    + count1:INTEGER;
  
    + count2:INTEGER;
  
    + count3:INTEGER;
  
  
    + count:INTEGER;
  
Section ARRAY3
  
  
    + storage:NATIVE_ARRAY[E];
  
         To store elements line by line.
  
  
    + capacity:INTEGER;
  
         Number of elements in `storage'.
  
Section Public
  
  
  
 Creation / modification:
  
 
  
  
    - create (line_min, column_min, depth_min:INTEGER) 
  to (line_max, column_max, depth_max:INTEGER) :SELF <-
  
         Reset all bounds `line_minimum' / `line_maximum' / `column_minimum'
  
         `column_maximum' / `depth_min' and `depth_max' using arguments as
  
         new values. All elements are set to the default value of type E.
    
  
    - make (line_min, column_min, depth_min:INTEGER) to (line_max, column_max, depth_max:INTEGER) <-
  
         Reset all bounds `line_minimum' / `line_maximum' / `column_minimum'
  
         `column_maximum' / `depth_min' and `depth_max' using arguments as
  
         new values. All elements are set to the default value of type E.
      
  
    - from_collection3 model:COLLECTION3[E] <-
      
  
    - from_collection contents:COLLECTION[E] 
  size (line_min,column_min,depth_min:INTEGER) 
  to (line_max,column_max,depth_max:INTEGER) <-
  
         Reset all bounds using `line_min', `line_max', `column_min',
  
         `column_max', `depth_min', and `depth_max'.
  
         Copy all elements of `contents', line by line into Current.
      
  
    - from_model model:COLLECTION[COLLECTION[COLLECTION[E]]] <-
  
        The `model' is used to fill line by line the COLLECTION3.
  
        Assume all sub-collections of have the same indexing.
    
  
  
 Resizing:
  
  
  
    - resize (line_min, column_min, depth_min:INTEGER) to (line_max, column_max, depth_max:INTEGER) <-
  
         Resize bounds of the Current array
    
  
  
 Implementation of others feature from COLLECTION3:
  
  
  
    - item (line, column, depth:INTEGER) :E <-
      
  
    - put element:E to (line, column, depth:INTEGER) <-
      
  
    - force x:E to (line, column, depth:INTEGER) <-
      
  
    - set_all_with element:E <-
      
  
    - replace_all old_value:E with new_value:E <-
      
  
    - fast_replace_all old_value:E with new_value:E <-
      
  
    - sub_collection3 (line_min, column_min, depth_min:INTEGER) 
  to (line_max, column_max, depth_max:INTEGER) :SELF <-
    
  
  
 Looking and comparison:
  
  
  
    - occurrences elt:E :INTEGER <-
      
  
    - fast_occurrences elt:E :INTEGER <-
      
  
    - has x:E :BOOLEAN <-
  
        Search if a element x is in the array using `equal'.
  
        See also `fast_has' to choose the apropriate one.
      
  
    - fast_has x:E :BOOLEAN <-
  
         Search if a element x is in the array using `='.
      
  
    - all_default:BOOLEAN <-
      
  
    - swap (line1, column1, depth1:INTEGER) with (line2, column2, depth2:INTEGER) <-
      
  
    - copy other:SELF <-
    
  
  
 Invariant.
  
  
  [ ...
    -? { count1 = upper1 - lower1 + 1 };
    -? { count2 = upper2 - lower2 + 1 };
    -? { count3 = upper3 - lower3 + 1 };
    -? { capacity >= count };
  ];