annotate include/llvm/Support/FormatCommon.h @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===- FormatAdapters.h - Formatters for common LLVM types -----*- C++ -*-===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
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
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 #ifndef LLVM_SUPPORT_FORMATCOMMON_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 #define LLVM_SUPPORT_FORMATCOMMON_H
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 #include "llvm/ADT/SmallString.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #include "llvm/Support/FormatVariadicDetails.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 #include "llvm/Support/raw_ostream.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 namespace llvm {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 enum class AlignStyle { Left, Center, Right };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 struct FmtAlign {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 detail::format_wrapper &Wrapper;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 AlignStyle Where;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 size_t Amount;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 FmtAlign(detail::format_wrapper &Wrapper, AlignStyle Where, size_t Amount)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 : Wrapper(Wrapper), Where(Where), Amount(Amount) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 void format(raw_ostream &S, StringRef Options) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 // If we don't need to align, we can format straight into the underlying
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 // stream. Otherwise we have to go through an intermediate stream first
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 // in order to calculate how long the output is so we can align it.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 // TODO: Make the format method return the number of bytes written, that
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 // way we can also skip the intermediate stream for left-aligned output.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 if (Amount == 0) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 Wrapper.format(S, Options);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 return;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 SmallString<64> Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 raw_svector_ostream Stream(Item);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 Wrapper.format(Stream, Options);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 if (Amount <= Item.size()) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 return;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 size_t PadAmount = Amount - Item.size();
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 switch (Where) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 case AlignStyle::Left:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 S.indent(PadAmount);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 case AlignStyle::Center: {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 size_t X = PadAmount / 2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 S.indent(X);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 S.indent(PadAmount - X);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 S.indent(PadAmount);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 S << Item;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 #endif