//
// MetadataRowWriter.cs
//
// Author:
//   Jb Evain (jbevain@gmail.com)
//
// Generated by /CodeGen/cecil-gen.rb do not edit
// Sat Feb 16 23:24:17 +0100 2008
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

namespace Mono.Cecil.Metadata {

	using System;
	using System.Collections;

	using Mono.Cecil.Binary;

	sealed class MetadataRowWriter : BaseMetadataRowVisitor {

		MetadataRoot m_root;
		MemoryBinaryWriter m_binaryWriter;

		Utilities.TableRowCounter m_counter;
		int [] m_ciCache;

		int m_blobHeapIdxSz;
		int m_stringsHeapIdxSz;
		int m_guidHeapIdxSz;

		public MetadataRowWriter (MetadataTableWriter mtwv)
		{
			m_binaryWriter = mtwv.GetWriter ();
			m_root = mtwv.GetMetadataRoot ();
			m_ciCache = new int [13];
			m_counter = new Utilities.TableRowCounter (GetNumberOfRows);
		}

		void WriteBlobPointer (uint pointer)
		{
			WriteByIndexSize (pointer, m_blobHeapIdxSz);
		}

		void WriteStringPointer (uint pointer)
		{
			WriteByIndexSize (pointer, m_stringsHeapIdxSz);
		}

		void WriteGuidPointer (uint pointer)
		{
			WriteByIndexSize (pointer, m_guidHeapIdxSz);
		}

		void WriteTablePointer (uint pointer, int rid)
		{
			WriteByIndexSize (pointer, GetNumberOfRows (rid) < (1 << 16) ? 2 : 4);
		}

		void WriteMetadataToken (MetadataToken token, CodedIndex ci)
		{
			WriteByIndexSize (Utilities.CompressMetadataToken (ci, token),
				Utilities.GetCodedIndexSize (ci, m_counter, m_ciCache));
		}

		int GetNumberOfRows (int rid)
		{
			IMetadataTable t = m_root.Streams.TablesHeap [rid];
			if (t == null || t.Rows == null)
				return 0;
			return t.Rows.Count;
		}

		void WriteByIndexSize (uint value, int size)
		{
			if (size == 4)
				m_binaryWriter.Write (value);
			else if (size == 2)
				m_binaryWriter.Write ((ushort) value);
			else
				throw new MetadataFormatException ("Non valid size for indexing");
		}

		public AssemblyRow CreateAssemblyRow (AssemblyHashAlgorithm _hashAlgId, ushort _majorVersion, ushort _minorVersion, ushort _buildNumber, ushort _revisionNumber, AssemblyFlags _flags, uint _publicKey, uint _name, uint _culture)
		{
			AssemblyRow row = new AssemblyRow ();
			row.HashAlgId = _hashAlgId;
			row.MajorVersion = _majorVersion;
			row.MinorVersion = _minorVersion;
			row.BuildNumber = _buildNumber;
			row.RevisionNumber = _revisionNumber;
			row.Flags = _flags;
			row.PublicKey = _publicKey;
			row.Name = _name;
			row.Culture = _culture;
			return row;
		}

		public AssemblyOSRow CreateAssemblyOSRow (uint _oSPlatformID, uint _oSMajorVersion, uint _oSMinorVersion)
		{
			AssemblyOSRow row = new AssemblyOSRow ();
			row.OSPlatformID = _oSPlatformID;
			row.OSMajorVersion = _oSMajorVersion;
			row.OSMinorVersion = _oSMinorVersion;
			return row;
		}

		public AssemblyProcessorRow CreateAssemblyProcessorRow (uint _processor)
		{
			AssemblyProcessorRow row = new AssemblyProcessorRow ();
			row.Processor = _processor;
			return row;
		}

