note
	description: "[
		Equivalent of HASH_TABLE [NATURAL_32, ANY], since this type cannot be written
		as ANY does not inherit from HASHABLE
	]"
	legal: "See notice at end of class."
	status: "See notice at end of class."
	date: "$Date: 2018-01-22 11:21:50 +0000 (Mon, 22 Jan 2018) $"
	revision: "$Revision: 101254 $"

class 
	SED_OBJECTS_TABLE

inherit
	SED_ABSTRACT_OBJECTS_TABLE
		undefine
			copy,
			is_equal
		end

	HASH_TABLE [NATURAL_32, POINTER]
		rename
			make as table_make,
			capacity as table_capacity,
			count as capacity,
			wipe_out as table_wipe_out
		export
			{SED_OBJECTS_TABLE} all
		redefine
			hash_code_of
		end

create 
	make


create {SED_OBJECTS_TABLE}
	table_make

feature {NONE} -- Initialization

	make (n: NATURAL_32)
			-- Initialize current instance
		do
			table_make (n.to_integer_32)
			last_index := 0
		end
	
feature -- Access

	index (an_obj: separate ANY): NATURAL_32
			-- Index of an_obj in Current
		local
			hash_value, increment, l_pos, l_new_pos, l_item_pos, l_capacity: INTEGER_32
			stop: INTEGER_32
			l_keys: like keys
			l_indexes: like indexes_map
			l_key: POINTER
		do
			from
				l_key := $an_obj.to_pointer
				l_keys := keys
				l_indexes := indexes_map
				l_capacity := table_capacity
				stop := l_capacity
				hash_value := hash_code_of (l_key)
				increment := 1 + hash_value \\ (l_capacity - 1)
				l_item_pos := (hash_value \\ l_capacity) - increment
			until
				stop = 0
			loop
				l_item_pos := (l_item_pos + increment) \\ l_capacity
				l_pos := l_indexes [l_item_pos]
				if l_pos >= 0 and then l_keys.item (l_pos) = l_key then
					stop := 1
					Result := content.item (l_pos)
				elseif l_pos = Ht_impossible_position then
					stop := 1
					Result := last_index + 1
					last_index := Result
					l_new_pos := l_keys.count
					if l_new_pos < l_keys.capacity then
						l_indexes.put (l_new_pos, l_item_pos);
						content.force (Result, l_new_pos);
						l_keys.force ($an_obj.to_pointer, l_new_pos)
						capacity := capacity + 1
					else
						put (Result, l_key)
					end
				end
				stop := stop - 1
			end
		end
	
feature -- Removal

	wipe_out
			-- Remove all items.
		do
			last_index := 0
			table_wipe_out
		end
	
feature -- Implementation

	hash_code_of (p: POINTER): INTEGER_32
			-- Efficient implementation of {POINTER}.hash_code where we assume that POINTER
			-- values are aligned to the size of the POINTER, this will reduce the number
			-- of conflicts.
		do
			Result := c_hash_code_of (p)
		end

	c_hash_code_of (p: POINTER): INTEGER_32
			-- C implementation of hash_code_of.
		external
			"C inline"
		alias
			"return (EIF_INTEGER_32) (0x7FFFFFF & (((rt_uint_ptr) $p) / sizeof(rt_uint_ptr)));"
		end
	
invariant
	not_is_dotnet: not {PLATFORM}.is_dotnet

note
	library: "EiffelBase: Library of reusable components for Eiffel."
	copyright: "Copyright (c) 1984-2018, Eiffel Software and others"
	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
		Eiffel Software
		5949 Hollister Ave., Goleta, CA 93117 USA
		Telephone 805-685-1006, Fax 805-685-6869
		Website http://www.eiffel.com
		Customer support http://support.eiffel.com
	]"

end -- class SED_OBJECTS_TABLE

Generated by ISE EiffelStudio