class EL_CONFORMING_INSTANCE_TABLE
Client examples: BASE_AUTOTEST_APP ; STRING_ITERATION_CURSOR_TABLE
Map an array of base types to associated shared objects to function as an alternative to the following kind of **elseif* branching:
if attached {TYPE_A} obj then Result := thing_for_type_a elseif attached {TYPE_B} obj then Result := thing_for_type_b elseif attached {TYPE_C} obj then Result := thing_for_type_c end
Benchmark IF_ATTACHED_ITEM_VS_CONFORMING_INSTANCE_TABLE shows this is about 31% slower than equivalent branching attachment attempts.
note
description: "[
Map an array of base types to associated shared objects to function as an alternative
to the following kind of **elseif* branching:
if attached {TYPE_A} obj then
Result := thing_for_type_a
elseif attached {TYPE_B} obj then
Result := thing_for_type_b
elseif attached {TYPE_C} obj then
Result := thing_for_type_c
end
]"
notes: "[
Benchmark ${IF_ATTACHED_ITEM_VS_CONFORMING_INSTANCE_TABLE} shows this is about
31% slower than equivalent branching attachment attempts.
]"
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-09-22 13:48:18 GMT (Sunday 22nd September 2024)"
revision: "4"
class
EL_CONFORMING_INSTANCE_TABLE [G]
inherit
EL_HASH_TABLE [G, INTEGER]
rename
make as make_table
end
create
make
feature {NONE} -- Initialization
make (array: like type_mapping_array)
--
do
make_table (array.count)
type_mapping_array := array
end
feature -- Status query
has_related (object: ANY): BOOLEAN
local
type_id: INTEGER; type_conforms: BOOLEAN
do
type_id := {ISE_RUNTIME}.dynamic_type (object)
if has_key (type_id) then
Result := True
else
across type_mapping_array as array until type_conforms loop
if attached array.item as map then
if {ISE_RUNTIME}.type_conforms_to (type_id, map.parent_type.type_id) then
put (map.instance, type_id) -- `found_item' now `True'
type_conforms := True
end
end
end
Result := type_conforms
end
end
feature {NONE} -- Internal attributes
type_mapping_array: ARRAY [TUPLE [parent_type: TYPE [ANY]; instance: G]]
end