indexing
	description: "Command manager which is able to retrieve the command associated to a Windows message."
	status: "See notice at end of class."
	date: "$Date$"
	revision: "$Revision$"
class interface
	WEL_COMMAND_MANAGER
create 
	make
			
feature 
	accommodate (n: INTEGER)
			n
			
			 HASH_TABLE
		require  HASH_TABLE
			n >= 0
		ensure  HASH_TABLE
			count_not_changed: count = old count
			slot_count_same_as_count: used_slot_count = count
			breathing_space: count * 100 < capacity * initial_occupation
	make
			
	hash_table_make (n: INTEGER)
			n
			
			n
			 HASH_TABLE
		ensure  HASH_TABLE
			breathing_space: n * 100 < capacity * initial_occupation
			minimum_space: minimum_capacity * 100 < capacity * initial_occupation
			more_than_minimum: capacity >= minimum_capacity
			no_status: not special_status
	
feature 
	current_keys: ARRAY [INTEGER]
			count
			 HASH_TABLE
		ensure  HASH_TABLE
			good_count: Result.count = count
	cursor: CURSOR
			
			 HASH_TABLE
		ensure  HASH_TABLE
			cursor_not_void: Result /= void
	found_item: WEL_COMMAND_EXEC
			
			 HASH_TABLE
	has (key: INTEGER): BOOLEAN
			key
			 HASH_TABLE
		ensure then  HASH_TABLE
			default_case: (key = computed_default_key) implies (Result = has_default)
	has_item (v: WEL_COMMAND_EXEC): BOOLEAN
			v
			
			object_comparison
			 HASH_TABLE
		ensure  CONTAINER
			not_found_in_empty: Result implies not is_empty
	item (key: INTEGER): WEL_COMMAND_EXEC
			key
			G
			HASH_TABLE@
			 HASH_TABLE
		require  TABLE
			valid_key: valid_key (k)
		ensure then  HASH_TABLE
			default_value_if_not_present: (not (has (key))) implies (Result = computed_default_value)
	item_for_iteration: WEL_COMMAND_EXEC
			
			 HASH_TABLE
		require  HASH_TABLE
			not_off: not off
	key_for_iteration: INTEGER
			
			 HASH_TABLE
		require  HASH_TABLE
			not_off: not off
		ensure  HASH_TABLE
			at_iteration_position: Result = key_at (iteration_position)
	infix "@" (key: INTEGER): WEL_COMMAND_EXEC
			key
			G
			HASH_TABLEitem
			 HASH_TABLE
		require  TABLE
			valid_key: valid_key (k)
		ensure then  HASH_TABLE
			default_value_if_not_present: (not (has (key))) implies (Result = computed_default_value)
	
feature 
	capacity: INTEGER
			
			 HASH_TABLE
	count: INTEGER
			
			 HASH_TABLE
	occurrences (v: WEL_COMMAND_EXEC): INTEGER
			v
			 HASH_TABLE
		ensure  BAG
			non_negative_occurrences: Result >= 0
	
feature 
	is_equal (other: like Current): BOOLEAN
			other
			 HASH_TABLE
		require  ANY
			other_not_void: other /= void
		ensure  ANY
			symmetric: Result implies other.is_equal (Current)
			consistent: standard_is_equal (other) implies Result
	
feature 
	after: BOOLEAN
			
			HASH_TABLEoff
			 HASH_TABLE
		ensure  HASH_TABLE
			definition: Result = ((not has_default and (iteration_position >= capacity)) or (has_default and (iteration_position = (capacity + 1))))
	changeable_comparison_criterion: BOOLEAN
			object_comparison
			
			 CONTAINER
	conflict: BOOLEAN
			
			 HASH_TABLE
	exists (message: INTEGER): BOOLEAN
			message
		require
			positive_message: message >= 0
	Extendible: BOOLEAN is True
			
			 HASH_TABLE
	found: BOOLEAN
			
			 HASH_TABLE
	Full: BOOLEAN is False
			
			 HASH_TABLE
	inserted: BOOLEAN
			
			 HASH_TABLE
	is_empty: BOOLEAN
			
			 FINITE
	is_inserted (v: WEL_COMMAND_EXEC): BOOLEAN
			v
			
			
			
			 COLLECTION
	not_found: BOOLEAN
			
			 HASH_TABLE
	object_comparison: BOOLEAN
			equal=
			=
			 CONTAINER
	off: BOOLEAN
			
			HASH_TABLEafter
			 HASH_TABLE
		ensure  HASH_TABLE
			definition: Result = ((not has_default and (iteration_position >= capacity)) or (has_default and (iteration_position = (capacity + 1))))
	prunable: BOOLEAN
			
			 HASH_TABLE
	removed: BOOLEAN
			
			 HASH_TABLE
	replaced: BOOLEAN
			
			 HASH_TABLE
	valid_cursor (c: CURSOR): BOOLEAN
			c
			 HASH_TABLE
		require  HASH_TABLE
			c_not_void: c /= void
	valid_key (k: INTEGER): BOOLEAN
			k
			
			 HASH_TABLE
		ensure then  HASH_TABLE
			Result
	
