ANY NONE
expanded class interface NATIVE_ARRAY[E]
   --
   -- This class gives access to the lowest level for arrays both for the C
   -- language and for the Java language.
   --
   -- Warning: GURUS ONLY!! Using this class makes your Eiffel code non portable
   -- on other Eiffel systems. This class may also be modified in further release
   -- for a better interoperability between Java and C low level arrays.
   --
   -- Each class using some attribute of NATIVE_ARRAY type need an attribute
   -- named capacity with value set to the size of the NATIVE_ARRAY. Value
   -- has to be ajusted after each calloc/realloc/create_from.
   --

feature(s) from NATIVE_ARRAY
   -- Basic features:

   element_sizeof: INTEGER
      -- The size in number of bytes for type E.

   calloc (nb_elements: INTEGER): like Current
      -- Allocate a new array of nb_elements of type E.
      -- The new array is initialized with default values.
      require
         nb_elements > 0
      ensure
         Result.all_default(nb_elements - 1)

   item (index: INTEGER): E
      -- To read an item.
      -- Assume that calloc is already done and that index
      -- is the range [0 .. nb_elements-1].

   put (element: E; index: INTEGER)
      -- To write an item.
      -- Assume that calloc is already done and that index
      -- is the range [0 .. nb_elements-1].

feature(s) from NATIVE_ARRAY
   realloc (old_nb_elts, new_nb_elts: INTEGER): like Current
      -- Assume Current is a valid NATIVE_ARRAY in range
      -- [0 .. old_nb_elts-1]. Allocate a bigger new array in
      -- range [0 .. new_nb_elts-1].
      -- Old range is copied in the new allocated array.
      -- New items are initialized with default values.
      require
         is_not_null;
         old_nb_elts > 0;
         old_nb_elts < new_nb_elts
      ensure
         Result.is_not_null

feature(s) from NATIVE_ARRAY
   -- Comparison:

   memcmp (other: like Current; capacity: INTEGER): BOOLEAN
      -- True if all elements in range [0..capacity-1] are
      -- identical using equal. Assume Current and other
      -- are big enough.
      -- See also fast_memcmp.
      require
         capacity > 0 implies other.is_not_null

   fast_memcmp (other: like Current; capacity: INTEGER): BOOLEAN
      -- Same jobs as memcmp but uses infix "=" instead equal.
      require
         capacity > 0 implies other.is_not_null

   deep_memcmp (other: like Current; capacity: INTEGER): BOOLEAN
      -- Same jobs as memcmp but uses is_deep_equal instead equal.

feature(s) from NATIVE_ARRAY
   -- Searching:

   index_of (element: like item; upper: INTEGER): INTEGER
      -- Give the index of the first occurrence of element using
      -- is_equal for comparison.
      -- Answer upper + 1 when element is not inside.
      require
         upper >= -1

   fast_index_of (element: like item; upper: INTEGER): INTEGER
      -- Same as index_of but use basic = for comparison.
      require
         upper >= -1

   has (element: like item; upper: INTEGER): BOOLEAN
      -- Look for element using is_equal for comparison.
      -- Also consider has to choose the most appropriate.
      require
         upper >= -1

   fast_has (element: like item; upper: INTEGER): BOOLEAN
      -- Look for element using basic = for comparison.
      -- Also consider has to choose the most appropriate.
      require
         upper >= -1

feature(s) from NATIVE_ARRAY
   -- Removing:

   remove_first (upper: INTEGER)
      -- Assume upper is a valid index.
      -- Move range [1 .. upper] by 1 position left.
      require
         upper >= 0

   remove (index, upper: INTEGER)
      -- Assume upper is a valid index.
      -- Move range [index + 1 .. upper] by 1 position left.
      require
         index >= 0;
         index <= upper

feature(s) from NATIVE_ARRAY
   -- Replacing:

   replace_all (old_value, new_value: like item; upper: INTEGER)
      -- Replace all occurrences of the element old_value by new_value
      -- using is_equal for comparison.
      -- See also fast_replace_all to choose the apropriate one.
      require
         upper >= -1

   fast_replace_all (old_value, new_value: like item; upper: INTEGER)
      -- Replace all occurrences of the element old_value by new_value
      -- using basic = for comparison.
      -- See also replace_all to choose the apropriate one.
      require
         upper >= -1

feature(s) from NATIVE_ARRAY
   -- Adding:

   copy_at (at: INTEGER; src: like Current; src_capacity: INTEGER)
      -- Copy range [0 .. src_capacity - 1] of src to range
      -- [at .. at + src_capacity - 1] of Current.
      -- No subscript checking.
      require
         at >= 0;
         src_capacity >= 0

   copy_slice (at: INTEGER; src: like Current; src_min, src_max: INTEGER)
      -- Copy range [src_min .. src_max] of src to range
      -- [at .. at + src_max - src_min - 1] of Current.
      -- No subscript checking.
      require
         at >= 0;
         src_min <= src_max + 1

feature(s) from NATIVE_ARRAY
   -- Other:

   set_all_with (v: like item; upper: INTEGER)
      -- Set all elements in range [0 .. upper] with
      -- value v.
      require
         upper >= -1

   clear_all (upper: INTEGER)
      -- Set all elements in range [0 .. upper] with
      -- the default value.
      require
         upper >= -1
      ensure
         all_default(upper)

   clear (lower, upper: INTEGER)
      -- Set all elements in range [lower .. upper] with
      -- the default value
      require
         lower >= 0;
         upper >= lower - 1

   copy_from (model: like Current; upper: INTEGER)
      -- Assume upper is a valid index both in Current and model.
      require
         upper >= -1

   deep_twin_from (capacity: INTEGER): like Current
      -- To implement deep_twin. Allocate a new array of capacity 
      -- initialized  with deep_twin. Assume capacity is valid both in 
      -- Current and model.
      require
         capacity >= 0

   move (lower, upper, offset: INTEGER)
      -- Move range [lower .. upper] by offset positions.
      -- Freed positions are not initialized to default values.
      require
         lower >= 0;
         upper >= lower;
         lower + offset >= 0

   occurrences (element: like item; upper: INTEGER): INTEGER
      -- Number of occurrences of element in range [0..upper]
      -- using equal for comparison.
      -- See also fast_occurrences to chose the apropriate one.
      require
         upper >= -1

   fast_occurrences (element: like item; upper: INTEGER): INTEGER
      -- Number of occurrences of element in range [0..upper]
      -- using basic "=" for comparison.
      -- See also fast_occurrences to chose the apropriate one.
      require
         upper >= -1

   all_default (upper: INTEGER): BOOLEAN
      -- Do all items in range [0 .. upper] have their type's
      -- default value?
      -- Note: for non Void items, the test is performed with the 
      -- is_default predicate.
      require
         upper >= -1

feature(s) from NATIVE_ARRAY
   -- Interfacing with C:

   to_external: POINTER
      -- Gives access to the C pointer on the area of storage.

   from_pointer (pointer: POINTER): like Current
      -- Convert pointer into Current type.

   is_not_null: BOOLEAN

   is_null: BOOLEAN



end of expanded NATIVE_ARRAY[E]