aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Support
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2009-05-06 17:12:48 +0000
committerDan Gohman <gohman@apple.com>2009-05-06 17:12:48 +0000
commita51b284651add5bb0e3b2f10980e4d61e1eb10fb (patch)
tree407dec03a7e3a686fbb7d51065440ad7f50db35c /include/llvm/Support
parent053276c6a5b3011f0114ce41e0ae0dc415b99c59 (diff)
downloadexternal_llvm-a51b284651add5bb0e3b2f10980e4d61e1eb10fb.zip
external_llvm-a51b284651add5bb0e3b2f10980e4d61e1eb10fb.tar.gz
external_llvm-a51b284651add5bb0e3b2f10980e4d61e1eb10fb.tar.bz2
Add simplify_type specializations to allow WeakVH, AssertingVH, and
CallbackVH to participate in dyn_cast, isa, etc. without needing an explicit conversion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71087 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support')
-rw-r--r--include/llvm/Support/ValueHandle.h39
1 files changed, 37 insertions, 2 deletions
diff --git a/include/llvm/Support/ValueHandle.h b/include/llvm/Support/ValueHandle.h
index 5c6fb74..a97a5e8 100644
--- a/include/llvm/Support/ValueHandle.h
+++ b/include/llvm/Support/ValueHandle.h
@@ -126,8 +126,19 @@ public:
operator Value*() const {
return getValPtr();
}
-};
-
+};
+
+// Specialize simplify_type to allow WeakVH to participate in
+// dyn_cast, isa, etc.
+template<typename From> struct simplify_type;
+template<> struct simplify_type<const WeakVH> {
+ typedef Value* SimpleType;
+ static SimpleType getSimplifiedValue(const WeakVH &WVH) {
+ return static_cast<Value *>(WVH);
+ }
+};
+template<> struct simplify_type<WeakVH> : public simplify_type<const WeakVH> {};
+
/// AssertingVH - This is a Value Handle that points to a value and asserts out
/// if the value is destroyed while the handle is still live. This is very
/// useful for catching dangling pointer bugs and other things which can be
@@ -188,6 +199,18 @@ public:
ValueTy &operator*() const { return *getValPtr(); }
};
+// Specialize simplify_type to allow AssertingVH to participate in
+// dyn_cast, isa, etc.
+template<typename From> struct simplify_type;
+template<> struct simplify_type<const AssertingVH<Value> > {
+ typedef Value* SimpleType;
+ static SimpleType getSimplifiedValue(const AssertingVH<Value> &AVH) {
+ return static_cast<Value *>(AVH);
+ }
+};
+template<> struct simplify_type<AssertingVH<Value> >
+ : public simplify_type<const AssertingVH<Value> > {};
+
/// CallbackVH - This is a value handle that allows subclasses to define
/// callbacks that run when the underlying Value has RAUW called on it or is
/// destroyed. This class can be used as the key of a map, as long as the user
@@ -232,6 +255,18 @@ public:
virtual void allUsesReplacedWith(Value *new_value) {}
};
+// Specialize simplify_type to allow CallbackVH to participate in
+// dyn_cast, isa, etc.
+template<typename From> struct simplify_type;
+template<> struct simplify_type<const CallbackVH> {
+ typedef Value* SimpleType;
+ static SimpleType getSimplifiedValue(const CallbackVH &CVH) {
+ return static_cast<Value *>(CVH);
+ }
+};
+template<> struct simplify_type<CallbackVH>
+ : public simplify_type<const CallbackVH> {};
+
} // End llvm namespace
#endif