public override void CLIMarshalToNative(MarshalContext ctx)
{
var templateType = Type as TemplateSpecializationType;
var type1 = templateType.Arguments[0].Type;
var type2 = templateType.Arguments[1].Type;
var entryString = (ctx.Parameter != null) ? ctx.Parameter.Name : ctx.ArgName;
var tmpVarName = "_tmp" + entryString;
var cppTypePrinter = new CppTypePrinter(ctx.Driver.TypeDatabase);
var nativeType1 = type1.Type.Visit(cppTypePrinter);
var nativeType2 = type2.Type.Visit(cppTypePrinter);
ctx.SupportBefore.WriteLine("auto {0} = HashMap<{1}, {2}>();",
tmpVarName, nativeType1, nativeType2);
ctx.SupportBefore.WriteLine("auto _keys = {0}->Keys->GetEnumerator();", entryString);
ctx.SupportBefore.WriteLine("while (_keys.MoveNext())");
ctx.SupportBefore.WriteStartBraceIndent();
{
ctx.SupportBefore.WriteLine("{0} _key = _keys.Current;", type1.ToString());
ctx.SupportBefore.WriteLine("{0} _val = {1}[_key];", type2.ToString(), entryString);
var param1 = new Parameter
{
Name = "_key",
QualifiedType = type1
};
var elementCtx1 = new MarshalContext(ctx.Driver)
{
Parameter = param1,
ArgName = param1.Name,
};
var marshal1 = new CLIMarshalManagedToNativePrinter(elementCtx1);
type1.Type.Visit(marshal1);
if (!string.IsNullOrWhiteSpace(marshal1.Context.SupportBefore))
ctx.SupportBefore.Write(marshal1.Context.SupportBefore);
ctx.SupportBefore.WriteLine("auto _marshalKey = {0};",
marshal1.Context.Return);
var param2 = new Parameter
{
Name = "_val",
QualifiedType = type2
};
var elementCtx2 = new MarshalContext(ctx.Driver)
{
Parameter = param2,
ArgName = param2.Name,
};
var marshal2 = new CLIMarshalManagedToNativePrinter(elementCtx2);
type2.Type.Visit(marshal2);
if (!string.IsNullOrWhiteSpace(marshal2.Context.SupportBefore))
ctx.SupportBefore.Write(marshal2.Context.SupportBefore);
ctx.SupportBefore.WriteLine("auto _marshalValue = {0};",
marshal2.Context.Return);
ctx.SupportBefore.WriteLine("{0}[_marshalKey] = _marshalValue;", tmpVarName);
}
ctx.SupportBefore.WriteCloseBraceIndent();
ctx.Return.Write(tmpVarName);
}