]> granicus.if.org Git - clang/commitdiff
More FullExpr work.
authorAnders Carlsson <andersca@mac.com>
Wed, 16 Dec 2009 06:21:35 +0000 (06:21 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 16 Dec 2009 06:21:35 +0000 (06:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91514 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/FullExpr.h

index 5503e67354788165440867d20fb04d6227e609cc..bb81bf0fe7c849e16d0401349562d23472a6b25a 100644 (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;
-    
-    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;
-    }
+class FullExpr {
+  struct ExprAndTemporaries {
+    Expr *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