indexing
	description: "COM VARIANT structure"
	status: "See notice at end of class"
	date: "$Date$"
	revision: "$Revision$"

class interface
	ECOM_VARIANT

create 

	make
			-- Create new variant.
		ensure -- from WEL_STRUCTURE
			not_shared: not shared

	make_from_pointer (a_pointer: POINTER)
			-- Make from pointer.
		require -- from ECOM_STRUCTURE
			valid_pointer: a_pointer /= default_pointer

feature -- Initialization

	make
			-- Create new variant.
		ensure -- from WEL_STRUCTURE
			not_shared: not shared

	make_from_pointer (a_pointer: POINTER)
			-- Make from pointer.
		require -- from ECOM_STRUCTURE
			valid_pointer: a_pointer /= default_pointer
	
feature -- Access

	boolean_array: ECOM_ARRAY [BOOLEAN]
			-- ARRAY of BOOLEAN.
		require
			is_boolean: is_boolean (variable_type)
			is_array: is_array (variable_type)

	boolean_array_reference: CELL [ECOM_ARRAY [BOOLEAN]]
			-- ARRAY of BOOLEAN.
		require
			is_boolean: is_boolean (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	boolean_reference: BOOLEAN_REF
			-- Reference boolean value
		require
			is_boolean_ref: is_boolean (variable_type) and is_byref (variable_type)

	boolean_value: BOOLEAN
			-- Boolean value
		require
			is_boolean: variable_type = vt_bool

	char_array: ECOM_ARRAY [CHARACTER]
			-- ARRAY of characters
		require
			is_character: is_character (variable_type)
			is_array: is_array (variable_type)

	char_array_reference: CELL [ECOM_ARRAY [CHARACTER]]
			-- ARRAY of characters
		require
			is_character: is_character (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	character_reference: CHARACTER_REF
			-- Reference character value
		require
			is_character_ref: is_character (variable_type) and is_byref (variable_type)

	character_value: CHARACTER
			-- Character value
		require
			is_character: variable_type = vt_i1

	currency: ECOM_CURRENCY
			-- Currency value
		require
			is_currency: variable_type = vt_cy

	currency_array: ECOM_ARRAY [ECOM_CURRENCY]
			-- ARRAY of CURRENCY
		require
			is_currency: is_currency (variable_type)
			is_array: is_array (variable_type)

	currency_array_reference: CELL [ECOM_ARRAY [ECOM_CURRENCY]]
			-- ARRAY of CURRENCY
		require
			is_currency: is_currency (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	currency_reference: ECOM_CURRENCY
			-- Reference currency value
		require
			is_currency_ref: is_currency (variable_type) and is_byref (variable_type)

	date_array: ECOM_ARRAY [DATE_TIME]
			-- ARRAY of DATE
		require
			is_date: is_date (variable_type)
			is_array: is_array (variable_type)

	date_array_reference: CELL [ECOM_ARRAY [DATE_TIME]]
			-- ARRAY of DATE
		require
			is_date: is_date (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	date_reference: CELL [DATE_TIME]
			-- Date reference value
		require
			is_date_ref: is_date (variable_type) and is_byref (variable_type)

	date_value: DATE_TIME
			-- Date value
		require
			is_date: variable_type = vt_date

	decimal: ECOM_DECIMAL
			-- Decimal value

	decimal_array: ECOM_ARRAY [ECOM_DECIMAL]
			-- ARRAY of ECOM_DECIMALs.
		require
			is_decimal: is_decimal (variable_type)
			is_array: is_array (variable_type)

	decimal_array_reference: CELL [ECOM_ARRAY [ECOM_DECIMAL]]
			-- ARRAY of ECOM_DECIMALs.
		require
			is_decimal: is_decimal (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	decimal_reference: ECOM_DECIMAL
			-- Decimal reference value
		require
			is_decimal_ref: is_decimal (variable_type) and is_byref (variable_type)

	dispatch_interface: ECOM_AUTOMATION_INTERFACE
			-- IDispatch interface value
		require
			is_dispatch_ref: variable_type = vt_dispatch

	dispatch_interface_array: ECOM_ARRAY [ECOM_AUTOMATION_INTERFACE]
			-- ARRAY of ECOM_AUTOMATION_INTERFACEs.
		require
			is_dispatch: is_dispatch (variable_type)
			is_array: is_array (variable_type)

	dispatch_interface_array_reference: CELL [ECOM_ARRAY [ECOM_AUTOMATION_INTERFACE]]
			-- ARRAY of ECOM_AUTOMATION_INTERFACEs.
		require
			is_dispatch: is_dispatch (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	dispatch_interface_reference: CELL [ECOM_AUTOMATION_INTERFACE]
			-- IDispatch interface reference value
		require
			is_dispatch_ref: is_dispatch (variable_type) and is_byref (variable_type)

	double_array: ECOM_ARRAY [DOUBLE]
			-- ARRAY of doubles
		require
			is_real8: is_real8 (variable_type)
			is_array: is_array (variable_type)

	double_array_reference: CELL [ECOM_ARRAY [DOUBLE]]
			-- ARRAY of doubles
		require
			is_real8: is_real8 (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	error: ECOM_HRESULT
			-- Error value
		require
			is_error: variable_type = vt_error

	error_array: ECOM_ARRAY [ECOM_HRESULT]
			-- ARRAY of HRESULTs
		require
			is_error: is_error (variable_type)
			is_array: is_array (variable_type)

	error_array_reference: CELL [ECOM_ARRAY [ECOM_HRESULT]]
			-- ARRAY of HRESULTs
		require
			is_error: is_error (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	error_reference: ECOM_HRESULT
			-- Error reference value
		require
			is_error_ref: is_error (variable_type) and is_byref (variable_type)

	integer2: INTEGER
			-- Short value
		require
			is_integer2: variable_type = vt_i2

	integer2_reference: INTEGER_REF
			-- Reference short value
		require
			is_integer2_ref: is_integer2 (variable_type) and is_byref (variable_type)

	integer4: INTEGER
			-- Long value
		require
			is_integer4: variable_type = vt_i4

	integer4_array: ECOM_ARRAY [INTEGER]
			-- Integer ARRAY value
		require
			is_integer4: is_integer4 (variable_type)
			is_array: is_array (variable_type)

	integer4_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Reference integer ARRAY value
		require
			is_integer4: is_integer4 (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	integer4_reference: INTEGER_REF
			-- Reference long value
		require
			is_integer4_ref: is_integer4 (variable_type) and is_byref (variable_type)

	integer_array: ECOM_ARRAY [INTEGER]
			-- Array of integers
		require
			is_int: is_int (variable_type)
			is_array: is_array (variable_type)

	integer_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Array of integers
		require
			is_int: is_int (variable_type)
			is_array: is_array (variable_type)

	integer_reference: INTEGER_REF
			-- Reference integer value
		require
			is_integer_ref: is_int (variable_type) and is_byref (variable_type)

	integer_value: INTEGER
			-- Integer value
		require
			is_integer: variable_type = vt_int

	item: POINTER
			-- Generic Windows handle or structure pointer.
			-- Can be a HWND, HICON, RECT *, WNDCLASS *, etc...
			-- (from WEL_ANY)

	real4: REAL
			-- Real value
		require
			is_real4: variable_type = vt_r4

	real4_reference: REAL_REF
			-- Reference real value
		require
			is_real4_ref: is_real4 (variable_type) and is_byref (variable_type)

	real8: DOUBLE
			-- Double value
		require
			is_real8: variable_type = vt_r8

	real8_reference: DOUBLE_REF
			-- Reference double value
		require
			is_real8_ref: is_real8 (variable_type) and is_byref (variable_type)

	real_array: ECOM_ARRAY [REAL]
			-- ARRAY of reals
		require
			is_real4: is_real4 (variable_type)
			is_array: is_array (variable_type)

	real_array_reference: CELL [ECOM_ARRAY [REAL]]
			-- ARRAY of reals
		require
			is_real4: is_real4 (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	short_array: ECOM_ARRAY [INTEGER]
			-- Integer ARRAY value
		require
			is_integer2: is_integer2 (variable_type)
			is_array: is_array (variable_type)

	short_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Integer ARRAY value
		require
			is_integer2: is_integer2 (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	string_array: ECOM_ARRAY [STRING]
			-- ARRAY of STRING.
		require
			is_bstr: is_bstr (variable_type)
			is_array: is_array (variable_type)

	string_array_reference: CELL [ECOM_ARRAY [STRING]]
			-- ARRAY of STRING.
		require
			is_bstr: is_bstr (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	string_reference: CELL [STRING]
			-- Reference BSTR value
		require
			is_bstr_ref: is_bstr (variable_type) and is_byref (variable_type)

	string_value: STRING
			-- BSTR value
		require
			is_bstr: variable_type = vt_bstr

	unknown_interface: ECOM_UNKNOWN_INTERFACE
			-- IUnknown interface value
		require
			is_unknown_ref: variable_type = vt_unknown

	unknown_interface_array: ECOM_ARRAY [ECOM_UNKNOWN_INTERFACE]
			-- ARRAY of ECOM_UNKNOWN_INTERFACEs.
		require
			is_unknown: is_unknown (variable_type)
			is_array: is_array (variable_type)

	unknown_interface_array_reference: CELL [ECOM_ARRAY [ECOM_UNKNOWN_INTERFACE]]
			-- ARRAY of ECOM_UNKNOWN_INTERFACEs.
		require
			is_unknown: is_unknown (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	unknown_interface_reference: CELL [ECOM_UNKNOWN_INTERFACE]
			-- IUnknown interface reference value
		require
			is_unknown_ref: is_unknown (variable_type) and is_byref (variable_type)

	unsigned_character_array: ECOM_ARRAY [CHARACTER]
			-- Array of unsigned character
		require
			is_unsigned_char: is_unsigned_char (variable_type)
			is_array: is_array (variable_type)

	unsigned_character_array_reference: CELL [ECOM_ARRAY [CHARACTER]]
			-- Array of unsigned character
		require
			is_unsigned_char: is_unsigned_char (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	unsigned_character_reference: CHARACTER_REF
			-- Reference byte value
		require
			is_byte_ref: is_unsigned_char (variable_type) and is_byref (variable_type)

	unsigned_character_value: CHARACTER
			-- Byte value
		require
			is_byte: is_unsigned_char (variable_type)

	unsigned_integer: INTEGER
			-- Unsigned integer value
		require
			is_unsigned_integer: variable_type = vt_uint

	unsigned_integer2: INTEGER
			-- Unsigned short value
		require
			is_unsigned_short: variable_type = vt_ui2

	unsigned_integer2_reference: INTEGER_REF
			-- Reference unsigned short value
		require
			is_unsigned_integer2_ref: is_unsigned_short (variable_type) and is_byref (variable_type)

	unsigned_integer4: INTEGER
			-- Unsigned long value
		require
			is_unsigned_long: variable_type = vt_ui4

	unsigned_integer4_array: ECOM_ARRAY [INTEGER]
			-- Array of unsigned long
		require
			is_unsigned_long: is_unsigned_long (variable_type)
			is_array: is_array (variable_type)

	unsigned_integer4_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Array of unsigned long
		require
			is_unsigned_long: is_unsigned_long (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	unsigned_integer4_reference: INTEGER_REF
			-- Reference unsigned long value
		require
			is_unsigned_long_ref: is_unsigned_long (variable_type) and is_byref (variable_type)

	unsigned_integer_array: ECOM_ARRAY [INTEGER]
			-- Array of unsigned int
		require
			is_unsigned_int: is_unsigned_int (variable_type)
			is_array: is_array (variable_type)

	unsigned_integer_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Array of unsigned int
		require
			is_unsigned_int: is_unsigned_int (variable_type)
			is_array: is_array (variable_type)

	unsigned_integer_reference: INTEGER_REF
			-- Reference unsigned integer value
		require
			is_unsigned_int_ref: is_unsigned_int (variable_type) and is_byref (variable_type)

	unsigned_short_array: ECOM_ARRAY [INTEGER]
			-- Array of unsigned short
		require
			is_unsigned_short: is_unsigned_short (variable_type)
			is_array: is_array (variable_type)

	unsigned_short_array_reference: CELL [ECOM_ARRAY [INTEGER]]
			-- Array of unsigned short
		require
			is_unsigned_short: is_unsigned_short (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	variable_type: INTEGER
			-- Variable type

	variant_array: ECOM_ARRAY [ECOM_VARIANT]
			-- ARRAY of ECOM_VARIANTs.
		require
			is_variant: is_variant (variable_type)
			is_array: is_array (variable_type)

	variant_array_reference: CELL [ECOM_ARRAY [ECOM_VARIANT]]
			-- ARRAY of ECOM_VARIANTs.
		require
			is_variant: is_variant (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	variant_value: ECOM_VARIANT
			-- Variant value
		require
			is_variant: is_variant (variable_type)

	vt_array: INTEGER
			-- A Safe array of data is passed
			-- (from ECOM_VAR_TYPE)

	vt_bool: INTEGER
			-- Boolean: True = -1 False = 0
			-- (from ECOM_VAR_TYPE)

	vt_bstr: INTEGER
			-- Binary string
			-- (from ECOM_VAR_TYPE)

	vt_byref: INTEGER
			-- Pointer to data is passed
			-- (from ECOM_VAR_TYPE)

	vt_carray: INTEGER
			-- array
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_cy: INTEGER
			-- Currency
			-- (from ECOM_VAR_TYPE)

	vt_date: INTEGER
			-- Date
			-- (from ECOM_VAR_TYPE)

	vt_decimal: INTEGER
			-- 16 byte fixed point
			-- (from ECOM_VAR_TYPE)

	vt_dispatch: INTEGER
			-- IDispatch*
			-- (from ECOM_VAR_TYPE)

	vt_empty: INTEGER
			-- Not specified
			-- (from ECOM_VAR_TYPE)

	vt_error: INTEGER
			-- SCODE
			-- (from ECOM_VAR_TYPE)

	vt_hresult: INTEGER
			-- HRESULT
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_i1: INTEGER
			-- Character
			-- (from ECOM_VAR_TYPE)

	vt_i2: INTEGER
			-- 2-byte signed integer
			-- (from ECOM_VAR_TYPE)

	vt_i4: INTEGER
			-- 4-byte signed integer
			-- (from ECOM_VAR_TYPE)

	vt_i8: INTEGER
			-- 8-byte signed integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_int: INTEGER
			-- integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_lpstr: INTEGER
			-- LPSTR
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_lpwstr: INTEGER
			-- LPWSTR
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_null: INTEGER
			-- SQL style Null
			-- (from ECOM_VAR_TYPE)

	vt_ptr: INTEGER
			-- pointer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_r4: INTEGER
			-- 4-byte real
			-- (from ECOM_VAR_TYPE)

	vt_r8: INTEGER
			-- 8-byte real
			-- (from ECOM_VAR_TYPE)

	vt_record: INTEGER
			-- Record
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_reserved: INTEGER
			-- Reserverd for Microsoft use
			-- (from ECOM_VAR_TYPE)

	vt_safearray: INTEGER
			-- Safearray
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_typemask: INTEGER
			-- Typemask.
			-- (from ECOM_VAR_TYPE)

	vt_ui1: INTEGER
			-- Unsigned character
			-- (from ECOM_VAR_TYPE)

	vt_ui2: INTEGER
			-- 2-bytes unsigned integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_ui4: INTEGER
			-- 4-bytes unsigned integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_ui8: INTEGER
			-- 8-bytes unsigned integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_uint: INTEGER
			-- unsigned integer
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_unknown: INTEGER
			-- IUnknown*
			-- (from ECOM_VAR_TYPE)

	vt_userdefined: INTEGER
			-- User defined
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)

	vt_variant: INTEGER
			-- VARIANT*
			-- (from ECOM_VAR_TYPE)

	vt_void: INTEGER
			-- NULL
			-- may appear in TYPEDESC only
			-- (from ECOM_VAR_TYPE)
	
feature -- Measurement

	structure_size: INTEGER
			-- Size of VARIANT structure
		ensure -- from WEL_STRUCTURE
			positive_result: Result > 0
	
feature -- Status report

	exists: BOOLEAN
			-- Does the item exist?
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = (item /= default_pointer)

	is_array (variable_type: INTEGER): BOOLEAN
			-- Is variable array?
			-- (from ECOM_VAR_TYPE)

	is_basic (a_type: INTEGER): BOOLEAN
			-- Is a_type basic type?
			-- (from ECOM_VAR_TYPE)

	is_boolean (variable_type: INTEGER): BOOLEAN
			-- Is variable boolen?
			-- (from ECOM_VAR_TYPE)

	is_bstr (variable_type: INTEGER): BOOLEAN
			-- Is variable BSTR?
			-- (from ECOM_VAR_TYPE)

	is_byref (variable_type: INTEGER): BOOLEAN
			-- Is variable passed by reference?
			-- (from ECOM_VAR_TYPE)

	is_carray (variable_type: INTEGER): BOOLEAN
			-- Is variable C ARRAY?
			-- (from ECOM_VAR_TYPE)

	is_character (variable_type: INTEGER): BOOLEAN
			-- Is variable character?
			-- (from ECOM_VAR_TYPE)

	is_currency (variable_type: INTEGER): BOOLEAN
			-- Is variable currency?
			-- (from ECOM_VAR_TYPE)

	is_date (variable_type: INTEGER): BOOLEAN
			-- Is variable date?
			-- (from ECOM_VAR_TYPE)

	is_decimal (variable_type: INTEGER): BOOLEAN
			-- Is decimal variable?
			-- (from ECOM_VAR_TYPE)

	is_dispatch (variable_type: INTEGER): BOOLEAN
			-- Is dispatch interface?
			-- (from ECOM_VAR_TYPE)

	is_error (variable_type: INTEGER): BOOLEAN
			-- Is variable error?
			-- (from ECOM_VAR_TYPE)

	is_hresult (variable_type: INTEGER): BOOLEAN
			-- Is variable int?
			-- (from ECOM_VAR_TYPE)

	is_int (variable_type: INTEGER): BOOLEAN
			-- Is variable int?
			-- (from ECOM_VAR_TYPE)

	is_integer2 (variable_type: INTEGER): BOOLEAN
			-- Is variable short integer?
			-- (from ECOM_VAR_TYPE)

	is_integer4 (variable_type: INTEGER): BOOLEAN
			-- Is variable long integer?
			-- (from ECOM_VAR_TYPE)

	is_long_long (variable_type: INTEGER): BOOLEAN
			-- Is variable long long?
			-- (from ECOM_VAR_TYPE)

	is_lpstr (variable_type: INTEGER): BOOLEAN
			-- Is variable LPSTR?
			-- (from ECOM_VAR_TYPE)

	is_lpwstr (variable_type: INTEGER): BOOLEAN
			-- Is variable LPWSTR?
			-- (from ECOM_VAR_TYPE)

	is_ptr (variable_type: INTEGER): BOOLEAN
			-- Is variable ptr?
			-- (from ECOM_VAR_TYPE)

	is_real4 (variable_type: INTEGER): BOOLEAN
			-- Is variable real?
			-- (from ECOM_VAR_TYPE)

	is_real8 (variable_type: INTEGER): BOOLEAN
			-- Is variable double?
			-- (from ECOM_VAR_TYPE)

	is_safearray (variable_type: INTEGER): BOOLEAN
			-- Is variable SAFEARRAY?
			-- (from ECOM_VAR_TYPE)

	is_unknown (variable_type: INTEGER): BOOLEAN
			-- Is IUnknown interface?
			-- (from ECOM_VAR_TYPE)

	is_unsigned_char (variable_type: INTEGER): BOOLEAN
			-- Is variable unsigned char?
			-- (from ECOM_VAR_TYPE)

	is_unsigned_int (variable_type: INTEGER): BOOLEAN
			-- Is variable unsigned int?
			-- (from ECOM_VAR_TYPE)

	is_unsigned_long (variable_type: INTEGER): BOOLEAN
			-- Is variable unsigned long?
			-- (from ECOM_VAR_TYPE)

	is_unsigned_long_long (variable_type: INTEGER): BOOLEAN
			-- Is variable unsigned long long?
			-- (from ECOM_VAR_TYPE)

	is_unsigned_short (variable_type: INTEGER): BOOLEAN
			-- Is Ivariable unsigned short?
			-- (from ECOM_VAR_TYPE)

	is_user_defined (variable_type: INTEGER): BOOLEAN
			-- Is variable user defined?
			-- (from ECOM_VAR_TYPE)

	is_variant (variable_type: INTEGER): BOOLEAN
			-- Is variable variant?
			-- (from ECOM_VAR_TYPE)

	is_void (variable_type: INTEGER): BOOLEAN
			-- Is variable void?
			-- (from ECOM_VAR_TYPE)

	shared: BOOLEAN
			-- Is item shared by another object?
			-- If False (by default), item will
			-- be destroyed by destroy_item.
			-- If True, item will not be destroyed.
			-- (from WEL_ANY)

	valid_var_type (a_var_type: INTEGER): BOOLEAN
			-- Is a_var_type a valid variant type?
			-- (from ECOM_VAR_TYPE)
	
feature -- Status setting

	set_shared
			-- Set shared to True.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			shared: shared

	set_unshared
			-- Set shared to False.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			unshared: not shared
	
feature -- Element change

	set (a: ANY)
			-- Set VARIANT with ANY.

	set_array (a_value: ECOM_ARRAY [ECOM_VARIANT])
			-- Set ARRAY of ECOM_VARIANTs.
		require
			non_void_value: a_value /= void

	set_boolean (a_value: BOOLEAN)
			-- Set boolean value.

	set_boolean_array (a_value: ECOM_ARRAY [BOOLEAN])
			-- Set ARRAY of BOOLEAN.
		require
			non_void_value: a_value /= void

	set_boolean_array_reference (a_value: CELL [ECOM_ARRAY [BOOLEAN]])
			-- Set ARRAY of BOOLEAN.
		require
			non_void_value: a_value /= void

	set_boolean_reference (a_value: BOOLEAN_REF)
			-- Set reference boolean value.
		require
			non_void: a_value /= void

	set_char_array (a_value: ECOM_ARRAY [CHARACTER])
			-- Set ARRAY of characters
		require
			non_void_value: a_value /= void

	set_char_array_reference (a_value: CELL [ECOM_ARRAY [CHARACTER]])
			-- Set ARRAY of characters
		require
			non_void_value: a_value /= void

	set_character (a_char: CHARACTER)
			-- Set character value.

	set_character_reference (a_char: CHARACTER_REF)
			-- Set reference character value
		require
			non_void: a_char /= void

	set_currency (a_value: ECOM_CURRENCY)
			-- Set currency value.
		require
			non_void_currency: a_value /= void
			valid: a_value.item /= default_pointer

	set_currency_array (a_value: ECOM_ARRAY [ECOM_CURRENCY])
			-- Set ARRAY of CURRENCY
		require
			non_void_value: a_value /= void

	set_currency_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_CURRENCY]])
			-- Set ARRAY of CURRENCY
		require
			non_void_value: a_value /= void

	set_currency_reference (a_value: ECOM_CURRENCY)
			-- Set reference currency value.
		require
			non_void_currency: a_value /= void
			valid: a_value.item /= default_pointer

	set_date (a_value: DATE_TIME)
			-- Set date value.
		require
			non_void: a_value /= void

	set_date_array (a_value: ECOM_ARRAY [DATE_TIME])
			-- Set ARRAY of DATE
		require
			non_void_value: a_value /= void

	set_date_array_reference (a_value: CELL [ECOM_ARRAY [DATE_TIME]])
			-- Set ARRAY of DATE
		require
			non_void_value: a_value /= void

	set_date_reference (a_value: CELL [DATE_TIME])
			-- Set date reference value.
		require
			non_void: a_value /= void
			valid_value: a_value.item /= void

	set_decimal (a_value: ECOM_DECIMAL)
			-- Set decimal value.
		require
			non_void_decimal: a_value /= void
			valid: a_value.item /= default_pointer

	set_decimal_array (a_value: ECOM_ARRAY [ECOM_DECIMAL])
			-- Set ARRAY of ECOM_DECIMALs.
		require
			non_void_value: a_value /= void

	set_decimal_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_DECIMAL]])
			-- Set ARRAY of ECOM_DECIMALs.
		require
			non_void_value: a_value /= void

	set_decimal_reference (a_value: ECOM_DECIMAL)
			-- Set decimal reference value.
		require
			non_void_decimal: a_value /= void
			valid: a_value.item /= default_pointer

	set_dispatch_array (a_value: ECOM_ARRAY [ECOM_INTERFACE])
			-- Set ARRAY of ECOM_AUTOMATION_INTERFACEs.
		require
			non_void_value: a_value /= void

	set_dispatch_interface (a_value: ECOM_INTERFACE)
			-- Set IDispatch interface value.
		require
			non_void: a_value /= void

	set_dispatch_interface_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_INTERFACE]])
			-- Set ARRAY of ECOM_AUTOMATION_INTERFACEs.
		require
			non_void_value: a_value /= void

	set_dispatch_interface_reference (a_value: CELL [ECOM_INTERFACE])
			-- Set IDispatch interface reference value.
		require
			non_void: a_value /= void

	set_double_array (a_value: ECOM_ARRAY [DOUBLE])
			-- Set ARRAY of doubles
		require
			non_void_value: a_value /= void

	set_double_array_reference (a_value: CELL [ECOM_ARRAY [DOUBLE]])
			-- Set ARRAY of doubles
		require
			non_void_value: a_value /= void

	set_empty
			-- Set empty VARIANT.

	set_error (a_value: ECOM_HRESULT)
			-- Set error value.
		require
			non_void: a_value /= void

	set_error_array (a_value: ECOM_ARRAY [ECOM_HRESULT])
			-- Set ARRAY of HRESULTs
		require
			non_void_value: a_value /= void

	set_error_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_HRESULT]])
			-- Set ARRAY of HRESULTs
		require
			non_void_value: a_value /= void

	set_error_reference (a_value: ECOM_HRESULT)
			-- Set error reference value.
		require
			non_void: a_value /= void

	set_integer (a_value: INTEGER)
			-- Set integer value.

	set_integer2 (a_value: INTEGER)
			-- Set short value

	set_integer2_reference (a_value: INTEGER_REF)
			-- Set reference short value
		require
			non_void: a_value /= void

	set_integer4 (a_value: INTEGER)
			-- Set long value

	set_integer4_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set integer ARRAY value
		require
			non_void_value: a_value /= void

	set_integer4_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set integer ARRAY value
		require
			non_void_value: a_value /= void

	set_integer4_reference (a_value: INTEGER_REF)
			-- Set reference long value
		require
			non_void: a_value /= void

	set_integer_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set Array of integers
		require
			non_void_value: a_value /= void

	set_integer_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set Array of integers
		require
			non_void_value: a_value /= void

	set_integer_reference (a_value: INTEGER_REF)
			-- Set reference integer value.
		require
			non_void: a_value /= void

	set_real4 (a_value: REAL)
			-- Set real value.

	set_real4_reference (a_value: REAL_REF)
			-- Set reference real value.
		require
			non_void: a_value /= void

	set_real8 (a_value: DOUBLE)
			-- Set double value.

	set_real8_reference (a_value: DOUBLE_REF)
			-- Set reference double value.
		require
			non_void: a_value /= void

	set_real_array (a_value: ECOM_ARRAY [REAL])
			-- Set ARRAY of reals
		require
			non_void_value: a_value /= void

	set_real_array_reference (a_value: CELL [ECOM_ARRAY [REAL]])
			-- Set ARRAY of reals
		require
			non_void_value: a_value /= void

	set_short_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set integer ARRAY value
		require
			non_void_value: a_value /= void

	set_short_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set integer ARRAY value
		require
			non_void_value: a_value /= void

	set_string (a_value: STRING)
			-- Set BSTR value.
		require
			non_void_string: a_value /= void

	set_string_array (a_value: ECOM_ARRAY [STRING])
			-- Set ARRAY of STRING.
		require
			non_void_value: a_value /= void

	set_string_array_reference (a_value: CELL [ECOM_ARRAY [STRING]])
			-- Set ARRAY of STRING.
		require
			non_void_value: a_value /= void

	set_string_reference (a_value: CELL [STRING])
			-- Set reference BSTR value.
		require
			non_void_string: a_value /= void
			valid_value: a_value.item /= void

	set_unknown_array (a_value: ECOM_ARRAY [ECOM_INTERFACE])
			-- Set ARRAY of ECOM_INTERFACEs.
		require
			non_void_value: a_value /= void

	set_unknown_interface (a_value: ECOM_INTERFACE)
			-- Set IUnknown interface value.
		require
			non_void: a_value /= void

	set_unknown_interface_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_INTERFACE]])
			-- Set ARRAY of ECOM_UNKNOWN_INTERFACEs.
		require
			non_void_value: a_value /= void

	set_unknown_interface_reference (a_value: CELL [ECOM_INTERFACE])
			-- Set IUnknown interface reference value.
		require
			non_void: a_value /= void

	set_unsigned_character (a_value: CHARACTER)
			-- Set unsigned character value

	set_unsigned_character_array (a_value: ECOM_ARRAY [CHARACTER])
			-- Set Array of unsigned character
		require
			non_void_value: a_value /= void

	set_unsigned_character_array_reference (a_value: CELL [ECOM_ARRAY [CHARACTER]])
			-- Set Array of unsigned character
		require
			non_void_value: a_value /= void

	set_unsigned_character_reference (a_value: CHARACTER_REF)
			-- Set reference byte value
		require
			non_void: a_value /= void

	set_unsigned_integer (a_value: INTEGER)
			-- Set unsigned integer value.

	set_unsigned_integer2 (a_value: INTEGER)
			-- Set unsigned short value

	set_unsigned_integer2_reference (a_value: INTEGER_REF)
			-- Set reference unsigned short value
		require
			non_void: a_value /= void

	set_unsigned_integer4 (a_value: INTEGER)
			-- Set unsigned long value

	set_unsigned_integer4_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set Array of unsigned long
		require
			non_void_value: a_value /= void

	set_unsigned_integer4_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set Array of unsigned long
		require
			non_void_value: a_value /= void

	set_unsigned_integer4_reference (a_value: INTEGER_REF)
			-- Set reference unsigned long value
		require
			non_void: a_value /= void

	set_unsigned_integer_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set Array of unsigned int
		require
			non_void_value: a_value /= void

	set_unsigned_integer_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set Array of unsigned int
		require
			non_void_value: a_value /= void

	set_unsigned_integer_reference (a_value: INTEGER_REF)
			-- Set reference unsigned integer value.
		require
			non_void: a_value /= void

	set_unsigned_short_array (a_value: ECOM_ARRAY [INTEGER])
			-- Set Array of unsigned short
		require
			non_void_value: a_value /= void

	set_unsigned_short_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER]])
			-- Set Array of unsigned short
		require
			non_void_value: a_value /= void

	set_variant (a_value: ECOM_VARIANT)
			-- Set variant value.
		require
			non_void_variant: a_value /= void
			valid: a_value.item /= default_pointer

	set_variant_array_reference (a_value: CELL [ECOM_ARRAY [ECOM_VARIANT]])
			-- Set ARRAY of ECOM_VARIANTs.
		require
			non_void_value: a_value /= void
	
feature -- Removal

	dispose
			-- Destroy the inner structure of Current.
			--
			-- This function should be called by the GC when the
			-- object is collected or by the user if Current is
			-- no more usefull.
			-- (from WEL_ANY)
	
feature -- Conversion

	to_integer: INTEGER
			-- Converts item to an integer.
			-- (from WEL_ANY)
		ensure -- from WEL_ANY
			Result = cwel_pointer_to_integer (item)
	
feature -- Basic operations

	initialize
			-- Fill Current with zeros.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			exists: exists

	initialize_with_character (a_character: CHARACTER)
			-- Fill current with a_character.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			exists: exists

	memory_copy (source_pointer: POINTER; length: INTEGER)
			-- Copy length bytes from source_pointer to item.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			length_small_enough: length <= structure_size
			length_large_enough: length > 0
			exists: exists
	
feature -- Basic Operations

	set_value (source: like Current)
			-- Set Current to 'source'.
			-- (from ECOM_STRUCTURE)
		require -- from ECOM_STRUCTURE
			non_void: source /= void
			valid_source: source.item /= default_pointer
	
feature -- Output

	out: STRING
			-- Printable representation of  value.
	
invariant

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class ECOM_VARIANT