indexing
	description: "COM VARIANT structure"
	legal: "See notice at end of class."
	status: "See notice at end of class."
	date: "$Date: 2006-08-12 20:35:13 -0700 (Sat, 12 Aug 2006) $"
	revision: "$Revision: 62480 $"

class interface
	ECOM_VARIANT

create 
	make
			-- Create new variant.
		require -- from  WEL_STRUCTURE
			True
		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

	make_from_character (a_value: CHARACTER_8)
			-- Initialize instance with character `a_value'.
		ensure
			character: character_value = a_value

	make_from_integer (a_value: INTEGER_32)
			-- Initialize instance with integer `a_value'.
		ensure
			integer: integer_value = a_value

	make_from_real (a_value: REAL_32)
			-- Initialize instance with real `a_value'.
		ensure
			real: real_value = a_value

	make_from_double (a_value: REAL_64)
			-- Make from double `a_value'.
		ensure
			double: double_value = a_value

	make_from_boolean (a_value: BOOLEAN)
			-- Initialize instance with boolean `a_value'.
		ensure
			boolean: boolean_value = a_value

	make_from_date (a_value: DATE_TIME)
			-- Initialize instance with date `a_value'.
		ensure
			date: date_value.is_equal (a_value)

	make_from_error (a_value: ECOM_HRESULT)
			-- Initialize instance with scode `a_value'.
		ensure
			error: error.is_equal (a_value)

	make_from_decimal (a_value: ECOM_DECIMAL)
			-- Initialize instance with decimal `a_value'.
		ensure
			decimal: decimal.is_equal (a_value)

	make_from_currency (a_value: ECOM_CURRENCY)
			-- Initialize instance with currency `a_value'.
		ensure
			currency: currency.is_equal (a_value)

	make_from_string (a_value: STRING_8)
			-- Initialize instance with string `a_value'.
		ensure
			string: string_value.is_equal (a_value)

	make_from_variant (a_value: ECOM_VARIANT)
			-- Initialize instance with variant `a_value'.
		ensure
			variant_value: variant_value.is_equal (a_value)

	make_from_iunknown (a_value: ECOM_INTERFACE)
			-- Initialize instance with IUnknown interface `a_value'.
		ensure
			iunknown: iunknown.item = a_value.item

	make_from_integer_array (a_value: ECOM_ARRAY [INTEGER_32])
			-- Initialize instance with integer array `a_value'.
		ensure
			integer_array: integer_array.is_equal (a_value)

	make_from_real_array (a_value: ECOM_ARRAY [REAL_32])
			-- Initialize instance with real array `a_value'.
		ensure
			real_array: real_array.is_equal (a_value)

	make_from_double_array (a_value: ECOM_ARRAY [REAL_64])
			-- Initialize instance with double array `a_value'.
		ensure
			double_array: double_array.is_equal (a_value)

	make_from_char_array (a_value: ECOM_ARRAY [CHARACTER_8])
			-- Initialize instance with char array `a_value'.
		ensure
			char_array: char_array.is_equal (a_value)

	make_from_error_array (a_value: ECOM_ARRAY [ECOM_HRESULT])
			-- Initialize instance with scode array `a_value'.
		ensure
			error_array: arrays_equal (error_array, a_value)

	make_from_currency_array (a_value: ECOM_ARRAY [ECOM_CURRENCY])
			-- Initialize instance with currency array `a_value'.
		ensure
			currency_array: arrays_equal (currency_array, a_value)

	make_from_date_array (a_value: ECOM_ARRAY [DATE_TIME])
			-- Initialize instance with date array `a_value'.
		ensure
			date_array: arrays_equal (date_array, a_value)

	make_from_string_array (a_value: ECOM_ARRAY [STRING_8])
			-- Initialize instance with string array `a_value'.
		ensure
			string_array: arrays_equal (string_array, a_value)

	make_from_boolean_array (a_value: ECOM_ARRAY [BOOLEAN])
			-- Initialize instance with boolean array `a_value'.
		ensure
			boolean_array: boolean_array.is_equal (a_value)

	make_from_decimal_array (a_value: ECOM_ARRAY [ECOM_DECIMAL])
			-- Initialize instance with decimal array `a_value'.
		ensure
			decimal_array: arrays_equal (decimal_array, a_value)

