namespace WindowsApplicationProve
{
	namespace Cxxx
	{
		[Serializable]
		public struct OtherStruct
		{
		  public int FInt;
		}

		[Serializable]
		public struct StructSample
		  {
			public int  FInt;
			public char FChar;
			public  object FObj;			
		  }
        [Serializable]
		public enum EnumSample
		  {
			aa,
			bb,
		    cc
		  }

		[Serializable]
		public delegate int DelegateProve(int i);

		[Serializable]
		public delegate void OtherDelegate();

		public interface ISample
		{
			int FirstMethod(char charParam);
		}


		[Serializable]
		public class cIntProve: ISample
		{
			public long FLongField;
			public int FirstMethod(char charParam)
			{
				return 6;
			}
		}

		public delegate string DlgProve(int i);

		[Serializable]
		public class  cAgregationClass:BaseClass
		{
			public Char FCharField;
			public string FStr;
			public cSerializableProve Fobj;
			public ISample Fintf;			
			//public int[][] FIntList;
			public string DlgCatcher(int i)
			{
				return "Hello"; 
			}
    	}

		[Serializable]
		public class BaseClass
		  {
			public int FBaseint;
			public cIntProve FIntObj;
		  }
		[Serializable]
		public class cXXX
		{
			public int FI;
		}

		[Serializable]
		public class cSerializableProve
		{		
			public object[]          FArrayProve;
			public object[]          FNullArray;
			//public ClassProve        FOtherAssObj;
			public cAgregationClass  FAggField;			
			//value types
			public DelegateProve     FDelegateProve;		
			public event  OtherDelegate FEventField;						
			public ISample           FInterfaceField;
			public string            FStrField;
			private int              FPintField;
			public int               FIntField;
			public uint              FUintField;			
			public short             FShortField;
			public ushort            FUShortField;
			public long              FLongField;
			public ulong             FULongField;
			public bool              FBoolField;
			public double            FDoubleField;
			public decimal           FDecimalField;
			public char              FCharField;			
			public StructSample      FStructField;						
			public EnumSample        FEnumField;	
		
			public  cSerializableProve()
			{		    	
				InitReferences();
				InitSimpleTypes();
				InitStructs();							
				InitArray();
			}

			private void InitReferences()
			{
				FAggField = new cAgregationClass();
				FAggField.FCharField = 'a';
				FAggField.FBaseint = 10;
				FAggField.Fobj= this;				
				FAggField.FStr= "Hhhh";
				FStrField= FAggField.FStr;								
				FAggField.FIntObj= new cIntProve ();
				FInterfaceField= FAggField.FIntObj;
				FAggField.Fintf= FInterfaceField;						        			
			}

			private void InitSimpleTypes()
			{
				FArrayProve= new Object[20];
				FPintField= 10;
				FIntField = 6;				
				FUintField = 6;
				FShortField = 6;
				FUShortField = 6;
				FLongField = 6;
				FULongField = 6;
				FDoubleField = 6;
				FDecimalField = 5;
				FBoolField = true;
				FCharField = 'a';
				FEnumField = EnumSample.aa;
			}

			private void InitStructs()
			{
              FStructField= new StructSample();				 
			  FStructField.FChar= 'a';
              FStructField.FInt= 10;
			  FStructField.FObj= this.FAggField;              
			}

			private void InitArray()
			{
				FArrayProve[0]= new cAgregationClass();
                ((cAgregationClass)FArrayProve[0]).FStr= "Hello";
				FArrayProve[1]= new cAgregationClass[2];
				((cAgregationClass[])FArrayProve[1])[0]= this.FAggField;				
				FArrayProve[2]= new int[][][]{new int[][]{new int[3], new int[3], new int[3]}, new int[][]{new int[3], new int[3], new int[3]}};
				/*Fill the integer array*/
				((int[][][])FArrayProve[2])[1][1][1]= 10;
				((int[][][])FArrayProve[2])[1][1][2]= 10;
				((int[][][])FArrayProve[2])[1][1][0]= 10;				
				FArrayProve[3]= new OtherStruct();				
				FArrayProve[4]= 6;
				FArrayProve[5]= true;
				FArrayProve[6]= 2.5;
				FArrayProve[7]= EnumSample.bb;
				FArrayProve[8]= this.FInterfaceField; 	
				FArrayProve[9]= "Hello";
				FArrayProve[10]= new UInt32();
				FArrayProve[11]= new short();
				FArrayProve[12]= new UInt16();
				FArrayProve[13]=  new decimal();			
				FArrayProve[15]= new ulong();
				FArrayProve[16]= new char();				
				FArrayProve[18]= null;  
			}

			public void InitDelegates()
			{             
			  FDelegateProve= new DelegateProve(SIntProve);              
		      FEventField= new OtherDelegate(OtherProve);
			}