Пример #1
0
 private void ImplementItem(CodeWriter writer)
 {
     if (Info?.Value == null)
     {
         return;
     }
     switch (Info.Value)
     {
     case byte[] v:
         writer.NewLine();
         writer.Write($"e::system::bin {Name}()");
         using (writer.NewBlock())
         {
             writer.NewLine();
             writer.Write("return e::system::bin {");
             for (int i = 0; i < v.Length; i++)
             {
                 if (i != 0)
                 {
                     writer.Write(", ");
                 }
                 writer.Write(v[i].ToString());
             }
             writer.Write("}");
             writer.Write(";");
         }
         break;
     }
 }
Пример #2
0
        private void WriteOptionalParameterReader(CodeWriter writer)
        {
            foreach (var x in Parameters.Where(x => x.OptionalParameter))
            {
                var name          = P.GetUserDefinedName_SimpleCppName(x.Id);
                var realValueType = P.GetCppTypeName(x.DataType, x.ArrayParameter);
                var nullParameter = P.GetNullParameter(x.DataType, x.ArrayParameter);
                var initValue     = P.GetInitValue(x.DataType, x.ArrayParameter);
                writer.NewLine();
                writer.Write($"bool eoc_isNull_{name} = !{name}.has_value();");
                if (x.ByRef || x.ArrayParameter || !P.IsValueType(x.DataType))
                {
                    writer.NewLine();
                    if (string.IsNullOrWhiteSpace(nullParameter))
                    {
                        writer.Write($"{realValueType} eoc_default_{name};");
                    }
                    else
                    {
                        writer.Write($"{realValueType} eoc_default_{name}({nullParameter});");
                    }

                    writer.NewLine();
                    writer.Write($"{realValueType}& eoc_value_{name} = eoc_isNull_{name} ? (eoc_default_{name} = {initValue}) : {name}.value().get();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write($"{realValueType} eoc_value_{name} = eoc_isNull_{name} ? {initValue} : {name}.value();");
                }
            }
        }
Пример #3
0
 public static void Implement(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocDll> map)
 {
     writer.Write("#include \"dll.h\"");
     writer.NewLine();
     writer.Write("#include <e/system/dll_core.h>");
     writer.NewLine();
     writer.Write("#include <e/system/methodptr_caller.h>");
     using (writer.NewNamespace(P.DllNamespace))
     {
         var moduleMap = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);
         var funcMap   = new Dictionary <Tuple <string, string>, string>();
         var eocDlls   = map.Values.ToList();
         for (int i = 0, j = 0, k = 0; i < eocDlls.Count; i++)
         {
             var item = eocDlls[i];
             if (!moduleMap.TryGetValue(item.LibraryName, out var dllIdInCpp))
             {
                 dllIdInCpp = (j++).ToString();
                 moduleMap.Add(item.LibraryName, dllIdInCpp);
             }
             var dllEntryPointPair = new Tuple <string, string>(dllIdInCpp, item.EntryPoint);
             if (!funcMap.ContainsKey(dllEntryPointPair))
             {
                 funcMap.Add(dllEntryPointPair, (k++).ToString());
             }
         }
         using (writer.NewNamespace("eoc_module"))
         {
             foreach (var item in moduleMap)
             {
                 writer.NewLine();
                 writer.Write($"eoc_DefineMoudleLoader({item.Value}, \"{item.Key}\");");
             }
         }
         using (writer.NewNamespace("eoc_func"))
         {
             foreach (var item in funcMap)
             {
                 var entryPointExpr = item.Key.Item2;
                 if (entryPointExpr.StartsWith("#"))
                 {
                     entryPointExpr = $"reinterpret_cast<const char *>({Convert.ToInt32(entryPointExpr.Substring(1))})";
                 }
                 else
                 {
                     entryPointExpr = $"\"{entryPointExpr}\"";
                 }
                 writer.NewLine();
                 writer.Write($"eoc_DefineFuncPtrGetter({item.Value}, {P.DllNamespace}::eoc_module::GetMoudleHandle_{item.Key.Item1}(), {entryPointExpr});");
             }
         }
         foreach (var item in eocDlls)
         {
             item.ImplementItem(writer, moduleMap, funcMap);
         }
     }
 }