convert
	make_from_decimal_array ({POINTER}),
	make_from_decimal_array ({CHARACTER_8}),
	make_from_decimal_array ({INTEGER_32}),
	make_from_decimal_array ({REAL_32}),
	make_from_decimal_array ({REAL_64}),
	make_from_decimal_array ({BOOLEAN}),
	make_from_decimal_array ({DATE_TIME}),
	make_from_decimal_array ({ECOM_HRESULT}),
	make_from_decimal_array ({ECOM_DECIMAL}),
	make_from_decimal_array ({ECOM_CURRENCY}),
	make_from_decimal_array ({STRING_8}),
	make_from_decimal_array ({ECOM_INTERFACE}),
	make_from_decimal_array ({ECOM_ARRAY [INTEGER_32]}),
	make_from_decimal_array ({ECOM_ARRAY [REAL_32]}),
	make_from_decimal_array ({ECOM_ARRAY [REAL_64]}),
	make_from_decimal_array ({ECOM_ARRAY [BOOLEAN]}),
	make_from_decimal_array ({ECOM_ARRAY [CHARACTER_8]}),
	make_from_decimal_array ({ECOM_ARRAY [ECOM_HRESULT]}),
	make_from_decimal_array ({ECOM_ARRAY [ECOM_CURRENCY]}),
	make_from_decimal_array ({ECOM_ARRAY [DATE_TIME]}),
	make_from_decimal_array ({ECOM_ARRAY [STRING_8]}),
	make_from_decimal_array ({ECOM_ARRAY [ECOM_DECIMAL]})

feature -- Initialization

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

	make_from_boolean (a_value: BOOLEAN)
			-- Initialize instance with boolean `a_value'.
		ensure
			boolean: boolean_value = a_value

	make_from_boolean_array (a_value: ECOM_ARRAY [BOOLEAN])
			-- Initialize instance with boolean array `a_value'.
		ensure
			boolean_array: boolean_array.is_equal (a_value)

	make_from_char_array (a_value: ECOM_ARRAY [CHARACTER_8])
			-- Initialize instance with char array `a_value'.
		ensure
			char_array: char_array.is_equal (a_value)

	make_from_character (a_value: CHARACTER_8)
			-- Initialize instance with character `a_value'.
		ensure
			character: character_value = a_value

	make_from_currency (a_value: ECOM_CURRENCY)
			-- Initialize instance with currency `a_value'.
		ensure
			currency: currency.is_equal (a_value)

	make_from_currency_array (a_value: ECOM_ARRAY [ECOM_CURRENCY])
			-- Initialize instance with currency array `a_value'.
		ensure
			currency_array: arrays_equal (currency_array, a_value)

	make_from_date (a_value: DATE_TIME)
			-- Initialize instance with date `a_value'.
		ensure
			date: date_value.is_equal (a_value)

	make_from_date_array (a_value: ECOM_ARRAY [DATE_TIME])
			-- Initialize instance with date array `a_value'.
		ensure
			date_array: arrays_equal (date_array, a_value)

	make_from_decimal (a_value: ECOM_DECIMAL)
			-- Initialize instance with decimal `a_value'.
		ensure
			decimal: decimal.is_equal (a_value)

	make_from_decimal_array (a_value: ECOM_ARRAY [ECOM_DECIMAL])
			-- Initialize instance with decimal array `a_value'.
		ensure
			decimal_array: arrays_equal (decimal_array, a_value)

	make_from_double (a_value: REAL_64)
			-- Make from double `a_value'.
		ensure
			double: double_value = a_value

	make_from_double_array (a_value: ECOM_ARRAY [REAL_64])
			-- Initialize instance with double array `a_value'.
		ensure
			double_array: double_array.is_equal (a_value)

	make_from_error (a_value: ECOM_HRESULT)
			-- Initialize instance with scode `a_value'.
		ensure
			error: error.is_equal (a_value)

	make_from_error_array (a_value: ECOM_ARRAY [ECOM_HRESULT])
			-- Initialize instance with scode array `a_value'.
		ensure
			error_array: arrays_equal (error_array, a_value)

	make_from_integer (a_value: INTEGER_32)
			-- Initialize instance with integer `a_value'.
		ensure
			integer: integer_value = a_value

	make_from_integer_array (a_value: ECOM_ARRAY [INTEGER_32])
			-- Initialize instance with integer array `a_value'.
		ensure
			integer_array: integer_array.is_equal (a_value)

	make_from_iunknown (a_value: ECOM_INTERFACE)
			-- Initialize instance with IUnknown interface `a_value'.
		ensure
			iunknown: iunknown.item = a_value.item

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

	make_from_real (a_value: REAL_32)
			-- Initialize instance with real `a_value'.
		ensure
			real: real_value = a_value

	make_from_real_array (a_value: ECOM_ARRAY [REAL_32])
			-- Initialize instance with real array `a_value'.
		ensure
			real_array: real_array.is_equal (a_value)

	make_from_string (a_value: STRING_8)
			-- Initialize instance with string `a_value'.
		ensure
			string: string_value.is_equal (a_value)

	make_from_string_array (a_value: ECOM_ARRAY [STRING_8])
			-- Initialize instance with string array `a_value'.
		ensure
			string_array: arrays_equal (string_array, a_value)

	make_from_variant (a_value: ECOM_VARIANT)
			-- Initialize instance with variant `a_value'.
		ensure
			variant_value: variant_value.is_equal (a_value)
	
