1//===--- Printable.h - Print function helpers -------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the Printable struct. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_SUPPORT_PRINTABLE_H 15#define LLVM_SUPPORT_PRINTABLE_H 16 17#include <functional> 18 19namespace llvm { 20 21class raw_ostream; 22 23/// Simple wrapper around std::function<void(raw_ostream&)>. 24/// This class is useful to construct print helpers for raw_ostream. 25/// 26/// Example: 27/// Printable PrintRegister(unsigned Register) { 28/// return Printable([Register](raw_ostream &OS) { 29/// OS << getRegisterName(Register); 30/// } 31/// } 32/// ... OS << PrintRegister(Register); ... 33/// 34/// Implementation note: Ideally this would just be a typedef, but doing so 35/// leads to operator << being ambiguous as function has matching constructors 36/// in some STL versions. I have seen the problem on gcc 4.6 libstdc++ and 37/// microsoft STL. 38class Printable { 39public: 40 std::function<void(raw_ostream &OS)> Print; 41 Printable(std::function<void(raw_ostream &OS)> Print) 42 : Print(std::move(Print)) {} 43}; 44 45static inline raw_ostream &operator<<(raw_ostream &OS, const Printable &P) { 46 P.Print(OS); 47 return OS; 48} 49 50} 51 52#endif 53