Printable.h revision 309124
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 usefull 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