LLVM  6.0.0svn
FormatAdapters.h
Go to the documentation of this file.
1 //===- FormatAdapters.h - Formatters for common LLVM types -----*- 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 #ifndef LLVM_SUPPORT_FORMATADAPTERS_H
11 #define LLVM_SUPPORT_FORMATADAPTERS_H
12 
13 #include "llvm/ADT/SmallString.h"
14 #include "llvm/ADT/StringRef.h"
18 
19 namespace llvm {
20 template <typename T> class FormatAdapter : public detail::format_adapter {
21 protected:
22  explicit FormatAdapter(T &&Item) : Item(Item) {}
23 
25 };
26 
27 namespace detail {
28 template <typename T> class AlignAdapter final : public FormatAdapter<T> {
29  AlignStyle Where;
30  size_t Amount;
31  char Fill;
32 
33 public:
34  AlignAdapter(T &&Item, AlignStyle Where, size_t Amount, char Fill)
35  : FormatAdapter<T>(std::forward<T>(Item)), Where(Where), Amount(Amount),
36  Fill(Fill) {}
37 
39  auto Adapter = detail::build_format_adapter(std::forward<T>(this->Item));
40  FmtAlign(Adapter, Where, Amount, Fill).format(Stream, Style);
41  }
42 };
43 
44 template <typename T> class PadAdapter final : public FormatAdapter<T> {
45  size_t Left;
46  size_t Right;
47 
48 public:
49  PadAdapter(T &&Item, size_t Left, size_t Right)
50  : FormatAdapter<T>(std::forward<T>(Item)), Left(Left), Right(Right) {}
51 
53  auto Adapter = detail::build_format_adapter(std::forward<T>(this->Item));
54  Stream.indent(Left);
55  Adapter.format(Stream, Style);
56  Stream.indent(Right);
57  }
58 };
59 
60 template <typename T> class RepeatAdapter final : public FormatAdapter<T> {
61  size_t Count;
62 
63 public:
64  RepeatAdapter(T &&Item, size_t Count)
65  : FormatAdapter<T>(std::forward<T>(Item)), Count(Count) {}
66 
68  auto Adapter = detail::build_format_adapter(std::forward<T>(this->Item));
69  for (size_t I = 0; I < Count; ++I) {
70  Adapter.format(Stream, Style);
71  }
72  }
73 };
74 }
75 
76 template <typename T>
78  char Fill = ' ') {
79  return detail::AlignAdapter<T>(std::forward<T>(Item), Where, Amount, Fill);
80 }
81 
82 template <typename T>
84  return detail::PadAdapter<T>(std::forward<T>(Item), Left, Right);
85 }
86 
87 template <typename T>
89  return detail::RepeatAdapter<T>(std::forward<T>(Item), Count);
90 }
91 }
92 
93 #endif
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
raw_ostream & indent(unsigned NumSpaces)
indent - Insert &#39;NumSpaces&#39; spaces.
void format(raw_ostream &S, StringRef Options)
Definition: FormatCommon.h:30
Definition: BitVector.h:920
AlignAdapter(T &&Item, AlignStyle Where, size_t Amount, char Fill)
detail::AlignAdapter< T > fmt_align(T &&Item, AlignStyle Where, size_t Amount, char Fill=' ')
AlignStyle
Definition: FormatCommon.h:18
void format(llvm::raw_ostream &Stream, StringRef Style)
void format(llvm::raw_ostream &Stream, StringRef Style)
void format(llvm::raw_ostream &Stream, StringRef Style)
detail::PadAdapter< T > fmt_pad(T &&Item, size_t Left, size_t Right)
PadAdapter(T &&Item, size_t Left, size_t Right)
RepeatAdapter(T &&Item, size_t Count)
#define I(x, y, z)
Definition: MD5.cpp:58
std::enable_if< uses_format_member< T >::value, T >::type build_format_adapter(T &&Item)
detail::RepeatAdapter< T > fmt_repeat(T &&Item, size_t Count)
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:44
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49