		public AssemblyRefRow CreateAssemblyRefRow (ushort _majorVersion, ushort _minorVersion, ushort _buildNumber, ushort _revisionNumber, AssemblyFlags _flags, uint _publicKeyOrToken, uint _name, uint _culture, uint _hashValue)
		{
			AssemblyRefRow row = new AssemblyRefRow ();
			row.MajorVersion = _majorVersion;
			row.MinorVersion = _minorVersion;
			row.BuildNumber = _buildNumber;
			row.RevisionNumber = _revisionNumber;
			row.Flags = _flags;
			row.PublicKeyOrToken = _publicKeyOrToken;
			row.Name = _name;
			row.Culture = _culture;
			row.HashValue = _hashValue;
			return row;
		}

		public AssemblyRefOSRow CreateAssemblyRefOSRow (uint _oSPlatformID, uint _oSMajorVersion, uint _oSMinorVersion, uint _assemblyRef)
		{
			AssemblyRefOSRow row = new AssemblyRefOSRow ();
			row.OSPlatformID = _oSPlatformID;
			row.OSMajorVersion = _oSMajorVersion;
			row.OSMinorVersion = _oSMinorVersion;
			row.AssemblyRef = _assemblyRef;
			return row;
		}

		public AssemblyRefProcessorRow CreateAssemblyRefProcessorRow (uint _processor, uint _assemblyRef)
		{
			AssemblyRefProcessorRow row = new AssemblyRefProcessorRow ();
			row.Processor = _processor;
			row.AssemblyRef = _assemblyRef;
			return row;
		}

		public ClassLayoutRow CreateClassLayoutRow (ushort _packingSize, uint _classSize, uint _parent)
		{
			ClassLayoutRow row = new ClassLayoutRow ();
			row.PackingSize = _packingSize;
			row.ClassSize = _classSize;
			row.Parent = _parent;
			return row;
		}

		public ConstantRow CreateConstantRow (ElementType _type, MetadataToken _parent, uint _value)
		{
			ConstantRow row = new ConstantRow ();
			row.Type = _type;
			row.Parent = _parent;
			row.Value = _value;
			return row;
		}

		public CustomAttributeRow CreateCustomAttributeRow (MetadataToken _parent, MetadataToken _type, uint _value)
		{
			CustomAttributeRow row = new CustomAttributeRow ();
			row.Parent = _parent;
			row.Type = _type;
			row.Value = _value;
			return row;
		}

		public DeclSecurityRow CreateDeclSecurityRow (SecurityAction _action, MetadataToken _parent, uint _permissionSet)
		{
			DeclSecurityRow row = new DeclSecurityRow ();
			row.Action = _action;
			row.Parent = _parent;
			row.PermissionSet = _permissionSet;
			return row;
		}

		public EventRow CreateEventRow (EventAttributes _eventFlags, uint _name, MetadataToken _eventType)
		{
			EventRow row = new EventRow ();
			row.EventFlags = _eventFlags;
			row.Name = _name;
			row.EventType = _eventType;
			return row;
		}

		public EventMapRow CreateEventMapRow (uint _parent, uint _eventList)
		{
			EventMapRow row = new EventMapRow ();
			row.Parent = _parent;
			row.EventList = _eventList;
			return row;
		}

		public EventPtrRow CreateEventPtrRow (uint _event)
		{
			EventPtrRow row = new EventPtrRow ();
			row.Event = _event;
			return row;
		}

		public ExportedTypeRow CreateExportedTypeRow (TypeAttributes _flags, uint _typeDefId, uint _typeName, uint _typeNamespace, MetadataToken _implementation)
		{
			ExportedTypeRow row = new ExportedTypeRow ();
			row.Flags = _flags;
			row.TypeDefId = _typeDefId;
			row.TypeName = _typeName;
			row.TypeNamespace = _typeNamespace;
			row.Implementation = _implementation;
			return row;
		}

		public FieldRow CreateFieldRow (FieldAttributes _flags, uint _name, uint _signature)
		{
			FieldRow row = new FieldRow ();
			row.Flags = _flags;
			row.Name = _name;
			row.Signature = _signature;
			return row;
		}

