From 23b88b73e1982404b75a5175dccab22eb6a3a29a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 28 Mar 2009 06:26:18 +0000 Subject: [PATCH] Cleanups for DeclGroup. llvm-svn: 67922 --- clang/include/clang/AST/DeclGroup.h | 44 ++++++++++++++++++++--------- clang/include/clang/AST/Stmt.h | 19 ++++--------- clang/lib/AST/DeclGroup.cpp | 13 ++++----- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/clang/include/clang/AST/DeclGroup.h b/clang/include/clang/AST/DeclGroup.h index 2b93f3c2cb3d..9b5aa1c58db0 100644 --- a/clang/include/clang/AST/DeclGroup.h +++ b/clang/include/clang/AST/DeclGroup.h @@ -58,7 +58,7 @@ public: class DeclGroupRef { protected: - enum Kind { DeclKind=0x0, DeclGroupKind=0x1, Mask=0x1 }; + enum Kind { SingleDeclKind=0x0, DeclGroupKind=0x1, Mask=0x1 }; Decl* D; Kind getKind() const { @@ -75,31 +75,49 @@ public: typedef Decl** iterator; typedef Decl* const * const_iterator; - bool hasSolitaryDecl() const { - return getKind() == DeclKind; + bool isSingleDecl() const { return getKind() == SingleDeclKind; } + bool isDeclGroup() const { return getKind() == DeclGroupKind; } + + Decl *getSingleDecl() { + assert(isSingleDecl() && "Isn't a declgroup"); + return D; } + const Decl *getSingleDecl() const { + return const_cast(this)->getSingleDecl(); + } + + DeclGroup &getDeclGroup() { + assert(isDeclGroup() && "Isn't a declgroup"); + return *((DeclGroup*)(reinterpret_cast(D) & ~Mask)); + } + const DeclGroup &getDeclGroup() const { + return const_cast(this)->getDeclGroup(); + } + iterator begin() { - if (getKind() == DeclKind) return D ? &D : 0; - DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); - return &G[0]; + if (isSingleDecl()) + return D ? &D : 0; + return &getDeclGroup()[0]; } iterator end() { - if (getKind() == DeclKind) return D ? &D + 1 : 0; - DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); + if (isSingleDecl()) + return D ? &D+1 : 0; + DeclGroup &G = getDeclGroup(); return &G[0] + G.size(); } const_iterator begin() const { - if (getKind() == DeclKind) return D ? &D : 0; - DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); - return &G[0]; + if (isSingleDecl()) + return D ? &D : 0; + return &getDeclGroup()[0]; } const_iterator end() const { - if (getKind() == DeclKind) return D ? &D + 1 : 0; - DeclGroup& G = *((DeclGroup*) (reinterpret_cast(D) & ~Mask)); + if (isSingleDecl()) + return D ? &D+1 : 0; + const DeclGroup &G = getDeclGroup(); return &G[0] + G.size(); } diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index e5fa30999259..5d1c6dc2077c 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -235,23 +235,14 @@ public: virtual void Destroy(ASTContext& Ctx); - // hasSolitaryDecl - This method returns true if this DeclStmt refers - // to a single Decl. + /// hasSolitaryDecl - This method returns true if this DeclStmt refers + /// to a single Decl. bool hasSolitaryDecl() const { - return DG.hasSolitaryDecl(); + return DG.isSingleDecl(); } - const Decl* getSolitaryDecl() const { - assert (hasSolitaryDecl() && - "Caller assumes this DeclStmt points to one Decl*"); - return *DG.begin(); - } - - Decl* getSolitaryDecl() { - assert (hasSolitaryDecl() && - "Caller assumes this DeclStmt points to one Decl*"); - return *DG.begin(); - } + const Decl* getSolitaryDecl() const { return DG.getSingleDecl(); } + Decl *getSolitaryDecl() { return DG.getSingleDecl(); } SourceLocation getStartLoc() const { return StartLoc; } SourceLocation getEndLoc() const { return EndLoc; } diff --git a/clang/lib/AST/DeclGroup.cpp b/clang/lib/AST/DeclGroup.cpp index 35cb6d3bc614..36a7c2b400e3 100644 --- a/clang/lib/AST/DeclGroup.cpp +++ b/clang/lib/AST/DeclGroup.cpp @@ -17,7 +17,6 @@ #include "llvm/Support/Allocator.h" #include "llvm/Bitcode/Serialize.h" #include "llvm/Bitcode/Deserialize.h" - using namespace clang; DeclGroup* DeclGroup::Create(ASTContext& C, unsigned numdecls, Decl** decls) { @@ -48,8 +47,8 @@ DeclGroup* DeclGroup::Read(llvm::Deserializer& D, ASTContext& C) { } DeclGroup::DeclGroup(unsigned numdecls, Decl** decls) : NumDecls(numdecls) { - assert (numdecls > 0); - assert (decls); + assert(numdecls > 0); + assert(decls); memcpy(this+1, decls, numdecls * sizeof(*decls)); } @@ -59,14 +58,12 @@ void DeclGroup::Destroy(ASTContext& C) { } void DeclGroupRef::Emit(llvm::Serializer& S) const { - if (getKind() == DeclKind) { + if (isSingleDecl()) { S.EmitBool(false); S.EmitPtr(D); - } - else { + } else { S.EmitBool(true); - S.EmitPtr(reinterpret_cast(reinterpret_cast(D) - & ~Mask)); + S.EmitPtr(&getDeclGroup()); } }