]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/Support/FormatCommon.h
Update to bmake-201802222
[FreeBSD/FreeBSD.git] / contrib / llvm / 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_adapter &Adapter;
22   AlignStyle Where;
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