class EL_ARRAYED_COMPACT_INTERVAL_LIST
Client examples: ARRAYED_INTERVAL_LIST_COMPARISON ; BASE_AUTOTEST_APP
Alternative implementation of EL_ARRAYED_INTERVAL_LIST by bit-shifting each 32-bit upper and lower into a INTEGER_64. Turns out to be not as efficient as using a SPECIAL [INTEGER_32] with twice as many items.
note
description: "[
Alternative implementation of ${EL_ARRAYED_INTERVAL_LIST} by bit-shifting each 32-bit upper and lower
into a ${INTEGER_64}. Turns out to be not as efficient as using a ${SPECIAL [INTEGER_32]}
with twice as many items.
]"
author: "Finnian Reilly"
copyright: "Copyright (c) 2001-2022 Finnian Reilly"
contact: "finnian at eiffel hyphen loop dot com"
license: "MIT license (See: en.wikipedia.org/wiki/MIT_License)"
date: "2024-01-20 19:18:24 GMT (Saturday 20th January 2024)"
revision: "8"
class
EL_ARRAYED_COMPACT_INTERVAL_LIST
inherit
EL_ARRAYED_LIST [INTEGER_64]
rename
extend as item_extend,
replace as item_replace,
put_i_th as put_i_th_interval
redefine
out
end
create
make, make_empty
feature -- Access
first_count: INTEGER
local
l_first: like first
do
l_first := first
Result := upper_integer (l_first) - lower_integer (l_first) + 1
end
first_lower: INTEGER
do
Result := lower_integer (first)
end
first_upper: INTEGER
do
Result := upper_integer (first)
end
i_th_count (i: INTEGER): INTEGER
local
l_item: like item
do
l_item := i_th (i)
Result := upper_integer (l_item) - lower_integer (l_item) + 1
end
i_th_lower (i: INTEGER): INTEGER
do
Result := lower_integer (i_th (i))
end
i_th_upper (i: INTEGER): INTEGER
do
Result := upper_integer (i_th (i))
end
item_count: INTEGER
local
l_item: like item
do
l_item := item
Result := upper_integer (l_item) - lower_integer (l_item) + 1
end
item_interval: INTEGER_INTERVAL
do
Result := item_lower |..| item_upper
end
item_lower: INTEGER
do
Result := lower_integer (item)
end
item_upper: INTEGER
do
Result := upper_integer (item)
end
last_count: INTEGER
local
l_last: like last
do
l_last := last
Result := upper_integer (l_last) - lower_integer (l_last) + 1
end
last_lower: INTEGER
do
Result := lower_integer (last)
end
last_upper: INTEGER
do
Result := upper_integer (last)
end
out: STRING
local
l_area: like area; i, l_count: INTEGER; l_item: like item
do
create Result.make (8 * count)
l_area := area; l_count := l_area.count
from until i = l_count loop
l_item := l_area [i]
if not Result.is_empty then
Result.append (", ")
end
Result.append_character ('[')
Result.append_integer (lower_integer (l_item))
Result.append_character (':')
Result.append_integer (upper_integer (l_item))
Result.append_character (']')
i := i + 1
end
end
feature -- Measurement
count_sum: INTEGER
local
l_area: like area; i, l_count: INTEGER; l_item: like item
do
l_area := area; l_count := l_area.count
from until i = l_count loop
l_item := l_area [i]
Result := Result + upper_integer (l_item) - lower_integer (l_item) + 1
i := i + 1
end
end
feature -- Status query
item_has (n: INTEGER): BOOLEAN
local
l_item: like item
do
l_item := item
Result := lower_integer (l_item) <= n and then n <= upper_integer (l_item)
end
feature -- Element change
extend (a_lower, a_upper: INTEGER)
do
item_extend (new_item (a_lower, a_upper))
ensure
lower_extended: a_lower = last_lower
upper_extended: a_upper = last_upper
end
extend_upper (a_upper: INTEGER)
local
l_last: like last
do
if is_empty then
extend (a_upper, a_upper)
else
l_last := last
if upper_integer (l_last) + 1 = a_upper then
finish; item_replace (l_last + 1)
else
extend (a_upper, a_upper)
end
end
end
put_i_th (a_lower, a_upper, i: INTEGER)
require
valid_index: valid_index (i)
do
put_i_th_interval (a_lower.to_integer_64 |<< 32 | a_upper, i)
end
replace (a_lower, a_upper: INTEGER)
do
item_replace (a_lower.to_integer_64 |<< 32 | a_upper)
end
remove_item_head (n: INTEGER)
require
not_off: not off
within_limits: 0 <= n and n <= item_count
do
replace (item_lower + n, item_upper)
end
feature -- Factory
new_item (a_lower, a_upper: INTEGER): like item
do
Result := a_lower.to_integer_64 |<< 32 | a_upper
end
feature {NONE} -- Implementation
lower_integer (a_item: like item): INTEGER
do
Result := (a_item |>> 32).to_integer_32
end
upper_integer (a_item: like item): INTEGER
do
Result := a_item.to_integer_32
end
end