note
	description: "Lists implemented by resizable arrays"
	library: "Free implementation of ELKS library"
	legal: "See notice at end of class."
	status: "See notice at end of class."
	names: sequence
	representation: array
	access: index, cursor, membership
	size: fixed
	contents: generic
	date: "$Date: 2019-06-20 20:43:33 +0000 (Thu, 20 Jun 2019) $"
	revision: "$Revision: 103306 $"

class interface
	ARRAYED_LIST [G]

create 
	make,
	make_filled,
	make_from_array,
	make_from_iterable

feature -- Initialization

	make (n: INTEGER_32)
			-- Allocate list with n items.
			-- (n may be zero for empty list.)
		require
			valid_number_of_items: n >= 0
		ensure
			correct_position: before
			is_empty: is_empty

	make_filled (n: INTEGER_32)
			-- Allocate list with n items.
			-- (n may be zero for empty list.)
			-- This list will be full.
		require
			valid_number_of_items: n >= 0
			has_default: ({G}).has_default
		ensure
			correct_position: before
			filled: full
	
feature -- Access

	area: SPECIAL [G]
			-- Access to internal storage of ARRAYED_LIST

	item: G
			-- Current item
		require else
			index_is_valid: valid_index (index)

	i_th alias "[]" (i: INTEGER_32): like item assign put_i_th
			-- Item at i-th position
			-- Was declared in ARRAYED_LIST as synonym of at.

	at alias "@" (i: INTEGER_32): like item assign put_i_th
			-- Item at i-th position
			-- Was declared in ARRAYED_LIST as synonym of i_th.

	first: like item
			-- Item at first position

	last: like first
			-- Item at last position

	index: INTEGER_32
			-- Index of item, if valid.

	cursor: ARRAYED_LIST_CURSOR
			-- Current cursor position

	has (v: like item): BOOLEAN
			-- Does current include v?
			-- (Reference or object equality,
			-- based on object_comparison.)

	to_array: ARRAY [G]
			-- Share content to be used as an ARRAY.
			-- Note that although the content is shared, it might
			-- not be shared when a resizing occur in either ARRAY or Current.
		ensure
			to_array_attached: Result /= Void
			array_lower_set: Result.lower = 1
			array_upper_set: Result.upper = count
			shared_area: Result.area = area

	new_cursor: ARRAYED_LIST_ITERATION_CURSOR [G]
			-- Fresh cursor associated with current structure
	
feature -- Iteration

	do_all (action: PROCEDURE [G])
			-- Apply action to every item, from first to last.
			-- Semantics not guaranteed if action changes the structure;
			-- in such a case, apply iterator to clone of structure instead.

	do_if (action: PROCEDURE [G]; test: FUNCTION [G, BOOLEAN])
			-- Apply action to every item that satisfies test, from first to last.
			-- Semantics not guaranteed if action or test changes the structure;
			-- in such a case, apply iterator to clone of structure instead.

	there_exists (test: FUNCTION [G, BOOLEAN]): BOOLEAN
			-- Is test true for at least one item?

	for_all (test: FUNCTION [G, BOOLEAN]): BOOLEAN
			-- Is test true for all items?

	do_all_with_index (action: PROCEDURE [G, INTEGER_32])
			-- Apply action to every item, from first to last.
			-- action receives item and its index.
			-- Semantics not guaranteed if action changes the structure;
			-- in such a case, apply iterator to clone of structure instead.
		require
			action_not_void: action /= Void

	do_if_with_index (action: PROCEDURE [G, INTEGER_32]; test: FUNCTION [G, INTEGER_32, BOOLEAN])
			-- Apply action to every item that satisfies test, from first to last.
			-- action and test receive the item and its index.
			-- Semantics not guaranteed if action or test changes the structure;
			-- in such a case, apply iterator to clone of structure instead.
		require
			action_not_void: action /= Void
			test_not_void: test /= Void
	
feature -- Measurement

	count: INTEGER_32
			-- Number of items.

	capacity: INTEGER_32
			-- Number of items that may be stored

	upper: INTEGER_32
			-- Maximum index.
			-- Use count instead.
		ensure
			definition: Result = count
	
feature -- Comparison

	is_equal (other: like Current): BOOLEAN
			-- Is array made of the same items as other?
	
feature -- Status report

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

	valid_cursor (p: CURSOR): BOOLEAN
			-- Can the cursor be moved to position p?

	valid_index (i: INTEGER_32): BOOLEAN
			-- Is i a valid index?

	is_inserted (v: G): BOOLEAN
			-- Has v been inserted at the end by the most recent put or
			-- extend?

	all_default: BOOLEAN
			-- Are all items set to default values?
		require
			has_default: ({G}).has_default
	