feature 
	compare_objects
			equal
			=
			 CONTAINER
		require  CONTAINER
			changeable_comparison_criterion
		ensure  CONTAINER
			object_comparison
	compare_references
			=
			equal
			 CONTAINER
		require  CONTAINER
			changeable_comparison_criterion
		ensure  CONTAINER
			reference_comparison: not object_comparison
	
feature 
	forth
			
			off
			 HASH_TABLE
		require  HASH_TABLE
			not_off: not off
	go_to (c: CURSOR)
			c
			 HASH_TABLE
		require  HASH_TABLE
			c_not_void: c /= void
			valid_cursor: valid_cursor (c)
	search (key: INTEGER)
			key
			found
			found_itemkey
			 HASH_TABLE
		ensure  HASH_TABLE
			found_or_not_found: found or not_found
			item_if_found: found implies (found_item = content.item (position))
	start
			
			 HASH_TABLE
	
feature 
	extend (new: WEL_COMMAND_EXEC; key: INTEGER)
			key
			newkey
			inserted
			
			
			instructions
			 HASH_TABLE
		require  HASH_TABLE
			not_present: not has (key)
		ensure  HASH_TABLE
			inserted: inserted
			insertion_done: item (key) = new
			one_more: count = old count + 1
			same_slot_count_or_one_more_unless_reallocated: (used_slot_count = old used_slot_count) or (used_slot_count = old used_slot_count + 1) or (used_slot_count = count)
			default_property: has_default = ((key = computed_default_key) or (old has_default))
	fill (other: CONTAINER [WEL_COMMAND_EXEC])
			other
			other
			
			 COLLECTION
		require  COLLECTION
			other_not_void: other /= void
			extendible
	hash_table_force (new: WEL_COMMAND_EXEC; key: INTEGER)
			new
			key
			found
			found_item
			not_found
			found_item
			
			
			instructions
			 HASH_TABLE
		require else  HASH_TABLE
			True
		ensure then  HASH_TABLE
			insertion_done: item (key) = new
			now_present: has (key)
			found_or_not_found: found or not_found
			not_found_if_was_not_present: not_found = not (old has (key))
			same_count_or_one_more: (count = old count) or (count = old count + 1)
			same_slot_count_or_one_more_unless_reallocated: (used_slot_count = old used_slot_count) or (used_slot_count = old used_slot_count + 1) or (used_slot_count = count)
			found_item_is_old_item: found implies (found_item = old (item (key)))
			default_value_if_not_found: not_found implies (found_item = computed_default_value)
			default_property: has_default = ((key = computed_default_key) or ((key /= computed_default_key) and (old has_default)))
	put (new: WEL_COMMAND_EXEC; key: INTEGER)
			newkey
			
			inserted
			key
			position
			conflict
			found_item
			key
			new
			
			
			instructions
			 HASH_TABLE
		require  TABLE
			valid_key: valid_key (k)
		ensure then  HASH_TABLE
			conflict_or_inserted: conflict or inserted
			insertion_done: inserted implies item (key) = new
			now_present: inserted implies has (key)
			one_more_if_inserted: inserted implies (count = old count + 1)
			one_more_slot_if_inserted_unless_reallocated: inserted implies ((used_slot_count = old used_slot_count + 1) or (used_slot_count = count))
			unchanged_if_conflict: conflict implies (count = old count)
			same_item_if_conflict: conflict implies (item (key) = old (item (key)))
			slot_count_unchanged_if_conflict: conflict implies (used_slot_count = old used_slot_count)
			found_item_associated_with_key: found_item = item (key)
			new_item_if_inserted: inserted implies (found_item = new)
			old_item_if_conflict: conflict implies (found_item = old (item (key)))
			default_property: has_default = ((inserted and (key = computed_default_key)) or ((conflict or (key /= computed_default_key)) and (old has_default)))
	replace (new: WEL_COMMAND_EXEC; key: INTEGER)
			key
			new
			replaced
			keynot_found
			found_item
			key
			
			
			instructions
			 HASH_TABLE
		ensure  HASH_TABLE
			replaced_or_not_found: replaced or not_found
			insertion_done: replaced implies item (key) = new
			no_change_if_not_found: not_found implies item (key) = old (item (key))
			found_item_is_old_item: found_item = old (item (key))
	replace_key (new_key: INTEGER; old_key: INTEGER)
			old_key
			new_keynew_key
			replacedfound_item
			old_key
			not_foundconflict
			conflictfound_item
			new_key
			
			
			instructions
			 HASH_TABLE
		ensure  HASH_TABLE
			same_count: count = old count
			same_slot_count: used_slot_count = old used_slot_count
			replaced_or_conflict_or_not_found: replaced or conflict or not_found
			old_absent: (replaced and not equal (new_key, old_key)) implies (not has (old_key))
			new_present: (replaced or conflict) = has (new_key)
			new_item: replaced implies (item (new_key) = old (item (old_key)))
			not_found_iff_no_old_key: not_found = old (not has (old_key))
			conflict_iff_already_present: conflict = old (has (new_key))
			not_inserted_if_conflict: conflict implies (item (new_key) = old (item (new_key)))
			default_property: has_default = ((new_key = computed_default_key) or ((new_key /= computed_default_key) and (old has_default)))
	
