expanded class NATIVE_ARRAY [E_]

All features

This class gives access to the lowest level for arrays. As any low level array, you can get high performances with NATIVE_ARRAYs, but you loose most valid bounds checks (as you can do in plain C code for example).

Note: this class is the basic support for most of our high-level arrays-like classes: STRING, ARRAY, FAST_ARRAY as well as MUTABLE_BIG_INTEGER. Each class using some attribute of some NATIVE_ARRAY type needs an attribute named capacity with value set to the size of the actual NATIVE_ARRAY. Value has to be ajusted after each calloc/realloc/create_from.

Direct parents

non-conformant parents

SAFE_EQUAL

Summary

creation features

exported features

Basic features:

Comparison:

Searching:

Removing:

Replacing:

Adding:

Other:

Interfacing with other languages:

Implement manifest generic creation.

Details

element_sizeof: INTEGER

The size in number of bytes for type E_.

calloc (nb_elements: INTEGER): NATIVE_ARRAY [E_]

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].

realloc (old_nb_elts: INTEGER, new_nb_elts: INTEGER): NATIVE_ARRAY [E_]

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

memcmp (other: NATIVE_ARRAY [E_], capacity: INTEGER): BOOLEAN

True if all elements in range [0 .. capacity-1] are identical using is_equal. Assume Current and other are big enough. See also fast_memcmp.

require

  • capacity > 0 implies other.is_not_null

slice_memcmp (at: INTEGER, other: NATIVE_ARRAY [E_], other_lower: INTEGER, other_upper: INTEGER): BOOLEAN

True if all elements in range [0 .. other_upper - other_lower] are identical to the elements in range [other_lower .. other_upper] of other using is_equal. Assume Current and other are big enough. See also slice_fast_memcmp.

require

  • at >= 0
  • other_lower >= 0
  • other_upper >= other_lower - 1
  • other_upper >= other_lower implies other.is_not_null

fast_memcmp (other: NATIVE_ARRAY [E_], capacity: INTEGER): BOOLEAN

Same jobs as memcmp but uses infix "=" instead of is_equal.

require

  • capacity > 0 implies other.is_not_null

slice_fast_memcmp (at: INTEGER, other: NATIVE_ARRAY [E_], other_lower: INTEGER, other_upper: INTEGER): BOOLEAN

Same jobs as slice_memcmp but uses infix "=" instead of is_equal.

require

  • at >= 0
  • other_lower >= 0
  • other_upper >= other_lower - 1
  • other_upper >= other_lower implies other.is_not_null

deep_memcmp (other: NATIVE_ARRAY [E_], capacity: INTEGER): BOOLEAN

Same jobs as memcmp but uses is_deep_equal instead of is_equal.

require

  • capacity > 0 implies other.is_not_null

slice_deep_memcmp (at: INTEGER, other: NATIVE_ARRAY [E_], other_lower: INTEGER, other_upper: INTEGER): BOOLEAN

Same jobs as slice_memcmp but uses is_deep_equal instead of is_equal.

require

  • at >= 0
  • other_lower >= 0
  • other_upper >= other_lower - 1
  • other_upper >= other_lower implies other.is_not_null

first_index_of (element: E_, upper: INTEGER): INTEGER

Using is_equal for comparison, gives the index of the first occurrence of element at or after 0. Answer upper + 1 when the search fail. See also fast_index_of, reverse_index_of.

require

  • upper >= 0

ensure

  • Result.in_range(0, upper + 1)
  • Result <= upper implies safe_equal(element, item(Result))

index_of (element: E_, start_index: INTEGER, upper: INTEGER): INTEGER

Using is_equal for comparison, gives the index of the first occurrence of element at or after start_index. Answer upper + 1 when the search fail. See also fast_index_of, reverse_index_of.

require

  • start_index >= 0
  • start_index <= upper

ensure

  • Result.in_range(start_index, upper + 1)
  • Result <= upper implies safe_equal(element, item(Result))

reverse_index_of (element: E_, upper: INTEGER): INTEGER

Using is_equal for comparison, gives the index of the first occurrence of element at or before upper. Search is done in reverse direction, which means from upper down to the 0. Answer -1 when the search fail. See also fast_reverse_index_of, index_of.

require

  • upper >= -1

ensure

  • Result.in_range(-1, upper)
  • Result > 0 implies safe_equal(element, item(Result))

