annotate include/llvm/Support/FormatCommon.h @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
1 //===- FormatCommon.h - Formatters for common LLVM types --------*- C++ -*-===//
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 #ifndef LLVM_SUPPORT_FORMATCOMMON_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 #define LLVM_SUPPORT_FORMATCOMMON_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 #include "llvm/ADT/SmallString.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 #include "llvm/Support/FormatVariadicDetails.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #include "llvm/Support/raw_ostream.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 enum class AlignStyle { Left, Center, Right };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 struct FmtAlign {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
20 detail::format_adapter &Adapter;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 AlignStyle Where;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 size_t Amount;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
23 char Fill;
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
25 FmtAlign(detail::format_adapter &Adapter, AlignStyle Where, size_t Amount,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
26 char Fill = ' ')
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
27 : Adapter(Adapter), Where(Where), Amount(Amount), Fill(Fill) {}
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 void format(raw_ostream &S, StringRef Options) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 // If we don't need to align, we can format straight into the underlying
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 // stream. Otherwise we have to go through an intermediate stream first
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 // in order to calculate how long the output is so we can align it.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 // TODO: Make the format method return the number of bytes written, that
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 // way we can also skip the intermediate stream for left-aligned output.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 if (Amount == 0) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
36 Adapter.format(S, Options);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 return;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 SmallString<64> Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 raw_svector_ostream Stream(Item);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 Adapter.format(Stream, Options);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 if (Amount <= Item.size()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 return;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 size_t PadAmount = Amount - Item.size();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 switch (Where) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 case AlignStyle::Left:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 S << Item;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
52 fill(S, PadAmount);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 case AlignStyle::Center: {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 size_t X = PadAmount / 2;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
56 fill(S, X);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 S << Item;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
58 fill(S, PadAmount - X);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 default:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
62 fill(S, PadAmount);
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
67
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 private:
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 void fill(llvm::raw_ostream &S, uint32_t Count) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 for (uint32_t I = 0; I < Count; ++I)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 S << Fill;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
72 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76 #endif