mirror of
https://github.com/opnsense/src.git
synced 2026-02-27 03:40:37 -05:00
89 lines
2.2 KiB
C++
89 lines
2.2 KiB
C++
//===--- FullExpr.h - C++ full expression class -----------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the FullExpr interface, to be used for type safe handling
|
|
// of full expressions.
|
|
//
|
|
// Full expressions are described in C++ [intro.execution]p12.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLVM_CLANG_AST_FULLEXPR_H
|
|
#define LLVM_CLANG_AST_FULLEXPR_H
|
|
|
|
#include "llvm/ADT/PointerUnion.h"
|
|
|
|
namespace clang {
|
|
class ASTContext;
|
|
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;
|
|
}
|
|
};
|
|
|
|
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
|
|
|
|
#endif
|