19928/jj_containers/jj_arrayed_list.e
Jocelyn Fiat 6dde6425c2 init
2024-06-17 09:09:33 +02:00

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