Casting.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Compiler.h"
198b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva#include "llvm/Support/type_traits.h"
20c7365a9ec96ff434d93d0d8052812283b33e537dReid Spencer#include <cassert>
21c7365a9ec96ff434d93d0d8052812283b33e537dReid Spencer
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
24589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//===----------------------------------------------------------------------===//
257e70829632f82de15db187845666aaca6e04b792Chris Lattner//                          isa<x> Support Templates
26589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//===----------------------------------------------------------------------===//
27589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
287e70829632f82de15db187845666aaca6e04b792Chris Lattner// Define a template that can be specialized by smart pointers to reflect the
297e70829632f82de15db187845666aaca6e04b792Chris Lattner// fact that they are automatically dereferenced, and are not involved with the
307e70829632f82de15db187845666aaca6e04b792Chris Lattner// template selection process...  the default implementation is a noop.
317e70829632f82de15db187845666aaca6e04b792Chris Lattner//
327e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<typename From> struct simplify_type {
337e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef       From SimpleType;        // The real type this represents...
347e70829632f82de15db187845666aaca6e04b792Chris Lattner
357e70829632f82de15db187845666aaca6e04b792Chris Lattner  // An accessor to get the real value...
367e70829632f82de15db187845666aaca6e04b792Chris Lattner  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
377e70829632f82de15db187845666aaca6e04b792Chris Lattner};
387e70829632f82de15db187845666aaca6e04b792Chris Lattner
397e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<typename From> struct simplify_type<const From> {
407fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  typedef typename simplify_type<From>::SimpleType NonConstSimpleType;
417fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  typedef typename add_const_past_pointer<NonConstSimpleType>::type
427fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola    SimpleType;
437fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  typedef typename add_lvalue_reference_if_not_pointer<SimpleType>::type
447fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola    RetType;
457fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  static RetType getSimplifiedValue(const From& Val) {
467fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
477e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
487e70829632f82de15db187845666aaca6e04b792Chris Lattner};
497e70829632f82de15db187845666aaca6e04b792Chris Lattner
5021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// The core of the implementation of isa<X> is here; To and From should be
5121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// the names of classes.  This template can be specialized to customize the
5221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// implementation of isa<> without rewriting it from scratch.
538b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvatemplate <typename To, typename From, typename Enabler = void>
540179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregorstruct isa_impl {
550179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor  static inline bool doit(const From &Val) {
560179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor    return To::classof(&Val);
570179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor  }
580179e977234fef45b1877eb93a3c7565cdd1862dDouglas Gregor};
597e70829632f82de15db187845666aaca6e04b792Chris Lattner
608b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva/// \brief Always allow upcasts, and perform no dynamic check for them.
618b8fa7b2f403ae2f342413239c4151e075022c97Sean Silvatemplate <typename To, typename From>
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct isa_impl<
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    To, From, typename std::enable_if<std::is_base_of<To, From>::value>::type> {
648b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva  static inline bool doit(const From &) { return true; }
658b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva};
668b8fa7b2f403ae2f342413239c4151e075022c97Sean Silva
6721c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl {
6821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static inline bool doit(const From &Val) {
6921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl<To, From>::doit(Val);
707e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
717e70829632f82de15db187845666aaca6e04b792Chris Lattner};
727e70829632f82de15db187845666aaca6e04b792Chris Lattner
7321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From> {
7421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static inline bool doit(const From &Val) {
7521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl<To, From>::doit(Val);
767e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
777e70829632f82de15db187845666aaca6e04b792Chris Lattner};
787e70829632f82de15db187845666aaca6e04b792Chris Lattner
7921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, From*> {
8021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static inline bool doit(const From *Val) {
81f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose    assert(Val && "isa<> used on a null pointer");
8221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl<To, From>::doit(*Val);
837e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
847e70829632f82de15db187845666aaca6e04b792Chris Lattner};
857e70829632f82de15db187845666aaca6e04b792Chris Lattner
867fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindolatemplate <typename To, typename From> struct isa_impl_cl<To, From*const> {
877fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  static inline bool doit(const From *Val) {
887fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola    assert(Val && "isa<> used on a null pointer");
897fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola    return isa_impl<To, From>::doit(*Val);
907fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  }
917fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola};
927fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola
9321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From*> {
9421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static inline bool doit(const From *Val) {
95f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose    assert(Val && "isa<> used on a null pointer");
9621c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl<To, From>::doit(*Val);
977e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
987e70829632f82de15db187845666aaca6e04b792Chris Lattner};
997e70829632f82de15db187845666aaca6e04b792Chris Lattner
10021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate <typename To, typename From> struct isa_impl_cl<To, const From*const> {
10121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static inline bool doit(const From *Val) {
102f5091b476c46333ecfcf095cd2e422e9748e9546Jordan Rose    assert(Val && "isa<> used on a null pointer");
10321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl<To, From>::doit(*Val);
1047e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
1057e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1067e70829632f82de15db187845666aaca6e04b792Chris Lattner
10721c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate<typename To, typename From, typename SimpleFrom>
10821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmanstruct isa_impl_wrap {
10921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  // When From != SimplifiedType, we can simplify the type some more by using
11021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  // the simplify_type template.
11121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static bool doit(const From &Val) {
11221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl_wrap<To, SimpleFrom,
11321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman      typename simplify_type<SimpleFrom>::SimpleType>::doit(
1147fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola                          simplify_type<const From>::getSimplifiedValue(Val));
1157e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
1167e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1177e70829632f82de15db187845666aaca6e04b792Chris Lattner
11821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmantemplate<typename To, typename FromTy>
11921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedmanstruct isa_impl_wrap<To, FromTy, FromTy> {
12021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  // When From == SimpleType, we are as simple as we are going to get.
12121c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  static bool doit(const FromTy &Val) {
12221c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman    return isa_impl_cl<To,FromTy>::doit(Val);
12321c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman  }
12421c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman};
12521c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman
12621c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// isa<X> - Return true if the parameter to the template is an instance of the
12721c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman// template type argument.  Used like this:
12821c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman//
12921c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman//  if (isa<Type>(myVal)) { ... }
13021c60904ce6b937cb0c8744375e9c1a95fe0e495Eli Friedman//
131589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y>
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline bool isa(const Y &Val) {
1337fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  return isa_impl_wrap<X, const Y,
1347fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola                       typename simplify_type<const Y>::SimpleType>::doit(Val);
135589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner}
136589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
1377e70829632f82de15db187845666aaca6e04b792Chris Lattner//===----------------------------------------------------------------------===//
1387e70829632f82de15db187845666aaca6e04b792Chris Lattner//                          cast<x> Support Templates
1397e70829632f82de15db187845666aaca6e04b792Chris Lattner//===----------------------------------------------------------------------===//
1407e70829632f82de15db187845666aaca6e04b792Chris Lattner
1417e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty;
1427e70829632f82de15db187845666aaca6e04b792Chris Lattner
1437e70829632f82de15db187845666aaca6e04b792Chris Lattner
1447e70829632f82de15db187845666aaca6e04b792Chris Lattner// Calculate what type the 'cast' function should return, based on a requested
1457e70829632f82de15db187845666aaca6e04b792Chris Lattner// type of To and a source type of From.
1467e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl {
1477e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef To& ret_type;         // Normal case, return Ty&
1487e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1497e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From> {
1507e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef const To &ret_type;   // Normal case, return Ty&
1517e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1527e70829632f82de15db187845666aaca6e04b792Chris Lattner
1537e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, From*> {
1547e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef To* ret_type;         // Pointer arg case, return Ty*
1557e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1567e70829632f82de15db187845666aaca6e04b792Chris Lattner
1577e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From*> {
1587e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef const To* ret_type;   // Constant pointer arg case, return const Ty*
1597e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1607e70829632f82de15db187845666aaca6e04b792Chris Lattner
1617e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From> struct cast_retty_impl<To, const From*const> {
1627e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef const To* ret_type;   // Constant pointer arg case, return const Ty*
1637e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1647e70829632f82de15db187845666aaca6e04b792Chris Lattner
1657e70829632f82de15db187845666aaca6e04b792Chris Lattner
1667e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From, class SimpleFrom>
1677e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty_wrap {
1687e70829632f82de15db187845666aaca6e04b792Chris Lattner  // When the simplified type and the from type are not the same, use the type
1697e70829632f82de15db187845666aaca6e04b792Chris Lattner  // simplifier to reduce the type, then reuse cast_retty_impl to get the
1707e70829632f82de15db187845666aaca6e04b792Chris Lattner  // resultant type.
1717e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef typename cast_retty<To, SimpleFrom>::ret_type ret_type;
1727e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1737e70829632f82de15db187845666aaca6e04b792Chris Lattner
1747e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class FromTy>
1757e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty_wrap<To, FromTy, FromTy> {
1767e70829632f82de15db187845666aaca6e04b792Chris Lattner  // When the simplified type is equal to the from type, use it directly.
1777e70829632f82de15db187845666aaca6e04b792Chris Lattner  typedef typename cast_retty_impl<To,FromTy>::ret_type ret_type;
1787e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1797e70829632f82de15db187845666aaca6e04b792Chris Lattner
1807e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From>
1817e70829632f82de15db187845666aaca6e04b792Chris Lattnerstruct cast_retty {
18263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman  typedef typename cast_retty_wrap<To, From,
1835a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner                   typename simplify_type<From>::SimpleType>::ret_type ret_type;
1847e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1857e70829632f82de15db187845666aaca6e04b792Chris Lattner
1867e70829632f82de15db187845666aaca6e04b792Chris Lattner// Ensure the non-simple values are converted using the simplify_type template
1877e70829632f82de15db187845666aaca6e04b792Chris Lattner// that may be specialized by smart pointers...
1887e70829632f82de15db187845666aaca6e04b792Chris Lattner//
1897e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class From, class SimpleFrom> struct cast_convert_val {
1907e70829632f82de15db187845666aaca6e04b792Chris Lattner  // This is not a simple type, use the template to simplify it...
1917fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindola  static typename cast_retty<To, From>::ret_type doit(From &Val) {
1927e70829632f82de15db187845666aaca6e04b792Chris Lattner    return cast_convert_val<To, SimpleFrom,
1935a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner      typename simplify_type<SimpleFrom>::SimpleType>::doit(
1947e70829632f82de15db187845666aaca6e04b792Chris Lattner                          simplify_type<From>::getSimplifiedValue(Val));
1957e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
1967e70829632f82de15db187845666aaca6e04b792Chris Lattner};
1977e70829632f82de15db187845666aaca6e04b792Chris Lattner
1987e70829632f82de15db187845666aaca6e04b792Chris Lattnertemplate<class To, class FromTy> struct cast_convert_val<To,FromTy,FromTy> {
1997e70829632f82de15db187845666aaca6e04b792Chris Lattner  // This _is_ a simple type, just cast it.
2005a6d63ae29512d654c8c697f42f32f97b9dc010bChris Lattner  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
2013a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner    typename cast_retty<To, FromTy>::ret_type Res2
2023a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
2033a3134ab12f3aa65f9791f702a73f6d0b2af423fChris Lattner    return Res2;
2047e70829632f82de15db187845666aaca6e04b792Chris Lattner  }
2057e70829632f82de15db187845666aaca6e04b792Chris Lattner};
2067e70829632f82de15db187845666aaca6e04b792Chris Lattner
20760f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolatemplate <class X> struct is_simple_type {
20860f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola  static const bool value =
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      std::is_same<X, typename simplify_type<X>::SimpleType>::value;
21060f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola};
211589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
212589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// cast<X> - Return the argument parameter cast to the specified type.  This
213589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// casting operator asserts that the type is correct, so it does not return null
2145fc25cccff3cdbfd34d08b9c1233f9af1879018cChris Lattner// on failure.  It does not allow a null argument (use cast_or_null for that).
2155fc25cccff3cdbfd34d08b9c1233f9af1879018cChris Lattner// It is typically used like this:
216589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
2177e70829632f82de15db187845666aaca6e04b792Chris Lattner//  cast<Instruction>(myVal)->getParent()
218589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
219589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y>
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesinline typename std::enable_if<!is_simple_type<Y>::value,
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                               typename cast_retty<X, const Y>::ret_type>::type
22260f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolacast(const Y &Val) {
22388d942d8983aadecae477fee523c23312d194515Misha Brukman  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
22460f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola  return cast_convert_val<
22560f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindola      X, const Y, typename simplify_type<const Y>::SimpleType>::doit(Val);
226589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner}
227589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
2280711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y>
2297fe65d691dcce550d53ec9310913aab67ab6d654Rafael Espindolainline typename cast_retty<X, Y>::ret_type cast(Y &Val) {
2300711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
2310711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie  return cast_convert_val<X, Y,
2320711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie                          typename simplify_type<Y>::SimpleType>::doit(Val);
2330711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie}
2340711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie
2350711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y>
23660f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindolainline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
2370711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
2380711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie  return cast_convert_val<X, Y*,
2390711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie                          typename simplify_type<Y*>::SimpleType>::doit(Val);
2400711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie}
2410711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie
242589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// cast_or_null<X> - Functionally identical to cast, except that a null value is
243589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// accepted.
244589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
245589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y>
24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty<X, Y *>::ret_type
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinescast_or_null(Y *Val) {
248dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!Val) return nullptr;
24988d942d8983aadecae477fee523c23312d194515Misha Brukman  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
2507e70829632f82de15db187845666aaca6e04b792Chris Lattner  return cast<X>(Val);
251589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner}
252589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
253589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
254589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// dyn_cast<X> - Return the argument parameter cast to the specified type.  This
255589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// casting operator returns null if the argument is of the wrong type, so it can
256589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// be used to test for a type as well as cast if successful.  This should be
257589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// used in the context of an if statement like this:
258589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
2591ff1da7ac9bff43ba24445ff30ba2fd79bd95cd7Chris Lattner//  if (const Instruction *I = dyn_cast<Instruction>(myVal)) { ... }
260589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
261589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
262589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y>
26336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline typename std::enable_if<
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    !is_simple_type<Y>::value, typename cast_retty<X, const Y>::ret_type>::type
26560f18ad8a5fa7d5b008a1fecf9a79b68883ca192Rafael Espindoladyn_cast(const Y &Val) {
266dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return isa<X>(Val) ? cast<X>(Val) : nullptr;
2670711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie}
2680711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie
2690711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y>
27036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty<X, Y>::ret_type
27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesdyn_cast(Y &Val) {
272dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return isa<X>(Val) ? cast<X>(Val) : nullptr;
2730711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie}
2740711d46a72580a943d60a770776a22aeb494e66cDavid Blaikie
2750711d46a72580a943d60a770776a22aeb494e66cDavid Blaikietemplate <class X, class Y>
27636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty<X, Y *>::ret_type
27736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesdyn_cast(Y *Val) {
278dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return isa<X>(Val) ? cast<X>(Val) : nullptr;
279589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner}
280589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner
281589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// dyn_cast_or_null<X> - Functionally identical to dyn_cast, except that a null
282589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner// value is accepted.
283589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattner//
284589df88ba03a81b2b3dc9d084c191a3a74724ecdChris Lattnertemplate <class X, class Y>
28536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLLVM_ATTRIBUTE_UNUSED_RESULT inline typename cast_retty<X, Y *>::ret_type
28636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesdyn_cast_or_null(Y *Val) {
287dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
2887e70829632f82de15db187845666aaca6e04b792Chris Lattner}
2897e70829632f82de15db187845666aaca6e04b792Chris Lattner
290d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
291d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2927e70829632f82de15db187845666aaca6e04b792Chris Lattner#endif
293