		public FieldLayoutRow CreateFieldLayoutRow (uint _offset, uint _field)
		{
			FieldLayoutRow row = new FieldLayoutRow ();
			row.Offset = _offset;
			row.Field = _field;
			return row;
		}

		public FieldMarshalRow CreateFieldMarshalRow (MetadataToken _parent, uint _nativeType)
		{
			FieldMarshalRow row = new FieldMarshalRow ();
			row.Parent = _parent;
			row.NativeType = _nativeType;
			return row;
		}

		public FieldPtrRow CreateFieldPtrRow (uint _field)
		{
			FieldPtrRow row = new FieldPtrRow ();
			row.Field = _field;
			return row;
		}

		public FieldRVARow CreateFieldRVARow (RVA _rVA, uint _field)
		{
			FieldRVARow row = new FieldRVARow ();
			row.RVA = _rVA;
			row.Field = _field;
			return row;
		}

		public FileRow CreateFileRow (FileAttributes _flags, uint _name, uint _hashValue)
		{
			FileRow row = new FileRow ();
			row.Flags = _flags;
			row.Name = _name;
			row.HashValue = _hashValue;
			return row;
		}

		public GenericParamRow CreateGenericParamRow (ushort _number, GenericParameterAttributes _flags, MetadataToken _owner, uint _name)
		{
			GenericParamRow row = new GenericParamRow ();
			row.Number = _number;
			row.Flags = _flags;
			row.Owner = _owner;
			row.Name = _name;
			return row;
		}

		public GenericParamConstraintRow CreateGenericParamConstraintRow (uint _owner, MetadataToken _constraint)
		{
			GenericParamConstraintRow row = new GenericParamConstraintRow ();
			row.Owner = _owner;
			row.Constraint = _constraint;
			return row;
		}

		public ImplMapRow CreateImplMapRow (PInvokeAttributes _mappingFlags, MetadataToken _memberForwarded, uint _importName, uint _importScope)
		{
			ImplMapRow row = new ImplMapRow ();
			row.MappingFlags = _mappingFlags;
			row.MemberForwarded = _memberForwarded;
			row.ImportName = _importName;
			row.ImportScope = _importScope;
			return row;
		}

		public InterfaceImplRow CreateInterfaceImplRow (uint _class, MetadataToken _interface)
		{
			InterfaceImplRow row = new InterfaceImplRow ();
			row.Class = _class;
			row.Interface = _interface;
			return row;
		}

		public ManifestResourceRow CreateManifestResourceRow (uint _offset, ManifestResourceAttributes _flags, uint _name, MetadataToken _implementation)
		{
			ManifestResourceRow row = new ManifestResourceRow ();
			row.Offset = _offset;
			row.Flags = _flags;
			row.Name = _name;
			row.Implementation = _implementation;
			return row;
		}

		public MemberRefRow CreateMemberRefRow (MetadataToken _class, uint _name, uint _signature)
		{
			MemberRefRow row = new MemberRefRow ();
			row.Class = _class;
			row.Name = _name;
			row.Signature = _signature;
			return row;
		}

		public MethodRow CreateMethodRow (RVA _rVA, MethodImplAttributes _implFlags, MethodAttributes _flags, uint _name, uint _signature, uint _paramList)
		{
			MethodRow row = new MethodRow ();
			row.RVA = _rVA;
			row.ImplFlags = _implFlags;
			row.Flags = _flags;
			row.Name = _name;
			row.Signature = _signature;
			row.ParamList = _paramList;
			return row;
		}

		public MethodImplRow CreateMethodImplRow (uint _class, MetadataToken _methodBody, MetadataToken _methodDeclaration)
		{
			MethodImplRow row = new MethodImplRow ();
			row.Class = _class;
			row.MethodBody = _methodBody;
			row.MethodDeclaration = _methodDeclaration;
			return row;
		}

