Casting.h revision 60f18ad8a5fa7d5b008a1fecf9a79b68883ca192
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