Пример #4
0
        private void MakeProgramEntry(CodeWriter writer)
        {
            writer.Write("#include \"stdafx.h\"");
            writer.NewLine();
            writer.Write("#include <Windows.h>");
            writer.NewLine();
            writer.Write("int init()");
            using (writer.NewBlock())
            {
                if (Source.InitEcSectionInfo != null)
                {
                    for (int i = 0; i < Source.InitEcSectionInfo.InitMethod.Length; i++)
                    {
                        writer.NewLine();
                        writer.Write(GetCppMethodName(Source.InitEcSectionInfo.InitMethod[i]));
                        writer.Write("();");
                        writer.AddComment("为{" + Source.InitEcSectionInfo.EcName[i] + "}做初始化");
                    }
                }
                if (Source.Code.MainMethod != 0)
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.Write(GetCppMethodName(Source.Code.MainMethod));
                    writer.Write("();");
                }
                else
                {
                    writer.NewLine();
                    writer.Write("return e::user::cmd::_启动子程序();");
                }
            }
            switch (ProjectType)
            {
            case EocProjectType.Windows:
                writer.NewLine();
                writer.Write("int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            case EocProjectType.Console:
                writer.NewLine();
                writer.Write("int main()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return init();");
                }
                break;

            default:
                throw new Exception("未知项目类型");
            }
        }
Пример #5
0
        private void DefineItem(CodeWriter writer)
        {
            if (Info?.Value == null)
            {
                return;
            }
            switch (Info.Value)
            {
            case double v:
                writer.NewLine();
                if ((int)v == v)
                {
                    writer.Write($"const int {Name}({v});");
                }
                else if ((long)v == v)
                {
                    writer.Write($"const int64_t {Name}({v});");
                }
                else
                {
                    writer.Write($"const double {Name}({v});");
                }
                break;

            case bool v:
                writer.NewLine();
                writer.Write($"const bool {Name}(" + (v ? "true" : "false") + ");");
                break;

            case string v:
                writer.NewLine();
                writer.Write($"inline e::system::string {Name}()");
                using (writer.NewBlock())
                {
                    writer.NewLine();
                    writer.Write("return ");
                    writer.WriteLiteral(v);
                    writer.Write(";");
                }
                break;

            case DateTime v:
                writer.NewLine();
                writer.Write($"const e::system::datetime {Name}({v.ToOADate()}/*{v.ToString("yyyyMMddTHHmmss")}*/);");
                break;

            case byte[] v:
                throw new Exception();

            default:
                throw new Exception();
            }
        }
Пример #6
0
 internal WriteNamespaceHelper(CodeWriter writer, params string[] splitedNamespace)
 {
     this.writer           = writer ?? throw new ArgumentNullException(nameof(writer));
     this.splitedNamespace = splitedNamespace ?? throw new ArgumentNullException(nameof(splitedNamespace));
     foreach (var item in splitedNamespace)
     {
         writer.NewLine();
         writer.Write("namespace " + item);
         writer.NewLine();
         writer.Write("{");
         writer.Indent++;
     }
 }
Пример #7
0
 internal void DefineVariable(CodeWriter writer, string[] modifiers, EocVariableInfo variable, bool initAtOnce = true)
 {
     writer.NewLine();
     if (modifiers != null)
     {
         foreach (var item in modifiers)
         {
             writer.Write(item);
             writer.Write(" ");
         }
     }
     writer.Write(variable.DataType.ToString());
     writer.Write(" ");
     writer.Write(variable.CppName.Split(new string[] { "::" }, StringSplitOptions.None).LastOrDefault());
     if (initAtOnce)
     {
         var initParameter = EocDataTypes.GetInitParameter(variable.DataType, variable.UBound);
         if (!string.IsNullOrWhiteSpace(initParameter))
         {
             writer.Write("(");
             writer.Write(initParameter);
             writer.Write(")");
         }
     }
     writer.Write(";");
 }
