| //===- llvm/Support/CBindingWrapph.h - C Interface Wrapping -----*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file declares the wrapping macros for the C interface. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_SUPPORT_CBINDINGWRAPPING_H | 
 | #define LLVM_SUPPORT_CBINDINGWRAPPING_H | 
 |  | 
 | #include "llvm/Support/Casting.h" | 
 | #include "llvm-c/Types.h" | 
 |  | 
 | #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)     \ | 
 |   inline ty *unwrap(ref P) {                            \ | 
 |     return reinterpret_cast<ty*>(P);                    \ | 
 |   }                                                     \ | 
 |                                                         \ | 
 |   inline ref wrap(const ty *P) {                        \ | 
 |     return reinterpret_cast<ref>(const_cast<ty*>(P));   \ | 
 |   } | 
 |  | 
 | #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)        \ | 
 |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)           \ | 
 |                                                         \ | 
 |   template<typename T>                                  \ | 
 |   inline T *unwrap(ref P) {                             \ | 
 |     return cast<T>(unwrap(P));                          \ | 
 |   } | 
 |  | 
 | #define DEFINE_STDCXX_CONVERSION_FUNCTIONS(ty, ref)     \ | 
 |   DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref)           \ | 
 |                                                         \ | 
 |   template<typename T>                                  \ | 
 |   inline T *unwrap(ref P) {                             \ | 
 |     T *Q = (T*)unwrap(P);                               \ | 
 |     assert(Q && "Invalid cast!");                       \ | 
 |     return Q;                                           \ | 
 |   } | 
 |  | 
 | #endif |