#ifndef TCI_C_H
#define TCI_C_H

#include "Shared/TciData.h"
#include "Shared/TciCallbacks.h"

///////////////////////////////////////Type

	TciModuleIdType tciGetDefiningModule(Type inst);
	String tciGetName(Type inst);
	TciTypeClass tciGetTypeClass(Type inst);
	Value tciNewInstance(Type inst);
	String tciGetTypeEncoding(Type inst);
	String* getTypeExtension(Type inst);
	String tciGetTypeEncodingVariant(Type inst);

///////////////////////////////////////Value

	String tciGetValueEncoding(Value inst);
	String tciGetValueEncodingVariant(Value inst);
	Type tciGetType(Value inst);
	Boolean tciNotPresent(Value inst);
	void tciSetNull(Value inst);
	Boolean tciIsNull(Value inst);

///////////////////////////////////////IntegerValue

	String tciGetIntAbs(Value inst);
	unsigned long int tciIntGetNumberOfDigits(Value inst);
	Boolean tciGetIntSign(Value inst);
	char tciGetIntDigit(Value inst, unsigned long int position);

	void tciSetIntAbs(Value inst, String value);
	void tciSetNumberOfDigits(Value inst, unsigned long int dig_num);
	void tciSetIntSign(Value inst, Boolean sign);
	void tciSetIntDigit(Value inst, unsigned long int position, char digit);

///////////////////////////////////////FloatValue

	double tciGetFloatValue(Value inst);
	void tciSetFloatValue(Value inst, double value);

///////////////////////////////////////BooleanValue

	Boolean tciGetBooleanValue(Value inst);
	void tciSetBooleanValue(Value inst, Boolean value);

///////////////////////////////////////ObjidValue

	TciObjidValue tciGetTciObjidValue(Value inst);
	void tciSetObjidValue(Value inst, TciObjidValue value);

///////////////////////////////////////CharstringValue

	TciCharStringValue tciGetCStringValue(Value inst);
	unsigned long int tciGetCStringLength (Value inst);
	char tciGetCStringCharValue(Value inst, long int position);

	void tciSetCStringCharValue(Value inst, long int position, char value);
	void tciSetCStringValue(Value inst, TciCharStringValue value);
	void tciSetCStringLength(Value inst, unsigned long int len);

///////////////////////////////////////UniversalCharstring
//methods
//get
	TciUCStringValue tciGetUCStringValue(Value inst);
	unsigned long int tciGetUCStringLength(Value inst);
	//void tciGetUCStringCharValue(Value inst, unsigned long int position, TciUCValue result);
	wchar_t tciGetUCStringCharValue(Value inst, unsigned long int position);
//set
	//void tciSetUCStringCharValue(Value inst, unsigned long int position, TciUCValue value);
	void tciSetUCStringCharValue(Value inst, unsigned long int position, wchar_t value);
	void tciSetUCStringValue(Value inst, TciUCStringValue value);
	void tciSetUCStringLength(Value inst, unsigned long int len);

///////////////////////////////////////BitstringValue
//methods
//get
	String tciGetBStringValue(Value inst);
	unsigned long int tciGetBStringLength(Value inst);
	int tciGetBStringBitValue(Value inst, long int position);
//set
	void tciSetBStringBitValue(Value inst, unsigned long int position, int value);
	void tciSetBStringValue(Value inst, String value);
	void tciSetBStringLength(Value inst,long int len);

///////////////////////////////////////HexstringValue
//methods
//get
	String tciGetHStringValue(Value inst);
	long int tciGetHStringLength(Value inst);
	int tciGetHStringHexValue(Value inst, unsigned long int position);
//set
	void tciSetHStringHexValue(Value inst, unsigned long int position, int value);
	void tciSetHStringValue(Value inst, String value);	
	void tciSetHStringLength(Value inst, unsigned long int len);

///////////////////////////////////////OctetstringValue
//methods
//get
	String tciGetOStringValue(Value inst);
	unsigned long int tciGetOStringLength(Value inst);
	int tciGetOStringOctetValue(Value inst, unsigned long int position);
//set
	void tciSetOStringOctetValue(Value inst, unsigned long int position, int value);
	void tciSetOStringValue(Value inst, String value);
	void tciSetOStringLength(Value inst, unsigned long int len);

///////////////////////////////////////RecordValue
//methods
//
	Value tciGetRecFieldValue(Value inst, String fieldName);
	void tciSetRecFieldValue(Value inst, String fieldName, Value value);
	char** tciGetRecFieldNames(Value inst);
	void setFieldOmitted(Value inst, String fieldName);


///////////////////////////////////////RecordOfValue
//methods
//get
	Type tciGetRecOfElementType(Value inst);
	Value tciGetRecOfFieldValue(Value inst, unsigned long int position);
	unsigned long int tciGetRecOfLength(Value inst);
//set
	void tciAppendRecOfFieldValue(Value inst, Value value);
	void tciSetRecOfFieldValue(Value inst, unsigned long int position, Value value);
	void tciSetRecOfLength(Value inst, unsigned long int len);

///////////////////////////////////////UnionValue
//methods
//
	Value tciGetUnionVariant(Value inst, String variantName);
	void tciSetUnionVariant(Value inst, String variantName, Value value);
	String tciGetUnionPresentVariantName(Value inst);
	char** tciGetUnionVariantNames(Value inst);

///////////////////////////////////////EnumeratedValue
//methods
//
	String tciGetEnumValue(Value inst);
	void tciSetEnumValue(Value inst, String enumValue);
	unsigned long tciGetEnumInt(Value inst);
	void tciSetEnumInt(Value inst, unsigned long intValue);


///////////////////////////////////////VerdictValue
//methods
//
	int tciGetVerdictValue(Value inst);
	void tciSetVerdictValue(Value inst, int verdict);

///////////////////////////////////////AddressValue
//methods
//
	Value tciGetAddressValue(Value inst);
	void tciSetAddressValue(Value inst, Value value);

///////////////////////////////////////CharValue
//methods
//
	char tciGetCharValue(Value inst);
	void tciSetCharValue(Value inst, char value);

///////////////////////////////////////UniversalCharValue
//methods
//
	void tciGetUCharValue(Value inst, TciUCValueOld value);
	void tciSetUCharValue(Value inst, TciUCValueOld value);

///////////////////////////////////////TciValueTemplate
//methods
//
	Boolean tciIsOmit(TciValueTemplate inst);
	Boolean tciIsAny(TciValueTemplate inst);
	Boolean tciIsAnyOrOmit(TciValueTemplate inst);
	String tciGetTemplateDef(TciValueTemplate inst);
///////////////////////////////////////TciNonValueTemplate
//methods
//
	Boolean tciIsAnyNonValue(TciNonValueTemplate inst);
	Boolean tciIsAllNonValue(TciNonValueTemplate inst);
	String tciGetTemplateDefNonValue(TciNonValueTemplate inst);
///////////////////////////////////////TciValueList
//methods
//
	int tciGetValueListSize(TciValueList inst);
	Boolean tciIsValueListEmpty(TciValueList inst);
	Value tciGetValueListItem(TciValueList inst, int index);
#endif
