private static void MarkForGeneration(ClassTemplateSpecialization specialization)
 {
     specialization.GenerationKind = GenerationKind.Generate;
     Declaration declaration = specialization.TemplatedDecl.TemplatedDecl;
     while (declaration != null)
     {
         declaration.GenerationKind = GenerationKind.Generate;
         declaration = declaration.Namespace;
     }
 }
 public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     if (!specialization.IsDependent &&
         (!specialization.TranslationUnit.IsSystemHeader ||
         specialization.IsSupportedStdSpecialization()))
     {
         var cppTypePrinter = new CppTypePrinter
         {
             PrintScopeKind = CppTypePrintScopeKind.Qualified,
             PrintLogicalNames = true
         };
         var cppCode = specialization.Visit(cppTypePrinter);
         var module = specialization.TranslationUnit.Module;
         if (templateInstantiations.ContainsKey(module))
             templateInstantiations[module].Add(cppCode);
         else
             templateInstantiations.Add(module, new HashSet<string> { cppCode });
     }
     return true;
 }
Beispiel #3
0
 private ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native)
     : this(__CopyValue(native))
 {
     __ownsNativeInstance = true;
 }
Beispiel #4
0
 internal ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native)
     : this(__CopyValue(native))
 {
 }
 private static bool IsSupportedStdSpecialization(ClassTemplateSpecialization specialization)
 {
     return IsSupportedStdType(specialization) &&
         specialization.Arguments[0].Type.Type.IsPrimitiveType(PrimitiveType.Char);
 }
Beispiel #6
0
 private ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native)
     : this(__CopyValue(native))
 {
     __ownsNativeInstance = true;
     NativeToManagedMap[__Instance] = this;
 }
Beispiel #7
0
 public static ClassTemplateSpecialization __CreateInstance(ClassTemplateSpecialization.Internal native)
 {
     return new ClassTemplateSpecialization(native);
 }
Beispiel #8
0
 private ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native, bool skipVTables = false)
     : this(__CopyValue(native), skipVTables)
 {
     __ownsNativeInstance = true;
     NativeToManagedMap[__Instance] = this;
 }
Beispiel #9
0
 private static void* __CopyValue(ClassTemplateSpecialization.__Internal native)
 {
     var ret = Marshal.AllocHGlobal(332);
     global::CppSharp.Parser.AST.ClassTemplateSpecialization.__Internal.cctor_1(ret, new global::System.IntPtr(&native));
     return ret.ToPointer();
 }
Beispiel #10
0
 public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     specialization.ExplicitlyIgnore();
     return(false);
 }
Beispiel #11
0
 public bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     return(false);
 }
 public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     WriteLine($"template class {GetExporting()}{specialization.Visit(cppTypePrinter)};");
     return(true);
 }
Beispiel #13
0
 public virtual TypePrinterResult VisitClassTemplateSpecializationDecl(
     ClassTemplateSpecialization specialization)
 {
     throw new NotImplementedException();
 }
Beispiel #14
0
 public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     Library.ClassTemplateSpecializationDecls.Add(specialization.Name);
     return(true);
 }
Beispiel #15
0
 internal ClassTemplateSpecialization(ClassTemplateSpecialization.Internal* native)
     : this(new global::System.IntPtr(native))
 {
 }
Beispiel #16
0
 internal ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native)
     : this(&native)
 {
 }