Пример #8
0
 private void DefineAllTypes(CodeWriter writer)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include <e/system/basic_type.h>");
     ReferenceEocLibs(writer);
     using (writer.NewNamespace(TypeNamespace))
     {
         using (writer.NewNamespace("eoc_internal"))
         {
             EocStruct.DefineRawName(this, writer, EocStructs);
             EocObjectClass.DefineRawName(this, writer, EocObjectClasses);
         }
         EocStruct.DefineName(this, writer, EocStructs);
         EocObjectClass.DefineName(this, writer, EocObjectClasses);
         using (writer.NewNamespace("eoc_internal"))
         {
             EocStruct.DefineRawStructInfo(this, writer, EocStructs);
             EocObjectClass.DefineRawObjectClass(this, writer, EocObjectClasses);
         }
     }
     using (writer.NewNamespace("e::system"))
     {
         EocStruct.DefineStructMarshaler(this, writer, EocStructs);
     }
 }
Пример #9
0
 internal void DefineVariable(CodeWriter writer, string[] modifiers, AbstractVariableInfo variable, bool initAtOnce = true)
 {
     writer.NewLine();
     if (modifiers != null)
     {
         foreach (var item in modifiers)
         {
             writer.Write(item);
             writer.Write(" ");
         }
     }
     writer.Write(GetCppTypeName(variable.DataType, variable.UBound).ToString());
     writer.Write(" ");
     writer.Write(GetUserDefinedName_SimpleCppName(variable.Id));
     if (initAtOnce)
     {
         var initParameter = GetInitParameter(variable.DataType, variable.UBound);
         if (!string.IsNullOrWhiteSpace(initParameter))
         {
             writer.Write("(");
             writer.Write(initParameter);
             writer.Write(")");
         }
     }
     writer.Write(";");
 }
Пример #10
0
 internal WriteBlockHelper(CodeWriter writer)
 {
     this.writer = writer ?? throw new ArgumentNullException(nameof(writer));
     writer.NewLine();
     writer.Write("{");
     writer.Indent++;
 }
Пример #11
0
 public static void Implement(ProjectConverter P, CodeWriter writer, EocDll[] eocDlls)
 {
     writer.Write("#include \"dll.h\"");
     writer.NewLine();
     writer.Write("#include <e/system/dll_core.h>");
     writer.NewLine();
     writer.Write("#include <e/system/methodptr_caller.h>");
     using (writer.NewNamespace(P.DllNamespace))
     {
         var moduleMap = new Dictionary <string, string>();
         var funcMap   = new Dictionary <Tuple <string, string>, string>();
         for (int i = 0, j = 0, k = 0; i < eocDlls.Length; i++)
         {
             var item = eocDlls[i];
             if (!moduleMap.TryGetValue(item.LibraryName, out var dllIdInCpp))
             {
                 dllIdInCpp = (j++).ToString();
                 moduleMap.Add(item.LibraryName, dllIdInCpp);
             }
             var dllEntryPointPair = new Tuple <string, string>(dllIdInCpp, item.EntryPoint);
             if (!funcMap.ContainsKey(dllEntryPointPair))
             {
                 funcMap.Add(dllEntryPointPair, (k++).ToString());
             }
         }
         using (writer.NewNamespace("eoc_module"))
         {
             foreach (var item in moduleMap)
             {
                 writer.NewLine();
                 writer.Write($"eoc_DefineMoudleLoader({item.Value}, \"{item.Key}\");");
             }
         }
         using (writer.NewNamespace("eoc_func"))
         {
             foreach (var item in funcMap)
             {
                 writer.NewLine();
                 writer.Write($"eoc_DefineFuncPtrGetter({item.Value}, {P.DllNamespace}::eoc_module::GetMoudleHandle_{item.Key.Item1}(), \"{item.Key.Item2}\");");
             }
         }
         foreach (var item in eocDlls)
         {
             item.ImplementItem(writer, moduleMap, funcMap);
         }
     }
 }
Пример #12
0
 public void Dispose()
 {
     foreach (var item in splitedNamespace)
     {
         writer.Indent--;
         writer.NewLine();
         writer.Write("}");
     }
 }