		public MethodPtrRow CreateMethodPtrRow (uint _method)
		{
			MethodPtrRow row = new MethodPtrRow ();
			row.Method = _method;
			return row;
		}

		public MethodSemanticsRow CreateMethodSemanticsRow (MethodSemanticsAttributes _semantics, uint _method, MetadataToken _association)
		{
			MethodSemanticsRow row = new MethodSemanticsRow ();
			row.Semantics = _semantics;
			row.Method = _method;
			row.Association = _association;
			return row;
		}

		public MethodSpecRow CreateMethodSpecRow (MetadataToken _method, uint _instantiation)
		{
			MethodSpecRow row = new MethodSpecRow ();
			row.Method = _method;
			row.Instantiation = _instantiation;
			return row;
		}

		public ModuleRow CreateModuleRow (ushort _generation, uint _name, uint _mvid, uint _encId, uint _encBaseId)
		{
			ModuleRow row = new ModuleRow ();
			row.Generation = _generation;
			row.Name = _name;
			row.Mvid = _mvid;
			row.EncId = _encId;
			row.EncBaseId = _encBaseId;
			return row;
		}

		public ModuleRefRow CreateModuleRefRow (uint _name)
		{
			ModuleRefRow row = new ModuleRefRow ();
			row.Name = _name;
			return row;
		}

		public NestedClassRow CreateNestedClassRow (uint _nestedClass, uint _enclosingClass)
		{
			NestedClassRow row = new NestedClassRow ();
			row.NestedClass = _nestedClass;
			row.EnclosingClass = _enclosingClass;
			return row;
		}

		public ParamRow CreateParamRow (ParameterAttributes _flags, ushort _sequence, uint _name)
		{
			ParamRow row = new ParamRow ();
			row.Flags = _flags;
			row.Sequence = _sequence;
			row.Name = _name;
			return row;
		}

		public ParamPtrRow CreateParamPtrRow (uint _param)
		{
			ParamPtrRow row = new ParamPtrRow ();
			row.Param = _param;
			return row;
		}

		public PropertyRow CreatePropertyRow (PropertyAttributes _flags, uint _name, uint _type)
		{
			PropertyRow row = new PropertyRow ();
			row.Flags = _flags;
			row.Name = _name;
			row.Type = _type;
			return row;
		}

		public PropertyMapRow CreatePropertyMapRow (uint _parent, uint _propertyList)
		{
			PropertyMapRow row = new PropertyMapRow ();
			row.Parent = _parent;
			row.PropertyList = _propertyList;
			return row;
		}

		public PropertyPtrRow CreatePropertyPtrRow (uint _property)
		{
			PropertyPtrRow row = new PropertyPtrRow ();
			row.Property = _property;
			return row;
		}

		public StandAloneSigRow CreateStandAloneSigRow (uint _signature)
		{
			StandAloneSigRow row = new StandAloneSigRow ();
			row.Signature = _signature;
			return row;
		}

		public TypeDefRow CreateTypeDefRow (TypeAttributes _flags, uint _name, uint _namespace, MetadataToken _extends, uint _fieldList, uint _methodList)
		{
			TypeDefRow row = new TypeDefRow ();
			row.Flags = _flags;
			row.Name = _name;
			row.Namespace = _namespace;
			row.Extends = _extends;
			row.FieldList = _fieldList;
			row.MethodList = _methodList;
			return row;
		}

		public TypeRefRow CreateTypeRefRow (MetadataToken _resolutionScope, uint _name, uint _namespace)
		{
			TypeRefRow row = new TypeRefRow ();
			row.ResolutionScope = _resolutionScope;
			row.Name = _name;
			row.Namespace = _namespace;
			return row;
		}

		public TypeSpecRow CreateTypeSpecRow (uint _signature)
		{
			TypeSpecRow row = new TypeSpecRow ();
			row.Signature = _signature;
			return row;
		}

