using System; using System.Collections.Generic; using System.Linq; namespace CppSharp.AST { /// /// Represents a template parameter /// public struct TemplateParameter { public string Name; // Generic type constraint public string Constraint; } /// /// The base class of all kinds of template declarations /// (e.g., class, function, etc.). /// public abstract class Template : Declaration { // Name of the declaration. public override string Name { get { return TemplatedDecl.Name; } set { base.Name = value; } } protected Template() { Parameters = new List(); } protected Template(Declaration decl) { TemplatedDecl = decl; Parameters = new List(); } public Declaration TemplatedDecl; public List Parameters; public override string ToString() { return TemplatedDecl.ToString(); } } /// /// Declaration of a class template. /// public class ClassTemplate : Template { public List Specializations; public Class TemplatedClass { get { return TemplatedDecl as Class; } } public ClassTemplate() { Specializations = new List(); } public ClassTemplate(Declaration decl) : base(decl) { Specializations = new List(); } public override T Visit(IDeclVisitor visitor) { return visitor.VisitClassTemplateDecl(this); } public override string Name { get { if(TemplatedDecl != null) return TemplatedClass.Name; return base.Name; } set { if(TemplatedDecl != null) TemplatedClass.Name = value; else base.Name = value; } } public override string OriginalName { get { if(TemplatedDecl != null) return TemplatedClass.OriginalName; return base.OriginalName; } set { if(TemplatedDecl != null) TemplatedClass.OriginalName = value; else base.OriginalName = value; } } public ClassTemplateSpecialization FindSpecialization( TemplateSpecializationType type) { return Specializations.FirstOrDefault( spec => spec.Arguments.SequenceEqual(type.Arguments)); } public ClassTemplateSpecialization FindSpecialization(IntPtr ptr) { return Specializations.FirstOrDefault(spec => spec.OriginalPtr == ptr); } public ClassTemplatePartialSpecialization FindPartialSpecialization( TemplateSpecializationType type) { return FindSpecialization(type) as ClassTemplatePartialSpecialization; } public ClassTemplatePartialSpecialization FindPartialSpecialization(IntPtr ptr) { return FindSpecialization(ptr) as ClassTemplatePartialSpecialization; } } /// /// Describes the kind of template specialization that a particular /// template specialization declaration represents. /// public enum TemplateSpecializationKind { /// This template specialization was formed from a template-id but has /// not yet been declared, defined, or instantiated. Undeclared, /// This template specialization was implicitly instantiated from a /// template. ImplicitInstantiation, /// This template specialization was declared or defined by an explicit /// specialization or partial specialization. ExplicitSpecialization, /// This template specialization was instantiated from a template due /// to an explicit instantiation declaration request. ExplicitInstantiationDeclaration, /// This template specialization was instantiated from a template due /// to an explicit instantiation definition request. ExplicitInstantiationDefinition } /// /// Represents a class template specialization, which refers to a class /// template with a given set of template arguments. /// public class ClassTemplateSpecialization : Class { public ClassTemplate TemplatedDecl; public List Arguments; public TemplateSpecializationKind SpecializationKind; public ClassTemplateSpecialization() { Arguments = new List(); } } /// /// Represents a class template partial specialization, which refers to /// a class template with a given partial set of template arguments. /// public class ClassTemplatePartialSpecialization : ClassTemplateSpecialization { } /// /// Declaration of a template function. /// public class FunctionTemplate : Template { public FunctionTemplate(Declaration decl) : base(decl) { } public Function TemplatedFunction { get { return TemplatedDecl as Function; } } public override T Visit(IDeclVisitor visitor) { return visitor.VisitFunctionTemplateDecl(this); } } }