Пример #13
0
        private void DefineRawStructInfo(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write($"struct {RawName}");
            using (writer.NewBlock())
            {
                P.DefineVariable(writer, null, MemberInfoMap.Values, false);

                writer.NewLine();
                writer.Write($"{RawName}()");
                if (MemberInfoMap.Count != 0)
                {
                    writer.Write(": ");
                    P.InitMembersInConstructor(writer, MemberInfoMap.Values);
                }
                using (writer.NewBlock())
                {
                }
            }
            writer.Write(";");
        }
Пример #14
0
        private void DefineRawStructInfo(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write($"struct {RawName}");
            using (writer.NewBlock())
            {
                P.DefineVariable(writer, null, RawInfo.Member, false);

                writer.NewLine();
                writer.Write($"{RawName}()");
                if (RawInfo.Member.Length != 0)
                {
                    writer.Write(": ");
                    P.InitMembersInConstructor(writer, RawInfo.Member);
                }
                using (writer.NewBlock())
                {
                }
            }
            writer.Write(";");
        }
Пример #15
0
 public static void Define(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocConstant> map)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include <e/system/basic_type.h>");
     using (writer.NewNamespace(P.ConstantNamespace))
     {
         foreach (var item in map.Values)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #16
0
 public static void Implement(ProjectConverter P, CodeWriter writer, EocDllExport[] dllExports)
 {
     writer.Write("#include \"stdafx.h\"");
     writer.NewLine();
     writer.Write("extern \"C\"");
     using (writer.NewBlock())
     {
         foreach (var item in dllExports)
         {
             item.ImplementItem(P, writer);
         }
     }
 }
Пример #17
0
 public static void Implement(ProjectConverter P, CodeWriter writer, SortedDictionary <int, EocDllExport> map)
 {
     writer.Write("#include \"stdafx.h\"");
     writer.NewLine();
     writer.Write("extern \"C\"");
     using (writer.NewBlock())
     {
         foreach (var item in map.Values)
         {
             item.ImplementItem(P, writer);
         }
     }
 }
Пример #18
0
 public void Define(CodeWriter writer)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"../type.h\"");
     using (writer.NewNamespace(P.CmdNamespace))
     {
         foreach (var item in Method)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #19
0
 public static void Define(ProjectConverter P, CodeWriter writer, SortedDictionary<int, EocGlobalVariable> map)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in map.Values)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #20
0
 private void ReferenceEocLibs(CodeWriter writer)
 {
     for (int i = 0; i < Source.Code.Libraries.Length; i++)
     {
         if (EocLibs[i] == null)
         {
             continue;
         }
         LibraryRefInfo item = Source.Code.Libraries[i];
         writer.NewLine();
         writer.Write($"#include <e/lib/{item.FileName}/public.h>");
     }
 }
Пример #21
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocGlobalVariable[] collection)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.GlobalNamespace))
     {
         foreach (var item in collection)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #22
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocConstant[] eocDlls)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include <e/system/basic_type.h>");
     using (writer.NewNamespace(P.ConstantNamespace))
     {
         foreach (var item in eocDlls)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #23
0
 public static void Define(ProjectConverter P, CodeWriter writer, EocDll[] eocDlls)
 {
     writer.Write("#pragma once");
     writer.NewLine();
     writer.Write("#include \"type.h\"");
     using (writer.NewNamespace(P.DllNamespace))
     {
         foreach (var item in eocDlls)
         {
             item.DefineItem(writer);
         }
     }
 }
Пример #24
0
        public void ImplementRawObjectClass(CodeWriter writer)
        {
            writer.Write("#include \"../../../stdafx.h\"");
            using (writer.NewNamespace(P.TypeNamespace))
            {
                var initMethod    = Method.Values.Where(x => x.MethodItem.Name == "_初始化").FirstOrDefault();
                var destroyMethod = Method.Values.Where(x => x.MethodItem.Name == "_销毁").FirstOrDefault();
                using (writer.NewNamespace("eoc_internal"))
                {
                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}()");
                    if (MemberInfoMap.Count != 0)
                    {
                        writer.Write(": ");
                        P.InitMembersInConstructor(writer, MemberInfoMap.Values);
                    }
                    using (writer.NewBlock())
                    {
                        if (initMethod != null)
                        {
                            writer.NewLine();
                            writer.Write($"this->{initMethod.Name}();");
                        }
                    }
                    writer.NewLine();
                    writer.Write($"{RawName}::~{RawName}()");
                    using (writer.NewBlock())
                    {
                        if (destroyMethod != null)
                        {
                            writer.NewLine();
                            writer.Write($"this->{destroyMethod.Name}();");
                        }
                    }

                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}(const {RawName}&) = default;");

                    writer.NewLine();
                    writer.Write($"e::system::basic_object* {RawName}::clone()");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write($"return new {RawName}(*this);");
                    }

                    foreach (var item in Method.Values)
                    {
                        item.ImplementNormalItem(writer);
                    }
                }
            }
        }
