OSDN Git Service

[Support] Introduce llvm::formatv() function.
[android-x86/external-llvm.git] / include / llvm / Support / FormatCommon.h
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"
14 #include "llvm/Support/FormatVariadicDetails.h"
15 #include "llvm/Support/raw_ostream.h"
16
17 namespace llvm {
18 enum class AlignStyle { Left, Center, Right };
19
20 struct FmtAlign {
21   detail::format_wrapper &Wrapper;
22   AlignStyle Where;
23   size_t Amount;
24
25   FmtAlign(detail::format_wrapper &Wrapper, AlignStyle Where, size_t Amount)
26       : Wrapper(Wrapper), Where(Where), Amount(Amount) {}
27
28   void format(raw_ostream &S, StringRef Options) {
29     // If we don't need to align, we can format straight into the underlying
30     // stream.  Otherwise we have to go through an intermediate stream first
31     // in order to calculate how long the output is so we can align it.
32     // TODO: Make the format method return the number of bytes written, that
33     // way we can also skip the intermediate stream for left-aligned output.
34     if (Amount == 0) {
35       Wrapper.format(S, Options);
36       return;
37     }
38     SmallString<64> Item;
39     raw_svector_ostream Stream(Item);
40
41     Wrapper.format(Stream, Options);
42     if (Amount <= Item.size()) {
43       S << Item;
44       return;
45     }
46
47     size_t PadAmount = Amount - Item.size();
48     switch (Where) {
49     case AlignStyle::Left:
50       S << Item;
51       S.indent(PadAmount);
52       break;
53     case AlignStyle::Center: {
54       size_t X = PadAmount / 2;
55       S.indent(X);
56       S << Item;
57       S.indent(PadAmount - X);
58       break;
59     }
60     default:
61       S.indent(PadAmount);
62       S << Item;
63       break;
64     }
65   }
66 };
67 }
68
69 #endif