slice_index_of (element: E_, lower: INTEGER, upper: INTEGER): INTEGER
This feature is obsolete: Now use `index_of' (Oct 14th 2005).
fast_index_of (element: E_, start_index: INTEGER, upper: INTEGER): INTEGER

Using basic = for comparison, gives the index of the first occurrence of element at or after start_index. Answer upper + 1 when the search fail. See also index_of, reverse_index_of.

require

  • start_index >= 0
  • start_index <= upper

ensure

  • Result.in_range(start_index, upper + 1)
  • Result <= upper implies element = item(Result)

fast_reverse_index_of (element: E_, upper: INTEGER): INTEGER

Using basic = for comparison, gives the index of the first occurrence of element at or before upper. Search is done in reverse direction, which means from upper down to the 0. Answer -1 when the search fail. See also reverse_index_of, index_of.

require

  • upper >= -1

ensure

  • Result.in_range(-1, upper)
  • Result > 0 implies element = item(Result)

fast_first_index_of (element: E_, upper: INTEGER): INTEGER

Using basic = for comparison, gives the index of the first occurrence of element at or after 0. Answer upper + 1 when the search fail. See also fast_index_of, reverse_index_of.

require

  • upper >= 0

ensure

  • Result.in_range(0, upper + 1)
  • Result <= upper implies element = item(Result)

slice_fast_index_of (element: E_, lower: INTEGER, upper: INTEGER): INTEGER
This feature is obsolete: Now use `fast_index_of' (Oct 14th 2005).
has (element: E_, upper: INTEGER): BOOLEAN

Look for element using is_equal for comparison. Also consider fast_has to choose the most appropriate.

require

  • upper >= -1

fast_has (element: E_, upper: INTEGER): BOOLEAN

Look for element using basic = for comparison. Also consider has to choose the most appropriate.

require

  • upper >= -1

remove_first (upper: INTEGER)

Assume upper is a valid index. Move range [1 .. upper] by 1 position left.

require

  • upper >= 0

remove (index: INTEGER, upper: INTEGER)

Assume upper is a valid index. Move range [index + 1 .. upper] by 1 position left.

require

  • index >= 0
  • index <= upper

replace_all (old_value: E_, new_value: E_, 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: E_, new_value: E_, 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

copy_at (at: INTEGER, src: NATIVE_ARRAY [E_], 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: NATIVE_ARRAY [E_], src_min: INTEGER, src_max: INTEGER)
This feature is obsolete: The new name of this feature is `slice_copy' (march 5th 2004).
slice_copy (at: INTEGER, src: NATIVE_ARRAY [E_], src_min: INTEGER, src_max: INTEGER)

Copy range [src_min .. src_max] of src to range [at .. at + src_max - src_min] of Current. No subscript checking.

require

  • at >= 0
  • src_max >= src_min - 1
  • useful_work: src /= Current or at /= src_min

set_all_with (v: E_, upper: INTEGER)

Set all elements in range [0 .. upper] with value v.

require

  • upper >= -1

set_slice_with (v: E_, lower: INTEGER, upper: INTEGER)

Set all elements in range [lower .. upper] with value v.

require

  • lower >= 0
  • upper >= lower - 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: INTEGER, upper: INTEGER)

Set all elements in range [lower .. upper] with the default value.

require

  • lower >= 0
  • upper >= lower - 1

copy_from (model: NATIVE_ARRAY [E_], upper: INTEGER)

Assume upper is a valid index both in Current and model.

require

  • upper >= -1

deep_twin_from (capacity: INTEGER): NATIVE_ARRAY [E_]

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: INTEGER, upper: INTEGER, 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: E_, upper: INTEGER): INTEGER

Number of occurrences of element in range [0 .. upper] using is_equal for comparison. See also fast_occurrences to chose the apropriate one.

require

  • upper >= -1

slice_occurrences (element: E_, lower: INTEGER, upper: INTEGER): INTEGER

Number of occurrences of element in range [lower .. upper] using is_equal for comparison. See also slice_fast_occurrences to chose the apropriate one.

require

  • lower >= 0
  • upper >= lower - 1

fast_occurrences (element: E_, upper: INTEGER): INTEGER

Number of occurrences of element in range [0 .. upper] using basic "=" for comparison. See also occurrences to chose the apropriate one.

require

  • upper >= -1

slice_fast_occurrences (element: E_, lower: INTEGER, upper: INTEGER): INTEGER

Number of occurrences of element in range [lower .. upper] using basic "=" for comparison. See also slice_occurrences to chose the apropriate one.

require

  • lower >= 0
  • upper >= lower - 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

slice_default (lower: INTEGER, upper: INTEGER): BOOLEAN

Do all items in range [lower .. upper] have their type's default value? Note: for non Void items, the test is performed with the is_default predicate.

require

  • lower >= 0
  • upper >= lower - 1

to_external: POINTER

Gives access to the C pointer on the area of storage.

from_pointer (pointer: POINTER): NATIVE_ARRAY [E_]

Convert pointer into Current type.

is_not_null: BOOLEAN
is_null: BOOLEAN
manifest_make (needed_capacity: INTEGER)

Manifest creation (see also calloc and realloc for creation).

manifest_put (index: INTEGER, element: E_)
manifest_semicolon_check: BOOLEAN
test (e1: E, e2: E): BOOLEAN

In order to avoid run-time type errors, feature safe_equal calls is_equal only when e1 and e2 have exactly the same dynamic type. Furthermore, this feature avoids argument passing from some expanded type to the corresponding reference type (no automatic allocation of some reference type during the comparison).

safe_equal (e1: E, e2: E): BOOLEAN

In order to avoid run-time type errors, feature safe_equal calls is_equal only when e1 and e2 have exactly the same dynamic type. Furthermore, this feature avoids argument passing from some expanded type to the corresponding reference type (no automatic allocation of some reference type during the comparison).