work in progress | array

Class ARRAY

ISE Eiffel 4.5


indexing
        description: "Sequences of values, all of the same type or of a conforming one, accessible through integer indices in a contiguous interval"
        status: "See notice at end of class"
        date: "$Date: 2002/01/31 11:04:55 $"
        revision: "$Revision: 1.1 $"

class interface
        ARRAY [G]

create 

        make (minindex, maxindex: INTEGER)
                        -- Allocate array; set index interval to
                        -- minindex .. maxindex; set all values to default.
                        -- (Make array empty if minindex = maxindex + 1).
                require
                        valid_indices: minindex <= maxindex or (minindex = maxindex + 1)
                ensure
                        lower = minindex;
                        upper = maxindex

feature -- Initialization

        make (minindex, maxindex: INTEGER)
                        -- Allocate array; set index interval to
                        -- minindex .. maxindex; set all values to default.
                        -- (Make array empty if minindex = maxindex + 1).
                require
                        valid_indices: minindex <= maxindex or (minindex = maxindex + 1)
                ensure
                        lower = minindex;
                        upper = maxindex

        make_from_array (a: ARRAY [G])
                        -- Initialize from the items of a.
                        -- (Useful in proper descendants of class ARRAY,
                        -- to initialize an array-like object from a manifest array.)
                require
                        array_exists: a /= void
        
feature -- Access

        area: SPECIAL [G]
                        -- Special data zone
                        -- (from TO_SPECIAL)

        entry (i: INTEGER): G
                        -- Entry at index i, if in index interval
                require
                        valid_key: valid_index (i)

        has (v: G): BOOLEAN
                        -- Does v appear in array?
                        -- (Reference or object equality,
                        -- based on object_comparison.)
                ensure -- from CONTAINER
                        not_found_in_empty: Result implies not empty

        frozen item (i: INTEGER): G
                        -- Entry at index i, if in index interval
                        -- Was declared in ARRAY as synonym of item and @.
                require -- from TABLE
                        valid_key: valid_index (k)

        frozen infix "@" (i: INTEGER): G
                        -- Entry at index i, if in index interval
                        -- Was declared in ARRAY as synonym of item and @.
                require -- from TABLE
                        valid_key: valid_index (k)
        
feature -- Measurement

        additional_space: INTEGER
                        -- Proposed number of additional items
                        -- (from RESIZABLE)
                ensure -- from RESIZABLE
                        at_least_one: Result >= 1

        capacity: INTEGER
                        -- Number of available indices
                        -- Was declared in ARRAY as synonym of count and capacity.

        count: INTEGER
                        -- Number of available indices
                        -- Was declared in ARRAY as synonym of count and capacity.

        Growth_percentage: INTEGER is 50
                        -- Percentage by which structure will grow automatically
                        -- (from RESIZABLE)

        index_set: INTEGER_INTERVAL
                        -- Range of acceptable indexes
                ensure -- from INDEXABLE
                        not_void: Result /= void
                ensure then
                        same_count: Result.count = count;
                        same_bounds: ((Result.lower = lower) and (Result.upper = upper))

        lower: INTEGER
                        -- Minimum index

        Minimal_increase: INTEGER is 5
                        -- Minimal number of additional items
                        -- (from RESIZABLE)

        occurrences (v: G): INTEGER
                        -- Number of times v appears in structure
                ensure -- from BAG
                        non_negative_occurrences: Result >= 0

        upper: INTEGER
                        -- Maximum index
        
feature -- Comparison

        is_equal (other: like Current): BOOLEAN
                        -- Is array made of the same items as other?
                require -- from GENERAL
                        other_not_void: other /= void
                ensure -- from GENERAL
                        symmetric: Result implies other.is_equal (Current);
                        consistent: standard_is_equal (other) implies Result
        
