1//===--- Printable.h - Print function helpers -------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the Printable struct. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_SUPPORT_PRINTABLE_H 14#define LLVM_SUPPORT_PRINTABLE_H 15 16#include <functional> 17#include <utility> 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 45inline raw_ostream &operator<<(raw_ostream &OS, const Printable &P) { 46 P.Print(OS); 47 return OS; 48} 49 50} // namespace llvm 51 52#endif 53