		public override void VisitRowCollection (RowCollection coll)
		{
			m_blobHeapIdxSz = m_root.Streams.BlobHeap != null ?
				m_root.Streams.BlobHeap.IndexSize : 2;
			m_stringsHeapIdxSz = m_root.Streams.StringsHeap != null ?
				m_root.Streams.StringsHeap.IndexSize : 2;
			m_guidHeapIdxSz = m_root.Streams.GuidHeap != null ?
				m_root.Streams.GuidHeap.IndexSize : 2;
		}

		public override void VisitAssemblyRow (AssemblyRow row)
		{
			m_binaryWriter.Write ((uint) row.HashAlgId);
			m_binaryWriter.Write (row.MajorVersion);
			m_binaryWriter.Write (row.MinorVersion);
			m_binaryWriter.Write (row.BuildNumber);
			m_binaryWriter.Write (row.RevisionNumber);
			m_binaryWriter.Write ((uint) row.Flags);
			WriteBlobPointer (row.PublicKey);
			WriteStringPointer (row.Name);
			WriteStringPointer (row.Culture);
		}

		public override void VisitAssemblyOSRow (AssemblyOSRow row)
		{
			m_binaryWriter.Write (row.OSPlatformID);
			m_binaryWriter.Write (row.OSMajorVersion);
			m_binaryWriter.Write (row.OSMinorVersion);
		}

		public override void VisitAssemblyProcessorRow (AssemblyProcessorRow row)
		{
			m_binaryWriter.Write (row.Processor);
		}

		public override void VisitAssemblyRefRow (AssemblyRefRow row)
		{
			m_binaryWriter.Write (row.MajorVersion);
			m_binaryWriter.Write (row.MinorVersion);
			m_binaryWriter.Write (row.BuildNumber);
			m_binaryWriter.Write (row.RevisionNumber);
			m_binaryWriter.Write ((uint) row.Flags);
			WriteBlobPointer (row.PublicKeyOrToken);
			WriteStringPointer (row.Name);
			WriteStringPointer (row.Culture);
			WriteBlobPointer (row.HashValue);
		}

		public override void VisitAssemblyRefOSRow (AssemblyRefOSRow row)
		{
			m_binaryWriter.Write (row.OSPlatformID);
			m_binaryWriter.Write (row.OSMajorVersion);
			m_binaryWriter.Write (row.OSMinorVersion);
			WriteTablePointer (row.AssemblyRef, AssemblyRefTable.RId);
		}

		public override void VisitAssemblyRefProcessorRow (AssemblyRefProcessorRow row)
		{
			m_binaryWriter.Write (row.Processor);
			WriteTablePointer (row.AssemblyRef, AssemblyRefTable.RId);
		}

		public override void VisitClassLayoutRow (ClassLayoutRow row)
		{
			m_binaryWriter.Write (row.PackingSize);
			m_binaryWriter.Write (row.ClassSize);
			WriteTablePointer (row.Parent, TypeDefTable.RId);
		}

		public override void VisitConstantRow (ConstantRow row)
		{
			m_binaryWriter.Write ((ushort) row.Type);
			WriteMetadataToken (row.Parent, CodedIndex.HasConstant);
			WriteBlobPointer (row.Value);
		}

		public override void VisitCustomAttributeRow (CustomAttributeRow row)
		{
			WriteMetadataToken (row.Parent, CodedIndex.HasCustomAttribute);
			WriteMetadataToken (row.Type, CodedIndex.CustomAttributeType);
			WriteBlobPointer (row.Value);
		}

		public override void VisitDeclSecurityRow (DeclSecurityRow row)
		{
			m_binaryWriter.Write ((short) row.Action);
			WriteMetadataToken (row.Parent, CodedIndex.HasDeclSecurity);
			WriteBlobPointer (row.PermissionSet);
		}

		public override void VisitEventRow (EventRow row)
		{
			m_binaryWriter.Write ((ushort) row.EventFlags);
			WriteStringPointer (row.Name);
			WriteMetadataToken (row.EventType, CodedIndex.TypeDefOrRef);
		}

