From b3bc8706a027f30e69541a20aa5948e5f581dd60 Mon Sep 17 00:00:00 2001 From: triton Date: Mon, 18 Nov 2013 02:47:10 +0000 Subject: [PATCH] Changed CppParser to use macros to define the containers. This way we can also define some helper methods to consume these from C#. --- src/CppParser/AST.h | 52 +++++++++++++++++++++------------------ src/CppParser/CppParser.h | 12 ++++++--- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 5b566282..0a239ea2 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -20,6 +20,11 @@ #define CS_API #endif +#define VECTOR(type, name) \ + std::vector name; \ + type get##name(unsigned i) { return name[i]; } \ + unsigned get##name##Count() { return name.size(); } + namespace CppSharp { namespace CppParser { namespace AST { // Types @@ -79,8 +84,8 @@ enum class CallingConvention struct CS_API FunctionType : public Type { QualifiedType ReturnType; - std::vector Parameters; CppSharp::CppParser::AST::CallingConvention CallingConvention; + VECTOR(Parameter*, Parameters) }; struct CS_API PointerType : public Type @@ -140,7 +145,7 @@ struct Template; struct CS_API TemplateSpecializationType : public Type { - std::vector Arguments; + VECTOR(TemplateArgument, Arguments) CppSharp::CppParser::AST::Template* Template; Type* Desugared; }; @@ -246,7 +251,7 @@ struct CS_API VTableComponent struct CS_API VTableLayout { - std::vector Components; + VECTOR(VTableComponent, Components) }; struct CS_API VFTableInfo @@ -267,7 +272,7 @@ enum struct CppAbi struct CS_API ClassLayout { CppAbi ABI; - std::vector VFTables; + VECTOR(VFTableInfo, VFTables) VTableLayout Layout; bool HasOwnVFPtr; long VBPtrOffset; @@ -311,7 +316,7 @@ struct CS_API Declaration bool IsDependent; Declaration* CompleteDeclaration; unsigned DefinitionOrder; - std::vector PreprocessedEntities; + VECTOR(PreprocessedEntity*, PreprocessedEntities) void* OriginalPtr; }; @@ -342,13 +347,13 @@ struct CS_API DeclarationContext : public Declaration TypedefDecl* FindTypedef(const std::string& Name, bool Create = false); - std::vector Namespaces; - std::vector Enums; - std::vector Functions; - std::vector Classes; - std::vector Templates; - std::vector Typedefs; - std::vector Variables; + VECTOR(Namespace*, Namespaces) + VECTOR(Enumeration*, Enums) + VECTOR(Function*, Functions) + VECTOR(Class*, Classes) + VECTOR(Template*, Templates) + VECTOR(TypedefDecl*, Typedefs) + VECTOR(Variable*, Variables) std::map Anonymous; }; @@ -439,7 +444,7 @@ struct CS_API Function : public Declaration std::string Mangled; std::string Signature; CppSharp::CppParser::AST::CallingConvention CallingConvention; - std::vector Parameters; + VECTOR(Parameter*, Parameters) }; struct AccessSpecifierDecl; @@ -467,7 +472,6 @@ struct CS_API Enumeration : public Declaration { struct CS_API Item : public Declaration { - std::string Name; std::string Expression; std::string Comment; uint64_t Value; @@ -483,7 +487,7 @@ struct CS_API Enumeration : public Declaration EnumModifiers Modifiers; CppSharp::CppParser::AST::Type* Type; CppSharp::CppParser::AST::BuiltinType* BuiltinType; - std::vector Items; + VECTOR(Item, Items) }; struct CS_API Variable : public Declaration @@ -517,10 +521,10 @@ struct CS_API AccessSpecifierDecl : public Declaration struct CS_API Class : public DeclarationContext { - std::vector Bases; - std::vector Fields; - std::vector Methods; - std::vector Specifiers; + VECTOR(BaseClassSpecifier*, Bases) + VECTOR(Field*, Fields) + VECTOR(Method*, Methods) + VECTOR(AccessSpecifierDecl*, Specifiers) bool IsPOD; bool IsAbstract; @@ -536,7 +540,7 @@ struct CS_API Class : public DeclarationContext struct CS_API Template : public Declaration { Declaration* TemplatedDecl; - std::vector Parameters; + VECTOR(TemplateParameter, Parameters) }; struct CS_API ClassTemplate : public Template @@ -583,20 +587,20 @@ struct CS_API TranslationUnit : public Namespace { std::string FileName; bool IsSystemHeader; - std::vector Namespaces; - std::vector Macros; + VECTOR(Namespace*, Namespaces) + VECTOR(MacroDefinition*, Macros) }; struct CS_API NativeLibrary { std::string FileName; - std::vector Symbols; + VECTOR(std::string, Symbols) }; struct CS_API ASTContext { TranslationUnit* FindOrCreateModule(const std::string& File); - std::vector TranslationUnits; + VECTOR(TranslationUnit*, TranslationUnits) }; } } } \ No newline at end of file diff --git a/src/CppParser/CppParser.h b/src/CppParser/CppParser.h index 44a503bf..4bbd9f3c 100644 --- a/src/CppParser/CppParser.h +++ b/src/CppParser/CppParser.h @@ -9,6 +9,10 @@ #include "AST.h" +#define VECTOR_OPTIONS(type, name) \ + std::vector name; \ + void push##name##(const type& elem) { name.push_back(elem); } + namespace CppSharp { namespace CppParser { using namespace CppSharp::CppParser::AST; @@ -30,10 +34,10 @@ struct CS_API ParserOptions std::string FileName; // Include directories - std::vector IncludeDirs; - std::vector SystemIncludeDirs; - std::vector Defines; - std::vector LibraryDirs; + VECTOR_OPTIONS(std::string, IncludeDirs) + VECTOR_OPTIONS(std::string, SystemIncludeDirs) + VECTOR_OPTIONS(std::string, Defines) + VECTOR_OPTIONS(std::string, LibraryDirs) CppSharp::CppParser::AST::ASTContext* ASTContext;