Cleanups for DeclGroup.

llvm-svn: 67922
This commit is contained in:
Chris Lattner 2009-03-28 06:26:18 +00:00
parent dca83c4676
commit 23b88b73e1
3 changed files with 41 additions and 35 deletions

View File

@ -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();
}

View File

@ -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; }

View File

@ -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());
}
}