|  | //===- 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 |