class EL_NAMEABLES_LIST
Client examples: BASE_AUTOTEST_APP ; HASH_TABLE_VS_NAMEABLES_LIST_SEARCH
List of items conforming to EL_NAMEABLE [READABLE_STRING_GENERAL] and searchable by item name
Benchmarks show that for small lists the search performance is almost identical to a hash table.
note
	description: "List of items conforming to ${EL_NAMEABLE [READABLE_STRING_GENERAL]} and searchable by item name"
	notes: "[
		Benchmarks show that for small lists the search performance is almost identical to a hash table.
	]"
	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-08-24 17:01:22 GMT (Saturday 24th August 2024)"
	revision: "6"
		
		class
	EL_NAMEABLES_LIST [G -> EL_NAMEABLE [READABLE_STRING_GENERAL]]
inherit
	EL_ARRAYED_LIST [G]
		rename
			make as make_with_count,
			search as item_search,
			item as found_item
		export
			{NONE} all
			{ANY} found_item
		end
create
	make
feature {NONE} -- Initialization
	make (array: ARRAY [G])
		local
			l_found: BOOLEAN
		do
			if array.is_empty then
				create index_array.make_empty
			else
				create index_array.make_filled (array.item (1).name, 1, array.count)
			end
			index_array.sort
			make_with_count (array.count)
			across index_array as name loop
				l_found := False
				across array as named until found loop
					if named.item.name ~ name.item then
						extend (named.item)
						l_found := True
					end
				end
			end
		ensure then
			indexed: across index_array as name all i_th (name.cursor_index).name ~ name.item end
		end
feature -- Status query
	has_name (name: like found_item.name): BOOLEAN
		do
			search (name)
			Result := found
		end
feature -- Cursor movement
	search (name: like found_item.name)
		do
			index_array.binary_search (name)
			if index_array.found then
				go_i_th (index_array.found_index)
			else
				finish; forth
			end
		end
feature {NONE} -- Internal attributes
	index_array: SORTABLE_ARRAY [like found_item.name]
end