feature -- Access

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

	boolean_array_reference: CELL [ECOM_ARRAY [BOOLEAN]]
			-- ARRAY of BOOLEAN.
		require
			has_boolean: has_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_8]
			-- ARRAY of characters
		require
			has_character: has_character (variable_type)
			is_array: is_array (variable_type)

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

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

	character_value: CHARACTER_8
			-- 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
			has_currency: has_currency (variable_type)
			is_array: is_array (variable_type)

	currency_array_reference: CELL [ECOM_ARRAY [ECOM_CURRENCY]]
			-- ARRAY of CURRENCY
		require
			has_currency: has_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
			has_date: has_date (variable_type)
			is_array: is_array (variable_type)

	date_array_reference: CELL [ECOM_ARRAY [DATE_TIME]]
			-- ARRAY of DATE
		require
			has_date: has_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
			has_decimal: has_decimal (variable_type)
			is_array: is_array (variable_type)

	decimal_array_reference: CELL [ECOM_ARRAY [ECOM_DECIMAL]]
			-- ARRAY of ECOM_DECIMALs.
		require
			has_decimal: has_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)

	double_array: ECOM_ARRAY [REAL_64]
			-- ARRAY of doubles
		require
			has_double: has_double (variable_type)
			is_array: is_array (variable_type)

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

	double_reference: REAL_64_REF
			-- Reference double value
		require
			is_double_ref: is_double (variable_type) and is_byref (variable_type)

	double_value: REAL_64
			-- Double value
		require
			is_double: variable_type = vt_r8

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

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

	error_array_reference: CELL [ECOM_ARRAY [ECOM_HRESULT]]
			-- ARRAY of HRESULTs
		require
			has_error: has_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)

	generating_type: STRING_8
			-- Name of current object's generating type
			-- (type of which it is a direct instance)
			-- (from ANY)

	generator: STRING_8
			-- Name of current object's generating class
			-- (base class of the type of which it is a direct instance)
			-- (from ANY)

	idispatch: ECOM_AUTOMATION_INTERFACE
			-- IDispatch interface value
		require
			is_idispatch: is_idispatch (variable_type)

	idispatch_array: ECOM_ARRAY [ECOM_AUTOMATION_INTERFACE]
			-- ARRAY of ECOM_AUTOMATION_INTERFACEs.
		require
			has_idispatch: has_idispatch (variable_type)
			is_array: is_array (variable_type)

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

	idispatch_reference: CELL [ECOM_AUTOMATION_INTERFACE]
			-- IDispatch interface reference value
		require
			is_idispatch_ref: has_idispatch (variable_type) and is_byref (variable_type)

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

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

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

	integer4_array: ECOM_ARRAY [INTEGER_32]
			-- Integer ARRAY value
		require
			has_integer4: has_integer4 (variable_type)
			is_array: is_array (variable_type)

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

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

	integer_array: ECOM_ARRAY [INTEGER_32]
			-- Array of integers
		require
			has_int: has_int (variable_type)
			is_array: is_array (variable_type)

	integer_array_reference: CELL [ECOM_ARRAY [INTEGER_32]]
			-- Array of integers
		require
			has_int: has_int (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

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

	integer_value: INTEGER_32
			-- 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)

	iunknown: ECOM_UNKNOWN_INTERFACE
			-- IUnknown interface value
		require
			is_iunknown: is_iunknown (variable_type)

	iunknown_array: ECOM_ARRAY [ECOM_UNKNOWN_INTERFACE]
			-- ARRAY of ECOM_UNKNOWN_INTERFACEs.
		require
			has_iunknown: has_iunknown (variable_type)
			is_array: is_array (variable_type)

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

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

	real_array: ECOM_ARRAY [REAL_32]
			-- ARRAY of reals
		require
			has_real: has_real (variable_type)
			is_array: is_array (variable_type)

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

	real_reference: REAL_32_REF
			-- Reference real value
		require
			is_real_ref: is_real (variable_type) and is_byref (variable_type)

	real_value: REAL_32
			-- Real value
		require
			is_real: variable_type = vt_r4

	short_array: ECOM_ARRAY [INTEGER_32]
			-- Integer ARRAY value
		require
			has_integer2: has_integer2 (variable_type)
			is_array: is_array (variable_type)

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

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

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

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

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

	unsigned_character_array: ECOM_ARRAY [CHARACTER_8]
			-- Array of unsigned character
		require
			has_unsigned_char: has_unsigned_char (variable_type)
			is_array: is_array (variable_type)

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

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

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

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

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

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

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

	unsigned_integer4_array: ECOM_ARRAY [INTEGER_32]
			-- Array of unsigned long
		require
			has_unsigned_long: has_unsigned_long (variable_type)
			is_array: is_array (variable_type)

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

	unsigned_integer4_reference: INTEGER_32_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_32]
			-- Array of unsigned int
		require
			has_unsigned_int: has_unsigned_int (variable_type)
			is_array: is_array (variable_type)

	unsigned_integer_array_reference: CELL [ECOM_ARRAY [INTEGER_32]]
			-- Array of unsigned int
		require
			has_unsigned_int: has_unsigned_int (variable_type)
			is_array: is_array (variable_type)
			is_byref: is_byref (variable_type)

	unsigned_integer_reference: INTEGER_32_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_32]
			-- Array of unsigned short
		require
			has_unsigned_short: has_unsigned_short (variable_type)
			is_array: is_array (variable_type)

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

	variable_type: INTEGER_32
			-- Variable type

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

	variant_array_reference: CELL [ECOM_ARRAY [ECOM_VARIANT]]
			-- ARRAY of ECOM_VARIANTs.
		require
			has_variant: has_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_32
			-- A Safe array of data is passed
			-- (from ECOM_VAR_TYPE)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	structure_size: INTEGER_32
			-- Size of VARIANT structure
		ensure -- from WEL_STRUCTURE
			positive_result: Result > 0
	
