LLVM  6.0.0svn
FormatCommon.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_FORMATCOMMON_H
11 #define LLVM_SUPPORT_FORMATCOMMON_H
12 
13 #include "llvm/ADT/SmallString.h"
16 
17 namespace llvm {
18 enum class AlignStyle { Left, Center, Right };
19 
20 struct FmtAlign {
23  size_t Amount;
24  char Fill;
25 
26  FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount,
27  char Fill = ' ')
28  : Adapter(Adapter), Where(Where), Amount(Amount), Fill(Fill) {}
29 
30  void format(raw_ostream &S, StringRef Options) {
31  // If we don't need to align, we can format straight into the underlying
32  // stream. Otherwise we have to go through an intermediate stream first
33  // in order to calculate how long the output is so we can align it.
34  // TODO: Make the format method return the number of bytes written, that
35  // way we can also skip the intermediate stream for left-aligned output.
36  if (Amount == 0) {
37  Adapter.format(S, Options);
38  return;
39  }
40  SmallString<64> Item;
41  raw_svector_ostream Stream(Item);
42 
43  Adapter.format(Stream, Options);
44  if (Amount <= Item.size()) {
45  S << Item;
46  return;
47  }
48 
49  size_t PadAmount = Amount - Item.size();
50  switch (Where) {
51  case AlignStyle::Left:
52  S << Item;
53  fill(S, PadAmount);
54  break;
55  case AlignStyle::Center: {
56  size_t X = PadAmount / 2;
57  fill(S, X);
58  S << Item;
59  fill(S, PadAmount - X);
60  break;
61  }
62  default:
63  fill(S, PadAmount);
64  S << Item;
65  break;
66  }
67  }
68 
69 private:
70  void fill(llvm::raw_ostream &S, uint32_t Count) {
71  for (uint32_t I = 0; I < Count; ++I)
72  S << Fill;
73  }
74 };
75 }
76 
77 #endif
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
AlignStyle Where
Definition: FormatCommon.h:22
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
LLVM_ATTRIBUTE_ALWAYS_INLINE size_type size() const
Definition: SmallVector.h:136
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:489
virtual void format(raw_ostream &S, StringRef Options)=0
void format(raw_ostream &S, StringRef Options)
Definition: FormatCommon.h:30
AlignStyle
Definition: FormatCommon.h:18
FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount, char Fill=' ')
Definition: FormatCommon.h:26
detail::format_adapter & Adapter
Definition: FormatCommon.h:21
#define I(x, y, z)
Definition: MD5.cpp:58
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