X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FCasting.h;h=6ba5efa4755498195c6a056314887d6b4e9e5d12;hb=HEAD;hp=720c34f7b4913103452da1414f0eaa3e0a2d2dea;hpb=290ad96e86969b72d46d3444a41030d66f82b60e;p=oota-llvm.git diff --git a/include/llvm/Support/Casting.h b/include/llvm/Support/Casting.h index 720c34f7b49..6ba5efa4755 100644 --- a/include/llvm/Support/Casting.h +++ b/include/llvm/Support/Casting.h @@ -59,11 +59,8 @@ struct isa_impl { /// \brief Always allow upcasts, and perform no dynamic check for them. template -struct isa_impl - >::type - > { +struct isa_impl< + To, From, typename std::enable_if::value>::type> { static inline bool doit(const From &) { return true; } }; @@ -209,7 +206,7 @@ template struct cast_convert_val { template struct is_simple_type { static const bool value = - is_same::SimpleType>::value; + std::is_same::SimpleType>::value; }; // cast - Return the argument parameter cast to the specified type. This @@ -220,8 +217,8 @@ template struct is_simple_type { // cast(myVal)->getParent() // template -inline typename enable_if_c::value, - typename cast_retty::ret_type>::type +inline typename std::enable_if::value, + typename cast_retty::ret_type>::type cast(const Y &Val) { assert(isa(Val) && "cast() argument of incompatible type!"); return cast_convert_val< @@ -245,10 +242,30 @@ inline typename cast_retty::ret_type cast(Y *Val) { // cast_or_null - Functionally identical to cast, except that a null value is // accepted. // +template +LLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if< + !is_simple_type::value, typename cast_retty::ret_type>::type +cast_or_null(const Y &Val) { + if (!Val) + return nullptr; + assert(isa(Val) && "cast_or_null() argument of incompatible type!"); + return cast(Val); +} + +template +LLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if< + !is_simple_type::value, typename cast_retty::ret_type>::type +cast_or_null(Y &Val) { + if (!Val) + return nullptr; + assert(isa(Val) && "cast_or_null() argument of incompatible type!"); + return cast(Val); +} + template LLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty::ret_type cast_or_null(Y *Val) { - if (Val == 0) return 0; + if (!Val) return nullptr; assert(isa(Val) && "cast_or_null() argument of incompatible type!"); return cast(Val); } @@ -263,31 +280,45 @@ cast_or_null(Y *Val) { // template -LLVM_ATTRIBUTE_UNUSED_RESULT inline typename enable_if_c< +LLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if< !is_simple_type::value, typename cast_retty::ret_type>::type dyn_cast(const Y &Val) { - return isa(Val) ? cast(Val) : 0; + return isa(Val) ? cast(Val) : nullptr; } template LLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty::ret_type dyn_cast(Y &Val) { - return isa(Val) ? cast(Val) : 0; + return isa(Val) ? cast(Val) : nullptr; } template LLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty::ret_type dyn_cast(Y *Val) { - return isa(Val) ? cast(Val) : 0; + return isa(Val) ? cast(Val) : nullptr; } // dyn_cast_or_null - Functionally identical to dyn_cast, except that a null // value is accepted. // +template +LLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if< + !is_simple_type::value, typename cast_retty::ret_type>::type +dyn_cast_or_null(const Y &Val) { + return (Val && isa(Val)) ? cast(Val) : nullptr; +} + +template +LLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if< + !is_simple_type::value, typename cast_retty::ret_type>::type +dyn_cast_or_null(Y &Val) { + return (Val && isa(Val)) ? cast(Val) : nullptr; +} + template LLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty::ret_type dyn_cast_or_null(Y *Val) { - return (Val && isa(Val)) ? cast(Val) : 0; + return (Val && isa(Val)) ? cast(Val) : nullptr; } } // End llvm namespace