feature -- Status report

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

        changeable_comparison_criterion: BOOLEAN
                        -- May object_comparison be changed?
                        -- (Answer: yes by default.)
                        -- (from CONTAINER)

        empty: BOOLEAN
                        -- Is structure empty?
                        -- (from FINITE)

        extendible: BOOLEAN
                        -- May items be added?
                        -- (Answer: no, although array may be resized.)

        full: BOOLEAN
                        -- Is structure filled to capacity? (Answer: yes)

        object_comparison: BOOLEAN
                        -- Must search operations use equal rather than =
                        -- for comparing references? (Default: no, use =.)
                        -- (from CONTAINER)

        prunable: BOOLEAN
                        -- May items be removed? (Answer: no.)

        resizable: BOOLEAN
                        -- May capacity be changed? (Answer: yes.)
                        -- (from RESIZABLE)

        valid_index (i: BOOLEAN
                        -- Is i within the bounds of the array?
                ensure then -- from INDEXABLE
                        only_if_in_index_set: Result implies ((i >= index_set.lower) and (i <= index_set.upper))
        
feature -- Status setting

        compare_objects
                        -- Ensure that future search operations will use equal
                        -- rather than = for comparing references.
                        -- (from CONTAINER)
                require -- from CONTAINER
                        changeable_comparison_criterion
                ensure -- from CONTAINER
                        object_comparison

        compare_references
                        -- Ensure that future search operations will use =
                        -- rather than equal for comparing references.
                        -- (from CONTAINER)
                require -- from CONTAINER
                        changeable_comparison_criterion
                ensure -- from CONTAINER
                        reference_comparison: not object_comparison
        
feature -- Element change

        enter (v: like item; i: INTEGER)
                        -- Replace i-th entry, if in index interval, by v.
                        -- Was declared in ARRAY as synonym of put and enter.

        fill (other: CONTAINER [G])
                        -- Fill with as many items of other as possible.
                        -- The representations of other and current structure
                        -- need not be the same.
                        -- (from COLLECTION)
                require -- from COLLECTION
                        other_not_void: other /= void;
                        extendible

        force (v: like item; i: INTEGER)
                        -- Assign item v to i-th entry.
                        -- Always applicable: resize the array if i falls out of
                        -- currently defined bounds; preserve existing items.
                ensure
                        inserted: item (i) = v;
                        higher_count: count >= old count

        frozen put (v: like item; i: INTEGER)
                        -- Replace i-th entry, if in index interval, by v.
                        -- Was declared in ARRAY as synonym of put and enter.
                require -- from TABLE
                        valid_key: valid_index (k)
                ensure then -- from INDEXABLE
                        insertion_done: item (k) = v

        subcopy (other: like Current; start_pos, end_pos, index_pos: INTEGER)
                        -- Copy items of other within bounds start_pos and end_pos
                        -- to current array starting at index index_pos.
                require
                        other_not_void: other /= void;
                        valid_start_pos: other.valid_index (start_pos);
                        valid_end_pos: other.valid_index (end_pos);
                        valid_bounds: (start_pos <= end_pos) or (start_pos = end_pos + 1);
                        valid_index_pos: valid_index (index_pos);
                        enough_space: (upper - index_pos) >= (end_pos - start_pos)
        
feature -- Removal

        clear_all
                        -- Reset all items to default values.
                ensure
                        all_cleared: all_cleared

        discard_items
                        -- Reset all items to default values with reallocation.
                ensure
                        all_cleared: all_cleared

        prune_all (v: G)
                        -- Remove all occurrences of v.
                        -- (Reference or object equality,
                        -- based on object_comparison.)
                        -- (from COLLECTION)
                require -- from COLLECTION
                        prunable
                ensure -- from COLLECTION
                        no_more_occurrences: not has (v)
        
feature -- Resizing

        automatic_grow
                        -- Change the capacity to accommodate at least
                        -- Growth_percentage more items.
                        -- (from RESIZABLE)
                ensure -- from RESIZABLE
                        increased_capacity: capacity >= old capacity + old capacity * growth_percentage // 100

        grow (i: INTEGER)
                        -- Change the capacity to at least i.
                ensure -- from RESIZABLE
                        new_capacity: capacity >= i

        resize (minindex, maxindex: INTEGER)
                        -- Rearrange array so that it can accommodate
                        -- indices down to minindex and up to maxindex.
                        -- Do not lose any previously entered item.
                require
                        good_indices: minindex <= maxindex
                ensure
                        no_low_lost: lower = minindex or else lower = old lower;
                        no_high_lost: upper = maxindex or else upper = old upper
        
feature -- Conversion

        linear_representation: LINEAR [G]
                        -- Representation as a linear structure

        to_c: ANY
                        -- Address of actual sequence of values,
                        -- for passing to external (non-Eiffel) routines.
        
feature -- Duplication

        copy (other: like Current)
                        -- Reinitialize by copying all the items of other.
                        -- (This is also used by clone.)
                require -- from GENERAL
                        other_not_void: other /= void;
                        type_identity: same_type (other)
                ensure -- from GENERAL
                        is_equal: is_equal (other)
                ensure then
                        equal_areas: area.is_equal (other.area)

        subarray (start_pos, end_pos: INTEGER): like Current
                        -- Array made of items of current array within
                        -- bounds start_pos and end_pos.
                require
                        valid_start_pos: valid_index (start_pos);
                        valid_end_pos: valid_index (end_pos);
                        valid_bounds: (start_pos <= end_pos) or (start_pos = end_pos + 1)
                ensure
                        lower: Result.lower = start_pos;
                        upper: Result.upper = end_pos
        
invariant

                -- from GENERAL
        reflexive_equality: standard_is_equal (Current);
        reflexive_conformance: conforms_to (Current);
        consistent_size: capacity = upper - lower + 1;
        non_negative_count: count >= 0;
        index_set_has_same_count: index_set.count = count;
                -- from RESIZABLE
        increase_by_at_least_one: minimal_increase >= 1;
                -- from BOUNDED
        valid_count: count <= capacity;
        full_definition: full = (count = capacity);
                -- from FINITE
        empty_definition: empty = (count = 0);
        non_negative_count: count >= 0;
                -- from INDEXABLE
        index_set_not_void: index_set /= void;

end -- class ARRAY