Пример #25
0
        public void ImplementRawObjectClass(CodeWriter writer)
        {
            writer.Write("#include \"../../../stdafx.h\"");
            using (writer.NewNamespace(P.TypeNamespace))
            {
                bool hasInitMethod    = Method.Where(x => x.MethodItem.Name == "_初始化").FirstOrDefault() != null;
                bool hasDestroyMethod = Method.Where(x => x.MethodItem.Name == "_销毁").FirstOrDefault() != null;
                using (writer.NewNamespace("eoc_internal"))
                {
                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}()");
                    if (RawInfo.Variables.Length != 0)
                    {
                        writer.Write(": ");
                        P.InitMembersInConstructor(writer, RawInfo.Variables);
                    }
                    using (writer.NewBlock())
                    {
                        if (hasInitMethod)
                        {
                            writer.NewLine();
                            writer.Write("this->_初始化();");
                        }
                    }
                    writer.NewLine();
                    writer.Write($"{RawName}::~{RawName}()");
                    using (writer.NewBlock())
                    {
                        if (hasDestroyMethod)
                        {
                            writer.NewLine();
                            writer.Write("this->_销毁();");
                        }
                    }

                    writer.NewLine();
                    writer.Write($"{RawName}::{RawName}(const {RawName}&) = default;");

                    writer.NewLine();
                    writer.Write($"e::system::basic_object* {RawName}::clone()");
                    using (writer.NewBlock())
                    {
                        writer.NewLine();
                        writer.Write($"return new {RawName}(*this);");
                    }

                    foreach (var item in Method)
                    {
                        item.ImplementItem(writer);
                    }
                }
            }
        }
Пример #26
0
        internal void WriteMethodHeader(CodeWriter writer, EocCmdInfo eocCmdInfo, string name, bool isVirtual, string className = null, bool writeDefaultValue = true)
        {
            var paramName = GetParamNameFromInfo(eocCmdInfo.Parameters);

            writer.NewLine();
            if (isVirtual)
            {
                writer.Write("virtual ");
            }

            var numOfOptionalAtEnd = 0;

            for (int i = eocCmdInfo.Parameters.Count - 1; i >= 0; i--)
            {
                if (eocCmdInfo.Parameters[i].Optional)
                {
                    numOfOptionalAtEnd++;
                }
                else
                {
                    break;
                }
            }
            var startOfOptionalAtEnd = eocCmdInfo.Parameters.Count - numOfOptionalAtEnd;

            writer.Write(eocCmdInfo.ReturnDataType == null ? "void" : eocCmdInfo.ReturnDataType.ToString());
            writer.Write(" __stdcall ");
            if (className != null)
            {
                writer.Write(className);
                writer.Write("::");
            }
            writer.Write(name);
            writer.Write("(");
            for (int i = 0; i < eocCmdInfo.Parameters.Count; i++)
            {
                if (i != 0)
                {
                    writer.Write(", ");
                }
                writer.Write(GetParameterTypeString(eocCmdInfo.Parameters[i]));
                writer.Write(" ");
                writer.Write(paramName[i]);
                if (writeDefaultValue && i >= startOfOptionalAtEnd)
                {
                    writer.Write(" = std::nullopt");
                }
            }
            writer.Write(")");
        }
