indexing
	description: "COM Decimal Structure.  Wrapping COM DECIMAL type"
	status: "See notice at end of class"
	date: "$Date$"
	revision: "$Revision$"
class interface
	ECOM_DECIMAL
create 
	make
	make_from_pointer (a_pointer: POINTER)
			
		require  ECOM_STRUCTURE
			valid_pointer: a_pointer /= default_pointer
	make_from_double (dbl_value: DOUBLE)
			
feature 
	item: POINTER
			
			
			 WEL_ANY
	one: ECOM_DECIMAL
			*
		ensure  NUMERIC
			result_exists: Result /= void
	scale: INTEGER
			
		require
			non_void_item: item /= void
			valid_item: item /= default_pointer
	zero: ECOM_DECIMAL
			+
		ensure  NUMERIC
			result_exists: Result /= void
	
feature 
	structure_size: INTEGER
			
		ensure  WEL_STRUCTURE
			positive_result: Result > 0
	
feature 
	exists: BOOLEAN
			item
			 WEL_ANY
		ensure  WEL_ANY
			Result = (item /= default_pointer)
	shared: BOOLEAN
			item
			item
			destroy_item
			item
			 WEL_ANY
	
feature 
	set_shared
			shared
			 WEL_ANY
		ensure  WEL_ANY
			shared: shared
	set_unshared
			shared
			 WEL_ANY
		ensure  WEL_ANY
			unshared: not shared
	
feature 
	dispose
			Current
			
			
			Current
			
			 WEL_ANY
	
feature 
	absolute: ECOM_DECIMAL
			
		require
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure
			non_void_result: Result /= void
	ceiled_integer_portion: ECOM_DECIMAL
			
			
		require
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure
			non_void_result: Result /= void
	rounded (value: INTEGER): ECOM_DECIMAL
			value
		require
			valid_value: value >= 0
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure
			non_void_result: Result /= void
	to_integer: INTEGER
			item
			 WEL_ANY
		ensure  WEL_ANY
			Result = cwel_pointer_to_integer (item)
	truncated_to_double: DOUBLE
			
	truncated_to_integer_portion: ECOM_DECIMAL
			
			
		require
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure
			valid_result: Result /= void
	
feature 
	initialize
			
			 WEL_STRUCTURE
		require  WEL_STRUCTURE
			exists: exists
	initialize_with_character (a_character: CHARACTER)
			a_character
			 WEL_STRUCTURE
		require  WEL_STRUCTURE
			exists: exists
	memory_copy (source_pointer: POINTER; length: INTEGER)
			lengthsource_pointeritem
			 WEL_STRUCTURE
		require  WEL_STRUCTURE
			length_small_enough: length <= structure_size
			length_large_enough: length > 0
			exists: exists
	infix "*" (other: ECOM_DECIMAL): ECOM_DECIMAL
			other
		require  NUMERIC
			other_exists: other /= void
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
	prefix "+": ECOM_DECIMAL
			
		require   NUMERIC
			True
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
	infix "+" (other: ECOM_DECIMAL): ECOM_DECIMAL
			other
		require  NUMERIC
			other_exists: other /= void
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
			commutative: equal (Result, other + Current)
	infix "-" (other: ECOM_DECIMAL): ECOM_DECIMAL
			other
		require  NUMERIC
			other_exists: other /= void
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
	prefix "-": ECOM_DECIMAL
			
		require   NUMERIC
			True
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
	infix "/" (other: ECOM_DECIMAL): ECOM_DECIMAL
			other
		require  NUMERIC
			other_exists: other /= void
			good_divisor: divisible (other)
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
		ensure  NUMERIC
			result_exists: Result /= void
	infix "^" (other: NUMERIC): NUMERIC
			
		require else
			non_void_item: item /= void
			valid_item: item /= default_pointer
	
feature 
	set_value (source: like Current)
			
			 ECOM_STRUCTURE
		require  ECOM_STRUCTURE
			non_void: source /= void
			valid_source: source.item /= default_pointer
	
feature 
	make
	make_from_double (dbl_value: DOUBLE)
			
	
feature 
	divisible (other: ECOM_DECIMAL): BOOLEAN
			other
		require  NUMERIC
			other_exists: other /= void
	exponentiable (other: ECOM_DECIMAL): BOOLEAN
			other
		require  NUMERIC
			other_exists: other /= void
	is_equal (other: like Current): BOOLEAN
			
			
		require  ANY
			other_not_void: other /= void
		ensure  ANY
			symmetric: Result implies other.is_equal (Current)
			consistent: standard_is_equal (other) implies Result
	
invariant
		 ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)
end -- ECOM_DECIMAL