		public override void VisitEventMapRow (EventMapRow row)
		{
			WriteTablePointer (row.Parent, TypeDefTable.RId);
			WriteTablePointer (row.EventList, EventTable.RId);
		}

		public override void VisitEventPtrRow (EventPtrRow row)
		{
			WriteTablePointer (row.Event, EventTable.RId);
		}

		public override void VisitExportedTypeRow (ExportedTypeRow row)
		{
			m_binaryWriter.Write ((uint) row.Flags);
			m_binaryWriter.Write (row.TypeDefId);
			WriteStringPointer (row.TypeName);
			WriteStringPointer (row.TypeNamespace);
			WriteMetadataToken (row.Implementation, CodedIndex.Implementation);
		}

		public override void VisitFieldRow (FieldRow row)
		{
			m_binaryWriter.Write ((ushort) row.Flags);
			WriteStringPointer (row.Name);
			WriteBlobPointer (row.Signature);
		}

		public override void VisitFieldLayoutRow (FieldLayoutRow row)
		{
			m_binaryWriter.Write (row.Offset);
			WriteTablePointer (row.Field, FieldTable.RId);
		}

		public override void VisitFieldMarshalRow (FieldMarshalRow row)
		{
			WriteMetadataToken (row.Parent, CodedIndex.HasFieldMarshal);
			WriteBlobPointer (row.NativeType);
		}

		public override void VisitFieldPtrRow (FieldPtrRow row)
		{
			WriteTablePointer (row.Field, FieldTable.RId);
		}

		public override void VisitFieldRVARow (FieldRVARow row)
		{
			m_binaryWriter.Write (row.RVA.Value);
			WriteTablePointer (row.Field, FieldTable.RId);
		}

		public override void VisitFileRow (FileRow row)
		{
			m_binaryWriter.Write ((uint) row.Flags);
			WriteStringPointer (row.Name);
			WriteBlobPointer (row.HashValue);
		}

		public override void VisitGenericParamRow (GenericParamRow row)
		{
			m_binaryWriter.Write (row.Number);
			m_binaryWriter.Write ((ushort) row.Flags);
			WriteMetadataToken (row.Owner, CodedIndex.TypeOrMethodDef);
			WriteStringPointer (row.Name);
		}

		public override void VisitGenericParamConstraintRow (GenericParamConstraintRow row)
		{
			WriteTablePointer (row.Owner, GenericParamTable.RId);
			WriteMetadataToken (row.Constraint, CodedIndex.TypeDefOrRef);
		}

		public override void VisitImplMapRow (ImplMapRow row)
		{
			m_binaryWriter.Write ((ushort) row.MappingFlags);
			WriteMetadataToken (row.MemberForwarded, CodedIndex.MemberForwarded);
			WriteStringPointer (row.ImportName);
			WriteTablePointer (row.ImportScope, ModuleRefTable.RId);
		}

		public override void VisitInterfaceImplRow (InterfaceImplRow row)
		{
			WriteTablePointer (row.Class, TypeDefTable.RId);
			WriteMetadataToken (row.Interface, CodedIndex.TypeDefOrRef);
		}

		public override void VisitManifestResourceRow (ManifestResourceRow row)
		{
			m_binaryWriter.Write (row.Offset);
			m_binaryWriter.Write ((uint) row.Flags);
			WriteStringPointer (row.Name);
			WriteMetadataToken (row.Implementation, CodedIndex.Implementation);
		}

		public override void VisitMemberRefRow (MemberRefRow row)
		{
			WriteMetadataToken (row.Class, CodedIndex.MemberRefParent);
			WriteStringPointer (row.Name);
			WriteBlobPointer (row.Signature);
		}