Пример #27
0
        private void ImplementItem(ProjectConverter P, CodeWriter writer)
        {
            var paramName = P.GetParamNameFromInfo(Info.Parameters);

            writer.NewLine();
            writer.Write(Info.ReturnDataType == null ? "void" : $"typename e::system::MethodPtrPackager_Result<{Info.ReturnDataType}>::NativeType");
            writer.Write(" __stdcall ");
            writer.Write("eoc_export_");
            writer.Write(ExportId);
            writer.Write("(");
            for (int i = 0; i < Info.Parameters.Count; i++)
            {
                if (i != 0)
                {
                    writer.Write(", ");
                }
                writer.Write("typename e::system::MethodPtrPackager_Arg<");
                writer.Write(P.GetParameterTypeString(Info.Parameters[i]));
                writer.Write(">::NativeType ");
                writer.Write(paramName[i]);
            }
            writer.Write(")");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("return e::system::MethodPtrPackager<");
                writer.Write(Info.ReturnDataType == null ? "void" : Info.ReturnDataType.ToString());
                writer.Write("(");
                writer.Write(string.Join(", ", Info.Parameters.Select(x => P.GetParameterTypeString(x))));
                writer.Write(")");
                writer.Write(">::func<&" + Info.CppName + ">");
                writer.Write("(");
                writer.Write(string.Join(", ", paramName));
                writer.Write(");");
            }
        }
Пример #28
0
        internal void DefineItem(CodeWriter writer)
        {
            var isVirtual = false;

            if (IsClassMember)
            {
                writer.NewLine();
                writer.Write(MethodItem.Public ? "public:" : "private:");
                if (MethodItem.Name != "_初始化" && MethodItem.Name != "_销毁")
                {
                    isVirtual = true;
                }
            }
            P.DefineMethod(writer, EocCmdInfo, Name, isVirtual);
        }
Пример #29
0
 private void WriteOptionalParameterReader(CodeWriter writer)
 {
     foreach (var x in Info.Parameters.Where(x => x.Optional))
     {
         var name      = x.CppName;
         var typeName  = x.DataType == EocDataTypes.Auto ? $"_EocAutoParam_{x.CppName}" : x.DataType.ToString();
         var nullValue = $"e::system::default_value<{typeName}>::null()";
         var initValue = $"e::system::default_value<{typeName}>::value()";
         writer.NewLine();
         writer.Write($"bool eoc_isNull_{name} = !{name}.has_value();");
         if (x.ByRef)
         {
             writer.NewLine();
             writer.Write($"{typeName} eoc_default_{name} = {nullValue};");
             writer.NewLine();
             writer.Write($"{typeName}& eoc_value_{name} = eoc_isNull_{name} ? (eoc_default_{name} = {initValue}) : {name}.value().get();");
         }
         else
         {
             writer.NewLine();
             writer.Write($"{typeName} eoc_value_{name} = eoc_isNull_{name} ? {initValue} : {name}.value();");
         }
     }
 }
Пример #30
0
        private void DefineStructMarshaler(CodeWriter writer)
        {
            writer.NewLine();
            writer.Write("template<> struct marshaler<");
            writer.Write(CppName);
            writer.Write(">");
            using (writer.NewBlock())
            {
                writer.NewLine();
                writer.Write("private: ");

                writer.NewLine();
                writer.Write("using ManagedType = ");
                writer.Write(CppName);
                writer.Write(";");

                writer.NewLine();
                writer.Write("public: ");

                writer.NewLine();
                writer.Write("static constexpr bool SameMemoryStruct = false;");

                writer.NewLine();
                writer.Write("struct NativeType");
                WriteStructMarshalerCodeBlock(writer, "DefineMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("static void marshal(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "MarshalMember");
                writer.Write(";");

                writer.NewLine();
                writer.Write("static void cleanup(NativeType &v, ManagedType &r)");
                WriteStructMarshalerCodeBlock(writer, "CleanupMember");
                writer.Write(";");
            }
            writer.Write(";");
        }