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 78