From: Chris Lattner Date: Sat, 28 Mar 2009 06:26:18 +0000 (+0000) Subject: Cleanups for DeclGroup. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fe95deaf66e4fbd82d44b5f6afa8162fa69cb85c;p=clang Cleanups for DeclGroup. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67922 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclGroup.h b/include/clang/AST/DeclGroup.h index 2b93f3c2cb..9b5aa1c58d 100644 --- a/include/clang/AST/DeclGroup.h +++ b/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/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index e5fa309992..5d1c6dc207 100644 --- a/include/clang/AST/Stmt.h +++ b/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/lib/AST/DeclGroup.cpp b/lib/AST/DeclGroup.cpp index 35cb6d3bc6..36a7c2b400 100644 --- a/lib/AST/DeclGroup.cpp +++ b/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()); } }