feature -- Comparison

	arrays_equal (a_array, a_other: ECOM_ARRAY [ANY]): BOOLEAN
			-- Are `a_array' and `a_other' equal using object comparison?
		require
			attached_array: a_array /= Void
			attached_other: a_other /= Void
		ensure
			array_comparison_unchanged: a_array.object_comparison = old a_array.object_comparison
			other_comparison_unchanged: a_other.object_comparison = old a_other.object_comparison

	frozen deep_equal (some: ANY; other: like arg #1): BOOLEAN
			-- Are `some' and `other' either both void
			-- or attached to isomorphic object structures?
			-- (from ANY)
		ensure -- from ANY
			shallow_implies_deep: standard_equal (some, other) implies Result
			both_or_none_void: (some = Void) implies (Result = (other = Void))
			same_type: (Result and (some /= Void)) implies some.same_type (other)
			symmetric: Result implies deep_equal (other, some)

	frozen equal (some: ANY; other: like arg #1): BOOLEAN
			-- Are `some' and `other' either both void or attached
			-- to objects considered equal?
			-- (from ANY)
		ensure -- from ANY
			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.is_equal (other))

	frozen standard_equal (some: ANY; other: like arg #1): BOOLEAN
			-- Are `some' and `other' either both void or attached to
			-- field-by-field identical objects of the same type?
			-- Always uses default object comparison criterion.
			-- (from ANY)
		ensure -- from ANY
			definition: Result = (some = Void and other = Void) or else ((some /= Void and other /= Void) and then some.standard_is_equal (other))

	frozen standard_is_equal (other: like Current): BOOLEAN
			-- Is `other' attached to an object of the same type
			-- as current object, and field-by-field identical to it?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			same_type: Result implies same_type (other)
			symmetric: Result implies other.standard_is_equal (Current)
	
feature -- Status report

	conforms_to (other: ANY): BOOLEAN
			-- Does type of current object conform to type
			-- of `other' (as per Eiffel: The Language, chapter 13)?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void

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

	has_boolean (variable_type: INTEGER_32): BOOLEAN
			-- Is variable boolean or boolen array or boolean pointer?
			-- (from ECOM_VAR_TYPE)

	has_bstr (variable_type: INTEGER_32): BOOLEAN
			-- Is variable bstr or bstr array or bstr pointer?
			-- (from ECOM_VAR_TYPE)

	has_character (variable_type: INTEGER_32): BOOLEAN
			-- Is variable character or character array or character pointer?
			-- (from ECOM_VAR_TYPE)

	has_currency (variable_type: INTEGER_32): BOOLEAN
			-- Is variable currency or currency array or currency pointer?
			-- (from ECOM_VAR_TYPE)

	has_date (variable_type: INTEGER_32): BOOLEAN
			-- Is variable date or date array or date pointer?
			-- (from ECOM_VAR_TYPE)

	has_decimal (variable_type: INTEGER_32): BOOLEAN
			-- Is variable decimal or decimal array or decimal pointer?
			-- (from ECOM_VAR_TYPE)

	has_double (variable_type: INTEGER_32): BOOLEAN
			-- Is variable double or double array or double pointer?
			-- (from ECOM_VAR_TYPE)

	has_error (variable_type: INTEGER_32): BOOLEAN
			-- Is variable error or error array or error pointer?
			-- (from ECOM_VAR_TYPE)

	has_hresult (variable_type: INTEGER_32): BOOLEAN
			-- Is variable HRESULT or HRESULT array or HRESULT pointer?
			-- (from ECOM_VAR_TYPE)

	has_idispatch (variable_type: INTEGER_32): BOOLEAN
			-- Is variable IDispatch interface pointer or IDispatch interface pointer array or IDispatch interface pointer pointer?
			-- (from ECOM_VAR_TYPE)

	has_int (variable_type: INTEGER_32): BOOLEAN
			-- Is variable int or int array or int pointer?
			-- (from ECOM_VAR_TYPE)

	has_integer2 (variable_type: INTEGER_32): BOOLEAN
			-- Is variable short integer or short integer array or short integer pointer?
			-- (from ECOM_VAR_TYPE)

	has_integer4 (variable_type: INTEGER_32): BOOLEAN
			-- Is variable long integer or long integer array or long integer pointer?
			-- (from ECOM_VAR_TYPE)

	has_iunknown (variable_type: INTEGER_32): BOOLEAN
			-- Is variable IUnknown interface pointer or IUnknown interface pointer array or IUnknown interface pointer pointer?
			-- (from ECOM_VAR_TYPE)

	has_long_long (variable_type: INTEGER_32): BOOLEAN
			-- Is variable long long or long long array or long long pointer?
			-- (from ECOM_VAR_TYPE)

	has_ptr (variable_type: INTEGER_32): BOOLEAN
			-- Is variable ptr or ptr array or ptr pointer?
			-- (from ECOM_VAR_TYPE)

	has_real (variable_type: INTEGER_32): BOOLEAN
			-- Is variable real or real array or real pointer?
			-- (from ECOM_VAR_TYPE)

	has_unsigned_char (variable_type: INTEGER_32): BOOLEAN
			-- Is variable unsigned char or unsigned char array or unsigned char pointer?
			-- (from ECOM_VAR_TYPE)

	has_unsigned_int (variable_type: INTEGER_32): BOOLEAN
			-- Is variable unsigned int or unsigned int array or unsigned int pointer?
			-- (from ECOM_VAR_TYPE)

	has_unsigned_long (variable_type: INTEGER_32): BOOLEAN
			-- Is variable unsigned long or unsigned long array or unsigned long pointer?
			-- (from ECOM_VAR_TYPE)

	has_unsigned_long_long (variable_type: INTEGER_32): BOOLEAN
			-- Is variable unsigned long long or unsigned long long array or unsigned long long pointer?
			-- (from ECOM_VAR_TYPE)

	has_unsigned_short (variable_type: INTEGER_32): BOOLEAN
			-- Is variable unsigned short or unsigned short array or unsigned short pointer?
			-- (from ECOM_VAR_TYPE)

	has_variant (variable_type: INTEGER_32): BOOLEAN
			-- Is variable variant or variant array or variant pointer?
			-- (from ECOM_VAR_TYPE)

	has_void (variable_type: INTEGER_32): BOOLEAN
			-- Is variable void or void array or void pointer?
			-- (from ECOM_VAR_TYPE)

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

	is_basic (a_type: INTEGER_32): BOOLEAN
			-- Is `a_type' basic type?
			-- (from ECOM_VAR_TYPE)

	is_boolean (variable_type: INTEGER_32): BOOLEAN
			-- Is variable boolean?
			-- (from ECOM_VAR_TYPE)

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

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

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

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

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

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

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

	is_double (variable_type: INTEGER_32): BOOLEAN
			-- Is variable double?
			-- (from ECOM_VAR_TYPE)

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

	is_hresult (variable_type: INTEGER_32): BOOLEAN
			-- Is variable HRESULT?
			-- (from ECOM_VAR_TYPE)

	is_idispatch (variable_type: INTEGER_32): BOOLEAN
			-- Is IDispatch interface pointer?
			-- (from ECOM_VAR_TYPE)

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

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

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

	is_iunknown (variable_type: INTEGER_32): BOOLEAN
			-- Is IUnknown interface pointer?
			-- (from ECOM_VAR_TYPE)

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

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

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

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

	is_real (variable_type: INTEGER_32): BOOLEAN
			-- Is variable real?
			-- (from ECOM_VAR_TYPE)

	is_record (variable_type: INTEGER_32): BOOLEAN
			-- Is variable a Record? (i.e. a C struct)
			-- (from ECOM_VAR_TYPE)

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

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

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

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

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

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

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

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

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

	same_type (other: ANY): BOOLEAN
			-- Is type of current object identical to type of `other'?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			definition: Result = (conforms_to (other) and other.conforms_to (Current))

	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_32): 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_8])
			-- Set ARRAY of characters
		require
			non_void_value: a_value /= Void

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

	set_character (a_char: CHARACTER_8)
			-- Set character value.
		ensure
			set: character_value = a_char

	set_character_reference (a_char: CHARACTER_8_REF)
			-- Set reference character value
		require
			non_void: a_char /= Void
		ensure
			set: character_reference = a_char

	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_double (a_value: REAL_64)
			-- Set double value.

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

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

	set_double_reference (a_value: REAL_64_REF)
			-- Set reference double value.
		require
			non_void: 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_idispatch (a_value: ECOM_INTERFACE)
			-- Set IDispatch interface value.
		require
			non_void: a_value /= Void

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

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

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

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

	set_integer2 (a_value: INTEGER_32)
			-- Set short value

	set_integer2_reference (a_value: INTEGER_32_REF)
			-- Set reference short value
		require
			non_void: a_value /= Void

	set_integer4 (a_value: INTEGER_32)
			-- Set long value

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

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

	set_integer4_reference (a_value: INTEGER_32_REF)
			-- Set reference long value
		require
			non_void: a_value /= Void

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

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

	set_integer_reference (a_value: INTEGER_32_REF)
			-- Set reference integer value.
		require
			non_void: a_value /= Void

	set_iunknown (a_value: ECOM_INTERFACE)
			-- Set IUnknown interface value.
		require
			non_void: a_value /= Void

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

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

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

	set_real (a_value: REAL_32)
			-- Set real value.

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

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

	set_real_reference (a_value: REAL_32_REF)
			-- Set reference real value.
		require
			non_void: a_value /= Void

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

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

	set_string (a_value: STRING_8)
			-- Set BSTR value.
		require
			non_void_string: a_value /= Void

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

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

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

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

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

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

	set_unsigned_character_reference (a_value: CHARACTER_8_REF)
			-- Set reference byte value
		require
			non_void: a_value /= Void

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

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

	set_unsigned_integer2_reference (a_value: INTEGER_32_REF)
			-- Set reference unsigned short value
		require
			non_void: a_value /= Void

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

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

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

	set_unsigned_integer4_reference (a_value: INTEGER_32_REF)
			-- Set reference unsigned long value
		require
			non_void: a_value /= Void

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

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

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

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

	set_unsigned_short_array_reference (a_value: CELL [ECOM_ARRAY [INTEGER_32]])
			-- 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 -- Duplication

	frozen deep_copy (other: like Current)
			-- Effect equivalent to that of:
			--		copy (`other' . deep_twin)
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			deep_equal: deep_equal (Current, other)

	frozen deep_twin: like Current
			-- New object structure recursively duplicated from Current.
			-- (from ANY)
		ensure -- from ANY
			deep_equal: deep_equal (Current, Result)

	frozen standard_copy (other: like Current)
			-- Copy every field of `other' onto corresponding field
			-- of current object.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_standard_equal: standard_is_equal (other)

	frozen standard_twin: like Current
			-- New object field-by-field identical to `other'.
			-- Always uses default copying semantics.
			-- (from ANY)
		ensure -- from ANY
			standard_twin_not_void: Result /= Void
			equal: standard_equal (Result, Current)

	frozen twin: like Current
			-- New object equal to `Current'
			-- twin calls copy; to change copying/twining semantics, redefine copy.
			-- (from ANY)
		ensure -- from ANY
			twin_not_void: Result /= Void
			is_equal: Result.is_equal (Current)
	
feature -- Basic operations

	copy (other: like Current)
			-- Update current object using fields of object attached
			-- to `other', so as to yield equal objects.
			-- (from WEL_STRUCTURE)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_equal: is_equal (other)

	frozen default: like Current
			-- Default value of object's type
			-- (from ANY)

	frozen default_pointer: POINTER
			-- Default value of type `POINTER'
			-- (Avoid the need to write `p'.default for
			-- some `p' of type `POINTER'.)
			-- (from ANY)

	default_rescue
			-- Process exception for routines with no Rescue clause.
			-- (Default: do nothing.)
			-- (from ANY)

	frozen do_nothing
			-- Execute a null action.
			-- (from ANY)

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

	initialize_with_character (a_character: CHARACTER_8)
			-- Fill current with `a_character'.
			-- (from WEL_STRUCTURE)
		require -- from WEL_STRUCTURE
			exists: exists

	is_equal (other: like Current): BOOLEAN
			-- Is `other' attached to an object considered
			-- equal to current object?
			-- (from WEL_STRUCTURE)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			symmetric: Result implies other.is_equal (Current)
			consistent: standard_is_equal (other) implies Result

	memory_copy (source_pointer: POINTER; length: INTEGER_32)
			-- 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

	io: STD_FILES
			-- Handle to standard file setup
			-- (from ANY)

	out: STRING_8
			-- Printable representation of  value.

	print (some: ANY)
			-- Write terse external representation of `some'
			-- on standard output.
			-- (from ANY)

	frozen tagged_out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- Was declared in ANY as synonym of out.
			-- (from ANY)
	
feature -- Platform

	operating_environment: OPERATING_ENVIRONMENT
			-- Objects available from the operating system
			-- (from ANY)
	
invariant
		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

indexing
	copyright: "Copyright (c) 1984-2006, Eiffel Software and others"
	license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
	source: "[
		Eiffel Software
		356 Storke Road, 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 ECOM_VARIANT