Beispiel #17
0
        private Class GetNewInterface(string name, Class @base)
        {
            var   specialization = @base as ClassTemplateSpecialization;
            Class @interface;

            if (specialization == null)
            {
                @interface = new Class();
            }
            else
            {
                Class template           = specialization.TemplatedDecl.TemplatedClass;
                Class templatedInterface = GetInterface(template);
                @interface = interfaces.FirstOrDefault(i => i.OriginalClass == @base);
                if (@interface != null)
                {
                    return(@interface);
                }
                var specializedInterface = new ClassTemplateSpecialization();
                specializedInterface.Arguments.AddRange(specialization.Arguments);
                specializedInterface.TemplatedDecl = new ClassTemplate {
                    TemplatedDecl = templatedInterface
                };
                @interface = specializedInterface;
            }
            @interface.Name          = name;
            @interface.USR           = @base.USR;
            @interface.Namespace     = @base.Namespace;
            @interface.Access        = @base.Access;
            @interface.Type          = ClassType.Interface;
            @interface.OriginalClass = @base;

            @interface.Bases.AddRange(
                from b in @base.Bases
                where b.Class != null
                let i = GetInterface(b.Class)
                        select new BaseClassSpecifier(b)
            {
                Type = new TagType(i)
            });

            @interface.Methods.AddRange(
                from m in @base.Methods
                where !m.IsConstructor && !m.IsDestructor && !m.IsStatic &&
                (m.IsGenerated || (m.IsInvalid && specialization != null)) && !m.IsOperator
                select new Method(m)
            {
                Namespace = @interface, OriginalFunction = m
            });

            @interface.Properties.AddRange(
                from property in @base.Properties
                where property.IsDeclared
                select CreateInterfaceProperty(property, @interface));

            @interface.Fields.AddRange(@base.Fields);
            // avoid conflicts when potentially renaming later
            @interface.Declarations.AddRange(@base.Declarations);

            if (@interface.Bases.Count == 0)
            {
                var instance = new Property
                {
                    Namespace     = @interface,
                    Name          = Helpers.InstanceIdentifier,
                    QualifiedType = new QualifiedType(new BuiltinType(PrimitiveType.IntPtr)),
                    GetMethod     = new Method
                    {
                        SynthKind = FunctionSynthKind.InterfaceInstance,
                        Namespace = @interface
                    }
                };

                @interface.Properties.Add(instance);

                var dispose = new Method
                {
                    Namespace  = @interface,
                    Name       = "Dispose",
                    ReturnType = new QualifiedType(new BuiltinType(PrimitiveType.Void)),
                    SynthKind  = FunctionSynthKind.InterfaceDispose,
                    Mangled    = string.Empty
                };

                @interface.Methods.Add(dispose);
            }

            @interface.Events.AddRange(@base.Events);

            var type         = new QualifiedType(new BuiltinType(PrimitiveType.IntPtr));
            var adjustmentTo = new Property
            {
                Namespace     = @interface,
                Name          = "__PointerTo" + @base.Name,
                QualifiedType = type,
                GetMethod     = new Method
                {
                    SynthKind  = FunctionSynthKind.InterfaceInstance,
                    Namespace  = @interface,
                    ReturnType = type
                }
            };

            @interface.Properties.Add(adjustmentTo);
            @base.Properties.Add(adjustmentTo);

            @base.Bases.Add(new BaseClassSpecifier {
                Type = new TagType(@interface)
            });

            interfaces.Add(@interface);
            if (@base.IsTemplate)
            {
                @interface.IsDependent = true;
                @interface.TemplateParameters.AddRange(@base.TemplateParameters);
                templatedInterfaces[@base] = @interface;
                foreach (var spec in @base.Specializations)
                {
                    @interface.Specializations.Add(
                        (ClassTemplateSpecialization)GetNewInterface(name, spec));
                }
            }
            return(@interface);
        }
Beispiel #18
0
 public static ClassTemplateSpecialization __CreateInstance(ClassTemplateSpecialization.Internal native, bool skipVTables = false)
 {
     return new ClassTemplateSpecialization(native, skipVTables);
 }
Beispiel #19
0
 public bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     throw new NotImplementedException();
 }
Beispiel #20
0
 protected ClassTemplateSpecialization(ClassTemplateSpecialization.Internal* native, bool skipVTables = false)
     : base((CppSharp.Parser.AST.Class.Internal*) null)
 {
     __PointerAdjustment = 0;
     if (native == null)
         return;
     __Instance = new global::System.IntPtr(native);
 }
Beispiel #21
0
 public string VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     return(VisitClassDecl(specialization));
 }
Beispiel #22
0
 private static ClassTemplateSpecialization.Internal* __CopyValue(ClassTemplateSpecialization.Internal native)
 {
     var ret = Marshal.AllocHGlobal(552);
     CppSharp.Parser.AST.ClassTemplateSpecialization.Internal.cctor_2(ret, new global::System.IntPtr(&native));
     return (ClassTemplateSpecialization.Internal*) ret;
 }
Beispiel #23
0
 public virtual bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
 {
     return(VisitClassDecl(specialization));
 }
Beispiel #24
0
 protected ClassTemplateSpecialization(ClassTemplateSpecialization.Internal* native, bool isInternalImpl = false)
     : base((CppSharp.Parser.AST.Class.Internal*) native)
 {
 }
Beispiel #25
0
 public override TypePrinterResult VisitClassTemplateSpecializationDecl(
     ClassTemplateSpecialization specialization)
 {
     return(VisitClassDecl(specialization));
 }