149 lines
3.1 KiB
Plaintext
149 lines
3.1 KiB
Plaintext
note
|
|
description: "[
|
|
An {ARRAYED_LIST} but with feature `prune' changed to remove the first
|
|
occurance of an item after the *beginning* of the list instead of after
|
|
the current cursor postion.
|
|
]"
|
|
author: "Jimmy J. Johnson"
|
|
date: "10/27/21"
|
|
copyright: "Copyright (c) 2021, Jimmy J. Johnson"
|
|
license: "Eiffel Forum v2 (http://www.eiffel.com/licensing/forum.txt)"
|
|
|
|
class
|
|
JJ_ARRAYED_LIST [G]
|
|
|
|
inherit
|
|
|
|
ARRAYED_LIST [G]
|
|
rename
|
|
replace as list_replace,
|
|
after as is_after, -- I just don't like the original names
|
|
before as is_before,
|
|
full as is_full
|
|
redefine
|
|
prune, -- to prune from beginning of list
|
|
array_item
|
|
select
|
|
prune
|
|
end
|
|
|
|
ARRAYED_LIST [G]
|
|
rename
|
|
prune as prune_ise, -- to keep the original version
|
|
replace as list_replace,
|
|
after as is_after,
|
|
before as is_before,
|
|
full as is_full
|
|
redefine
|
|
array_item
|
|
end
|
|
|
|
create
|
|
make, make_filled
|
|
|
|
feature -- Access
|
|
|
|
as_set: JJ_ARRAYED_SET [G]
|
|
-- The set of items in Current.
|
|
local
|
|
i: INTEGER
|
|
do
|
|
create Result.make (count)
|
|
from i := 1
|
|
until i > count
|
|
loop
|
|
Result.extend (i_th (i))
|
|
i := i + 1
|
|
end
|
|
end
|
|
|
|
feature -- Basic operations
|
|
|
|
prune (a_item: like item)
|
|
-- Remove first occurance of `a_item' starting at the first item.
|
|
-- Move cursor to right neighbor.
|
|
-- (or `after' if no right neighbor or if `a_item' does not occur).
|
|
do
|
|
start
|
|
Precursor {ARRAYED_LIST} (a_item)
|
|
end
|
|
|
|
replace (a_item, a_new_item: like item)
|
|
-- Remove `a_item' and insert `a_new_item'.
|
|
require
|
|
item_exists: a_item /= Void
|
|
new_item_exists: a_new_item /= Void
|
|
has_item: has (a_item)
|
|
local
|
|
i: INTEGER
|
|
do
|
|
i := index
|
|
start
|
|
search (a_item)
|
|
check
|
|
object_found: object_comparison implies a_item ~ item
|
|
item_found: not object_comparison implies a_item = item
|
|
-- because of pecondition "has_item"
|
|
end
|
|
list_replace (a_new_item)
|
|
go_i_th (i)
|
|
ensure
|
|
has_new_item: has (a_new_item)
|
|
count_same: count = old count
|
|
end
|
|
|
|
feature -- Status report
|
|
|
|
is_all_same: BOOLEAN
|
|
-- Are all the elements in Current equivalent?
|
|
-- Uses object comparison to check sameness.
|
|
local
|
|
i: INTEGER_32
|
|
a: G
|
|
do
|
|
-- Simple check if all are same as the first.
|
|
-- Assume true until finding a contradiction
|
|
a := at (i)
|
|
Result := True
|
|
from i := 2
|
|
until not Result or else i > count
|
|
loop
|
|
Result := a ~ at (i)
|
|
i := i + 1
|
|
end
|
|
end
|
|
|
|
is_all_different: BOOLEAN
|
|
-- Are all the elements in Current different from each other?
|
|
-- Uses object comparison not reference comparison
|
|
local
|
|
i, j: INTEGER_32
|
|
a: G
|
|
do
|
|
-- Must check all against each of the others.
|
|
-- Assume true until finding two that are the same.
|
|
Result := True
|
|
from i := 1
|
|
until not Result or else i > count
|
|
loop
|
|
from j := i + 1
|
|
until not Result or else j > count
|
|
loop
|
|
Result := not (a ~ at (i))
|
|
j := j + 1
|
|
end
|
|
i := i + 1
|
|
end
|
|
end
|
|
|
|
feature {NONE} -- Implementation
|
|
|
|
array_item (i: INTEGER): like item
|
|
-- Entry at index `i', if in index interval.
|
|
-- Redefined to make result type "like item" instead of type G.
|
|
do
|
|
Result := Precursor {ARRAYED_LIST} (i)
|
|
end
|
|
|
|
end
|