feature 
	clear_all
			
			 HASH_TABLE
		require  COLLECTION
			prunable
		ensure  COLLECTION
			wiped_out: is_empty
		ensure then  HASH_TABLE
			position_equal_to_zero: position = 0
			count_equal_to_zero: count = 0
			used_slot_count_equal_to_zero: used_slot_count = 0
			has_default_set: not has_default
			no_status: not special_status
	hash_table_remove (key: INTEGER)
			key
			removed
			key
			position
			not_found
			 HASH_TABLE
		ensure  HASH_TABLE
			removed_or_not_found: removed or not_found
			not_present: not has (key)
			one_less: found implies (count = old count - 1)
			same_slot_count: used_slot_count = old used_slot_count
			default_case: (key = computed_default_key) implies (not has_default)
			non_default_case: (key /= computed_default_key) implies (has_default = old has_default)
	
feature 
	linear_representation: ARRAYED_LIST [WEL_COMMAND_EXEC]
			
			 HASH_TABLE
		ensure then  HASH_TABLE
			result_exists: Result /= void
			good_count: Result.count = count
	
feature 
	copy (other: like Current)
			other
			 HASH_TABLE
		require  ANY
			other_not_void: other /= void
			type_identity: same_type (other)
		ensure  ANY
			is_equal: is_equal (other)
	
feature 
	force (command: WEL_COMMAND_EXEC; message: INTEGER)
			commandmessage
		require
			command_not_void: command /= void
			positive_message: message >= 0
		ensure
			exists: exists (message)
	remove (message: INTEGER)
			message
		require
			positive_message: message >= 0
		ensure
			not_exists: not exists (message)
	
invariant
		 ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)
		 HASH_TABLE
	keys_not_void: keys /= void
	content_not_void: content /= void
	keys_same_capacity_plus_one: keys.count = capacity + 1
	content_same_capacity_plus_one: content.count = capacity + 1
	deleted_same_capacity: deleted_marks.count = capacity
	keys_starts_at_zero: keys.lower = 0
	content_starts_at_zero: content.lower = 0
	deleted_starts_at_zero: deleted_marks.lower = 0
	valid_iteration_position: off or truly_occupied (iteration_position)
	control_non_negative: control >= 0
	special_status: special_status = (conflict or inserted or replaced or removed or found or not_found)
	max_occupation_meaningful: (max_occupation > 0) and (max_occupation < 100)
	initial_occupation_meaningful: (initial_occupation > 0) and (initial_occupation < 100)
	sized_generously_enough: initial_occupation < max_occupation
	count_big_enough: 0 <= count
	count_small_enough: count <= capacity
	breathing_space: count * 100 <= capacity * max_occupation
	count_no_more_than_slot_count: count <= used_slot_count
	slot_count_big_enough: 0 <= count
	slot_count_small_enough: used_slot_count <= capacity
	extra_space_non_negative: extra_space >= 0
		 FINITE
	empty_definition: is_empty = (count = 0)
	non_negative_count: count >= 0
end -- WEL_COMMAND_MANAGER