1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/Casting.h - Allow flexible, checked, casts -*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 3b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// The LLVM Compiler Infrastructure 4b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 8b2109ce97881269a610fa4afbcbca350e975174dJohn Criswell//===----------------------------------------------------------------------===// 9589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 10589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// This file defines the isa<X>(), cast<X>(), dyn_cast<X>(), cast_or_null<X>(), 11589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// and dyn_cast_or_null<X>() templates. 12589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 13589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//===----------------------------------------------------------------------===// 14589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 15551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_CASTING_H 16551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_CASTING_H 17589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 188b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva#include "llvm/Support/type_traits.h" 19c7365a9ec96ff434d93d0d8052812283b33e537dReid Spencer#include <cassert> 20c7365a9ec96ff434d93d0d8052812283b33e537dReid Spencer 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 23589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//===----------------------------------------------------------------------===// 247e70829632f82de15db187845666aaca6e04b792Chris Lattner// isa<x> Support Templates 25589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//===----------------------------------------------------------------------===// 26589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 277e70829632f82de15db187845666aaca6e04b792Chris Lattner// Define a template that can be specialized by smart pointers to reflect the 287e70829632f82de15db187845666aaca6e04b792Chris Lattner// fact that they are automatically dereferenced, and are not involved with the 297e70829632f82de15db187845666aaca6e04b792Chris Lattner// template selection process... the default implementation is a noop. 307e70829632f82de15db187845666aaca6e04b792Chris Lattner// 317e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<typename From> struct simplify_type { 327e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef From SimpleType; // The real type this represents... 337e70829632f82de15db187845666aaca6e04b792Chris Lattner 347e70829632f82de15db187845666aaca6e04b792Chris Lattner // An accessor to get the real value... 357e70829632f82de15db187845666aaca6e04b792Chris Lattner static SimpleType &getSimplifiedValue(From &Val) { return Val; } 367e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 377e70829632f82de15db187845666aaca6e04b792Chris Lattner 387e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<typename From> struct simplify_type<const From> { 397fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola typedef typename simplify_type<From>::SimpleType NonConstSimpleType; 407fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola typedef typename add_const_past_pointer<NonConstSimpleType>::type 417fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola SimpleType; 427fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola typedef typename add_lvalue_reference_if_not_pointer<SimpleType>::type 437fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola RetType; 447fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola static RetType getSimplifiedValue(const From& Val) { 457fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val)); 467e70829632f82de15db187845666aaca6e04b792Chris Lattner } 477e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 487e70829632f82de15db187845666aaca6e04b792Chris Lattner 4921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// The core of the implementation of isa<X> is here; To and From should be 5021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// the names of classes. This template can be specialized to customize the 5121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// implementation of isa<> without rewriting it from scratch. 528b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvatemplate <typename To, typename From, typename Enabler = void> 530179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregorstruct isa_impl { 540179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor static inline bool doit(const From &Val) { 550179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor return To::classof(&Val); 560179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor } 570179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor}; 587e70829632f82de15db187845666aaca6e04b792Chris Lattner 598b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva/// \brief Always allow upcasts, and perform no dynamic check for them. 608b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvatemplate <typename To, typename From> 618b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvastruct isa_impl<To, From, 620711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie typename enable_if< 630711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie llvm::is_base_of<To, From> 648b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva >::type 658b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva > { 668b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva static inline bool doit(const From &) { return true; } 678b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva}; 688b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva 6921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl { 7021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static inline bool doit(const From &Val) { 7121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl<To, From>::doit(Val); 727e70829632f82de15db187845666aaca6e04b792Chris Lattner } 737e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 747e70829632f82de15db187845666aaca6e04b792Chris Lattner 7521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From> { 7621c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static inline bool doit(const From &Val) { 7721c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl<To, From>::doit(Val); 787e70829632f82de15db187845666aaca6e04b792Chris Lattner } 797e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 807e70829632f82de15db187845666aaca6e04b792Chris Lattner 8121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, From*> { 8221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static inline bool doit(const From *Val) { 83f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose assert(Val && "isa<> used on a null pointer"); 8421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl<To, From>::doit(*Val); 857e70829632f82de15db187845666aaca6e04b792Chris Lattner } 867e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 877e70829632f82de15db187845666aaca6e04b792Chris Lattner 887fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindolatemplate <typename To, typename From> struct isa_impl_cl<To, From*const> { 897fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola static inline bool doit(const From *Val) { 907fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola assert(Val && "isa<> used on a null pointer"); 917fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola return isa_impl<To, From>::doit(*Val); 927fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola } 937fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola}; 947fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola 9521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From*> { 9621c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static inline bool doit(const From *Val) { 97f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose assert(Val && "isa<> used on a null pointer"); 9821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl<To, From>::doit(*Val); 997e70829632f82de15db187845666aaca6e04b792Chris Lattner } 1007e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1017e70829632f82de15db187845666aaca6e04b792Chris Lattner 10221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From*const> { 10321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static inline bool doit(const From *Val) { 104f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose assert(Val && "isa<> used on a null pointer"); 10521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl<To, From>::doit(*Val); 1067e70829632f82de15db187845666aaca6e04b792Chris Lattner } 1077e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1087e70829632f82de15db187845666aaca6e04b792Chris Lattner 10921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate<typename To, typename From, typename SimpleFrom> 11021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmanstruct isa_impl_wrap { 11121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman // When From != SimplifiedType, we can simplify the type some more by using 11221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman // the simplify_type template. 11321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static bool doit(const From &Val) { 11421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl_wrap<To, SimpleFrom, 11521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman typename simplify_type<SimpleFrom>::SimpleType>::doit( 1167fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola simplify_type<const From>::getSimplifiedValue(Val)); 1177e70829632f82de15db187845666aaca6e04b792Chris Lattner } 1187e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1197e70829632f82de15db187845666aaca6e04b792Chris Lattner 12021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate<typename To, typename FromTy> 12121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmanstruct isa_impl_wrap<To, FromTy, FromTy> { 12221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman // When From == SimpleType, we are as simple as we are going to get. 12321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman static bool doit(const FromTy &Val) { 12421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman return isa_impl_cl<To,FromTy>::doit(Val); 12521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman } 12621c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman}; 12721c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman 12821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// isa<X> - Return true if the parameter to the template is an instance of the 12921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// template type argument. Used like this: 13021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// 13121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// if (isa<Type>(myVal)) { ... } 13221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// 133589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y> 1347e70829632f82de15db187845666aaca6e04b792Chris Lattnerinline bool isa(const Y &Val) { 1357fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola return isa_impl_wrap<X, const Y, 1367fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola typename simplify_type<const Y>::SimpleType>::doit(Val); 137589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner} 138589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 1397e70829632f82de15db187845666aaca6e04b792Chris Lattner//===----------------------------------------------------------------------===// 1407e70829632f82de15db187845666aaca6e04b792Chris Lattner// cast<x> Support Templates 1417e70829632f82de15db187845666aaca6e04b792Chris Lattner//===----------------------------------------------------------------------===// 1427e70829632f82de15db187845666aaca6e04b792Chris Lattner 1437e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty; 1447e70829632f82de15db187845666aaca6e04b792Chris Lattner 1457e70829632f82de15db187845666aaca6e04b792Chris Lattner 1467e70829632f82de15db187845666aaca6e04b792Chris Lattner// Calculate what type the 'cast' function should return, based on a requested 1477e70829632f82de15db187845666aaca6e04b792Chris Lattner// type of To and a source type of From. 1487e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl { 1497e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef To& ret_type; // Normal case, return Ty& 1507e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1517e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From> { 1527e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef const To &ret_type; // Normal case, return Ty& 1537e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1547e70829632f82de15db187845666aaca6e04b792Chris Lattner 1557e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, From*> { 1567e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef To* ret_type; // Pointer arg case, return Ty* 1577e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1587e70829632f82de15db187845666aaca6e04b792Chris Lattner 1597e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From*> { 1607e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef const To* ret_type; // Constant pointer arg case, return const Ty* 1617e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1627e70829632f82de15db187845666aaca6e04b792Chris Lattner 1637e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From*const> { 1647e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef const To* ret_type; // Constant pointer arg case, return const Ty* 1657e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1667e70829632f82de15db187845666aaca6e04b792Chris Lattner 1677e70829632f82de15db187845666aaca6e04b792Chris Lattner 1687e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From, class SimpleFrom> 1697e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty_wrap { 1707e70829632f82de15db187845666aaca6e04b792Chris Lattner // When the simplified type and the from type are not the same, use the type 1717e70829632f82de15db187845666aaca6e04b792Chris Lattner // simplifier to reduce the type, then reuse cast_retty_impl to get the 1727e70829632f82de15db187845666aaca6e04b792Chris Lattner // resultant type. 1737e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef typename cast_retty<To, SimpleFrom>::ret_type ret_type; 1747e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1757e70829632f82de15db187845666aaca6e04b792Chris Lattner 1767e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class FromTy> 1777e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty_wrap<To, FromTy, FromTy> { 1787e70829632f82de15db187845666aaca6e04b792Chris Lattner // When the simplified type is equal to the from type, use it directly. 1797e70829632f82de15db187845666aaca6e04b792Chris Lattner typedef typename cast_retty_impl<To,FromTy>::ret_type ret_type; 1807e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1817e70829632f82de15db187845666aaca6e04b792Chris Lattner 1827e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> 1837e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty { 18463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman typedef typename cast_retty_wrap<To, From, 1855a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner typename simplify_type<From>::SimpleType>::ret_type ret_type; 1867e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1877e70829632f82de15db187845666aaca6e04b792Chris Lattner 1887e70829632f82de15db187845666aaca6e04b792Chris Lattner// Ensure the non-simple values are converted using the simplify_type template 1897e70829632f82de15db187845666aaca6e04b792Chris Lattner// that may be specialized by smart pointers... 1907e70829632f82de15db187845666aaca6e04b792Chris Lattner// 1917e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From, class SimpleFrom> struct cast_convert_val { 1927e70829632f82de15db187845666aaca6e04b792Chris Lattner // This is not a simple type, use the template to simplify it... 1937fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola static typename cast_retty<To, From>::ret_type doit(From &Val) { 1947e70829632f82de15db187845666aaca6e04b792Chris Lattner return cast_convert_val<To, SimpleFrom, 1955a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner typename simplify_type<SimpleFrom>::SimpleType>::doit( 1967e70829632f82de15db187845666aaca6e04b792Chris Lattner simplify_type<From>::getSimplifiedValue(Val)); 1977e70829632f82de15db187845666aaca6e04b792Chris Lattner } 1987e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 1997e70829632f82de15db187845666aaca6e04b792Chris Lattner 2007e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class FromTy> struct cast_convert_val<To,FromTy,FromTy> { 2017e70829632f82de15db187845666aaca6e04b792Chris Lattner // This _is_ a simple type, just cast it. 2025a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) { 2033a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner typename cast_retty<To, FromTy>::ret_type Res2 2043a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val); 2053a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner return Res2; 2067e70829632f82de15db187845666aaca6e04b792Chris Lattner } 2077e70829632f82de15db187845666aaca6e04b792Chris Lattner}; 2087e70829632f82de15db187845666aaca6e04b792Chris Lattner 20960f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolatemplate <class X> struct is_simple_type { 21060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola static const bool value = 21160f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola is_same<X, typename simplify_type<X>::SimpleType>::value; 21260f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola}; 213589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 214589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// cast<X> - Return the argument parameter cast to the specified type. This 215589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// casting operator asserts that the type is correct, so it does not return null 2165fc25cccff3cdbfd34d08b9c1233f9af1879018cChris Lattner// on failure. It does not allow a null argument (use cast_or_null for that). 2175fc25cccff3cdbfd34d08b9c1233f9af1879018cChris Lattner// It is typically used like this: 218589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 2197e70829632f82de15db187845666aaca6e04b792Chris Lattner// cast<Instruction>(myVal)->getParent() 220589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 221589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y> 22260f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolainline typename enable_if_c<!is_simple_type<Y>::value, 22360f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola typename cast_retty<X, const Y>::ret_type>::type 22460f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolacast(const Y &Val) { 22588d942d8983aadecae477fee523c23312d194515Misha Brukman assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!"); 22660f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola return cast_convert_val< 22760f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola X, const Y, typename simplify_type<const Y>::SimpleType>::doit(Val); 228589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner} 229589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 2300711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y> 2317fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindolainline typename cast_retty<X, Y>::ret_type cast(Y &Val) { 2320711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!"); 2330711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie return cast_convert_val<X, Y, 2340711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie typename simplify_type<Y>::SimpleType>::doit(Val); 2350711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie} 2360711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie 2370711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y> 23860f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolainline typename cast_retty<X, Y *>::ret_type cast(Y *Val) { 2390711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!"); 2400711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie return cast_convert_val<X, Y*, 2410711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie typename simplify_type<Y*>::SimpleType>::doit(Val); 2420711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie} 2430711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie 244589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// cast_or_null<X> - Functionally identical to cast, except that a null value is 245589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// accepted. 246589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 247589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y> 2489a0b165cb58cb5cf49cb3a143c302029f389acb2Argyrios Kyrtzidisinline typename cast_retty<X, Y*>::ret_type cast_or_null(Y *Val) { 2499a0b165cb58cb5cf49cb3a143c302029f389acb2Argyrios Kyrtzidis if (Val == 0) return 0; 25088d942d8983aadecae477fee523c23312d194515Misha Brukman assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!"); 2517e70829632f82de15db187845666aaca6e04b792Chris Lattner return cast<X>(Val); 252589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner} 253589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 254589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 255589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// dyn_cast<X> - Return the argument parameter cast to the specified type. This 256589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// casting operator returns null if the argument is of the wrong type, so it can 257589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// be used to test for a type as well as cast if successful. This should be 258589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// used in the context of an if statement like this: 259589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 2601ff1da7ac9bff43ba24445ff30ba2fd79bd95cd7Chris Lattner// if (const Instruction *I = dyn_cast<Instruction>(myVal)) { ... } 261589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 262589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 263589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y> 26460f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolainline typename enable_if_c<!is_simple_type<Y>::value, 26560f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola typename cast_retty<X, const Y>::ret_type>::type 26660f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindoladyn_cast(const Y &Val) { 2670711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie return isa<X>(Val) ? cast<X>(Val) : 0; 2680711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie} 2690711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie 2700711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y> 2717fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindolainline typename cast_retty<X, Y>::ret_type dyn_cast(Y &Val) { 2720711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie return isa<X>(Val) ? cast<X>(Val) : 0; 2730711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie} 2740711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie 2750711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y> 27660f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolainline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) { 2770711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie return isa<X>(Val) ? cast<X>(Val) : 0; 278589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner} 279589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner 280589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// dyn_cast_or_null<X> - Functionally identical to dyn_cast, except that a null 281589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// value is accepted. 282589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// 283589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y> 2843fde69c0f1d2ccfcc0847cebffb3b9805bef8a06Gabor Greifinline typename cast_retty<X, Y*>::ret_type dyn_cast_or_null(Y *Val) { 2853fde69c0f1d2ccfcc0847cebffb3b9805bef8a06Gabor Greif return (Val && isa<X>(Val)) ? cast<X>(Val) : 0; 2867e70829632f82de15db187845666aaca6e04b792Chris Lattner} 2877e70829632f82de15db187845666aaca6e04b792Chris Lattner 288d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 289d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2907e70829632f82de15db187845666aaca6e04b792Chris Lattner#endif 291