    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