More FullExpr work.

llvm-svn: 91514
This commit is contained in:
Anders Carlsson 2009-12-16 06:21:35 +00:00
parent a5ca598ce6
commit ce5b95c05a
1 changed files with 53 additions and 45 deletions

View File

@ -23,58 +23,66 @@ namespace clang {
class CXXTemporary;
class Expr;
class FullExpr {
struct ExprAndTemporaries {
Expr *SubExpr;
unsigned NumTemps;
typedef CXXTemporary** temps_iterator;
temps_iterator temps_begin() {
return reinterpret_cast<CXXTemporary **>(this + 1);
}
temps_iterator temps_end() {
return temps_begin() + NumTemps;
}
};
llvm::PointerUnion<Expr *, ExprAndTemporaries *> SubExpr;
class FullExpr {
struct ExprAndTemporaries {
Expr *SubExpr;
FullExpr() { }
public:
static FullExpr Create(ASTContext &Context, Expr *SubExpr,
CXXTemporary **Temps, unsigned NumTemps);
void Destroy(ASTContext &Context);
Expr *getExpr() {
if (Expr *E = SubExpr.dyn_cast<Expr *>())
return E;
return SubExpr.get<ExprAndTemporaries *>()->SubExpr;
}
const Expr *getExpr() const {
return const_cast<FullExpr*>(this)->getExpr();
}
unsigned NumTemps;
typedef CXXTemporary** temps_iterator;
temps_iterator temps_begin() {
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
return ET->temps_begin();
return 0;
temps_iterator temps_begin() {
return reinterpret_cast<CXXTemporary **>(this + 1);
}
temps_iterator temps_end() {
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
return ET->temps_end();
return 0;
temps_iterator temps_end() {
return temps_begin() + NumTemps;
}
};
typedef llvm::PointerUnion<Expr *, ExprAndTemporaries *> SubExprTy;
SubExprTy SubExpr;
FullExpr() { }
public:
static FullExpr Create(ASTContext &Context, Expr *SubExpr,
CXXTemporary **Temps, unsigned NumTemps);
void Destroy(ASTContext &Context);
Expr *getExpr() {
if (Expr *E = SubExpr.dyn_cast<Expr *>())
return E;
return SubExpr.get<ExprAndTemporaries *>()->SubExpr;
}
const Expr *getExpr() const {
return const_cast<FullExpr*>(this)->getExpr();
}
typedef CXXTemporary** temps_iterator;
temps_iterator temps_begin() {
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
return ET->temps_begin();
return 0;
}
temps_iterator temps_end() {
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
return ET->temps_end();
return 0;
}
void *getAsOpaquePtr() const { return SubExpr.getOpaqueValue(); }
static FullExpr getFromOpaquePtr(void *Ptr) {
FullExpr E;
E.SubExpr = SubExprTy::getFromOpaqueValue(Ptr);
return E;
}
};
} // end namespace clang