feature -- Cursor movement

	move (i: INTEGER_32)
			-- Move cursor i positions.

	start
			-- Move cursor to first position if any.
		ensure then
			after_when_empty: is_empty implies after

	finish
			-- Move cursor to last position if any.
		ensure then
			before_when_empty: is_empty implies before

	forth
			-- Move cursor one position forward.

	back
			-- Move cursor one position backward.

	go_i_th (i: INTEGER_32)
			-- Move cursor to i-th position.

	go_to (p: CURSOR)
			-- Move cursor to position p.

	search (v: like item)
			-- Move to first position (at or after current
			-- position) where item and v are equal.
			-- If structure does not include v ensure that
			-- exhausted will be true.
			-- (Reference or object equality,
			-- based on object_comparison.)
	
feature -- Element change

	put_front (v: like item)
			-- Add v to the beginning.
			-- Do not move cursor.

	put_i_th (v: like i_th; i: INTEGER_32)
			-- Replace i-th entry, if in index interval, by v.

	force (v: like item)
			-- Add v to end.
			-- Do not move cursor.
			-- Was declared in ARRAYED_LIST as synonym of extend.

	extend (v: like item)
			-- Add v to end.
			-- Do not move cursor.
			-- Was declared in ARRAYED_LIST as synonym of force.

	put_left (v: like item)
			-- Add v to the left of current position.
			-- Do not move cursor.

	put_right (v: like item)
			-- Add v to the right of current position.
			-- Do not move cursor.

	replace (v: like first)
			-- Replace current item by v.

	merge_left (other: ARRAYED_LIST [G])
			-- Merge other into current structure before cursor.

	merge_right (other: ARRAYED_LIST [G])
			-- Merge other into current structure after cursor.

	append (s: SEQUENCE [G])
			-- Append a copy of s.
	
feature -- Resizing

	grow (i: INTEGER_32)
			-- Change the capacity to at least i.

	resize (new_capacity: INTEGER_32)
			-- Resize list so that it can contain
			-- at least n items. Do not lose any item.
		require
			resizable: resizable
			new_capacity_large_enough: new_capacity >= capacity
		ensure
			capacity_set: capacity >= new_capacity

	trim
			-- Decrease capacity to the minimum value.
			-- Apply to reduce allocated storage.
		ensure then
			same_items: to_array.same_items (old to_array)
	
feature -- Duplication

	copy (other: like Current)
			-- Reinitialize by copying all the items of other.
			-- (This is also used by clone.)
		ensure then
			equal_areas: area_v2 ~ other.area_v2
	
feature -- Removal

	prune (v: like item)
			-- Remove first occurrence of v, if any,
			-- after cursor position.
			-- Move cursor to right neighbor.
			-- (or after if no right neighbor or v does not occur)

	remove
			-- Remove current item.
			-- Move cursor to right neighbor
			-- (or after if no right neighbor)
		ensure then
			index: index = old index

	remove_i_th (i: INTEGER_32)
			-- Remove item at index i.
			-- Move cursor to next neighbor (or after if no next neighbor) if it is at i-th position.
			-- Do not change cursor otherwise.

	prune_all (v: like item)
			-- Remove all occurrences of v.
			-- (Reference or object equality,
			-- based on object_comparison.)
		ensure then
			is_after: after

	remove_left
			-- Remove item to the left of cursor position.
			-- Do not move cursor.

	remove_right
			-- Remove item to the right of cursor position
			-- Do not move cursor

	wipe_out
			-- Remove all items.
	
feature -- Transformation

	swap (i: INTEGER_32)
			-- Exchange item at i-th position with item
			-- at cursor position.
	
feature -- Retrieval

	correct_mismatch
			-- Attempt to correct object mismatch using Mismatch_information.
	
invariant
	prunable: prunable
	starts_from_one: Lower = 1

note
	ca_ignore: "CA033", "CA033: very large class"
	copyright: "Copyright (c) 1984-2019, Eiffel Software and others"
	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
		Eiffel Software
		5949 Hollister Ave., Goleta, CA 93117 USA
		Telephone 805-685-1006, Fax 805-685-6869
		Website http://www.eiffel.com
		Customer support http://support.eiffel.com
	]"

end -- class ARRAYED_LIST

Generated by ISE EiffelStudio