Flood.HashMap.CLIMarshalToNative C# (CSharp) Method

CLIMarshalToNative() public method

public CLIMarshalToNative ( CppSharp.Generators.MarshalContext ctx ) : void
ctx CppSharp.Generators.MarshalContext
return void
        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);
        }