		public override void VisitMethodRow (MethodRow row)
		{
			m_binaryWriter.Write (row.RVA.Value);
			m_binaryWriter.Write ((ushort) row.ImplFlags);
			m_binaryWriter.Write ((ushort) row.Flags);
			WriteStringPointer (row.Name);
			WriteBlobPointer (row.Signature);
			WriteTablePointer (row.ParamList, ParamTable.RId);
		}

		public override void VisitMethodImplRow (MethodImplRow row)
		{
			WriteTablePointer (row.Class, TypeDefTable.RId);
			WriteMetadataToken (row.MethodBody, CodedIndex.MethodDefOrRef);
			WriteMetadataToken (row.MethodDeclaration, CodedIndex.MethodDefOrRef);
		}

		public override void VisitMethodPtrRow (MethodPtrRow row)
		{
			WriteTablePointer (row.Method, MethodTable.RId);
		}

		public override void VisitMethodSemanticsRow (MethodSemanticsRow row)
		{
			m_binaryWriter.Write ((ushort) row.Semantics);
			WriteTablePointer (row.Method, MethodTable.RId);
			WriteMetadataToken (row.Association, CodedIndex.HasSemantics);
		}

		public override void VisitMethodSpecRow (MethodSpecRow row)
		{
			WriteMetadataToken (row.Method, CodedIndex.MethodDefOrRef);
			WriteBlobPointer (row.Instantiation);
		}

		public override void VisitModuleRow (ModuleRow row)
		{
			m_binaryWriter.Write (row.Generation);
			WriteStringPointer (row.Name);
			WriteGuidPointer (row.Mvid);
			WriteGuidPointer (row.EncId);
			WriteGuidPointer (row.EncBaseId);
		}

		public override void VisitModuleRefRow (ModuleRefRow row)
		{
			WriteStringPointer (row.Name);
		}

		public override void VisitNestedClassRow (NestedClassRow row)
		{
			WriteTablePointer (row.NestedClass, TypeDefTable.RId);
			WriteTablePointer (row.EnclosingClass, TypeDefTable.RId);
		}

		public override void VisitParamRow (ParamRow row)
		{
			m_binaryWriter.Write ((ushort) row.Flags);
			m_binaryWriter.Write (row.Sequence);
			WriteStringPointer (row.Name);
		}

		public override void VisitParamPtrRow (ParamPtrRow row)
		{
			WriteTablePointer (row.Param, ParamTable.RId);
		}

		public override void VisitPropertyRow (PropertyRow row)
		{
			m_binaryWriter.Write ((ushort) row.Flags);
			WriteStringPointer (row.Name);
			WriteBlobPointer (row.Type);
		}

		public override void VisitPropertyMapRow (PropertyMapRow row)
		{
			WriteTablePointer (row.Parent, TypeDefTable.RId);
			WriteTablePointer (row.PropertyList, PropertyTable.RId);
		}

		public override void VisitPropertyPtrRow (PropertyPtrRow row)
		{
			WriteTablePointer (row.Property, PropertyTable.RId);
		}

		public override void VisitStandAloneSigRow (StandAloneSigRow row)
		{
			WriteBlobPointer (row.Signature);
		}

		public override void VisitTypeDefRow (TypeDefRow row)
		{
			m_binaryWriter.Write ((uint) row.Flags);
			WriteStringPointer (row.Name);
			WriteStringPointer (row.Namespace);
			WriteMetadataToken (row.Extends, CodedIndex.TypeDefOrRef);
			WriteTablePointer (row.FieldList, FieldTable.RId);
			WriteTablePointer (row.MethodList, MethodTable.RId);
		}

		public override void VisitTypeRefRow (TypeRefRow row)
		{
			WriteMetadataToken (row.ResolutionScope, CodedIndex.ResolutionScope);
			WriteStringPointer (row.Name);
			WriteStringPointer (row.Namespace);
		}

		public override void VisitTypeSpecRow (TypeSpecRow row)
		{
			WriteBlobPointer (row.Signature);
		}

	}
}
