diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-28 06:26:18 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-28 06:26:18 +0000 |
commit | fe95deaf66e4fbd82d44b5f6afa8162fa69cb85c (patch) | |
tree | 17d31b37ce180f750570ca69baeaa6b644b1500e | |
parent | 8d7ba402ba062994e242c97719685d6d66a056dd (diff) |
Cleanups for DeclGroup.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67922 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclGroup.h | 44 | ||||
-rw-r--r-- | include/clang/AST/Stmt.h | 19 | ||||
-rw-r--r-- | lib/AST/DeclGroup.cpp | 13 |
3 files changed, 41 insertions, 35 deletions
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<DeclGroupRef*>(this)->getSingleDecl(); + } + + DeclGroup &getDeclGroup() { + assert(isDeclGroup() && "Isn't a declgroup"); + return *((DeclGroup*)(reinterpret_cast<uintptr_t>(D) & ~Mask)); + } + const DeclGroup &getDeclGroup() const { + return const_cast<DeclGroupRef*>(this)->getDeclGroup(); } + iterator begin() { - if (getKind() == DeclKind) return D ? &D : 0; - DeclGroup& G = *((DeclGroup*) (reinterpret_cast<uintptr_t>(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<uintptr_t>(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<uintptr_t>(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<uintptr_t>(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<DeclGroup*>(reinterpret_cast<uintptr_t>(D) - & ~Mask)); + S.EmitPtr(&getDeclGroup()); } } |