1061da546Spatrick //===- FormatUtil.h ------------------------------------------- *- C++ --*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9*dda28197Spatrick #ifndef LLDB_TOOLS_LLDB_TEST_FORMATUTIL_H 10*dda28197Spatrick #define LLDB_TOOLS_LLDB_TEST_FORMATUTIL_H 11061da546Spatrick 12061da546Spatrick #include "llvm/ADT/ArrayRef.h" 13061da546Spatrick #include "llvm/ADT/StringRef.h" 14061da546Spatrick #include "llvm/ADT/Twine.h" 15061da546Spatrick #include "llvm/Support/FormatVariadic.h" 16061da546Spatrick #include "llvm/Support/raw_ostream.h" 17061da546Spatrick 18061da546Spatrick #include <list> 19061da546Spatrick 20061da546Spatrick namespace lldb_private { 21061da546Spatrick 22061da546Spatrick class LinePrinter { 23061da546Spatrick llvm::raw_ostream &OS; 24061da546Spatrick int IndentSpaces; 25061da546Spatrick int CurrentIndent; 26061da546Spatrick 27061da546Spatrick public: 28061da546Spatrick class Line { 29061da546Spatrick LinePrinter *P; 30061da546Spatrick 31061da546Spatrick public: Line(LinePrinter & P)32061da546Spatrick Line(LinePrinter &P) : P(&P) { P.OS.indent(P.CurrentIndent); } 33061da546Spatrick ~Line(); 34061da546Spatrick Line(Line && RHS)35061da546Spatrick Line(Line &&RHS) : P(RHS.P) { RHS.P = nullptr; } 36061da546Spatrick void operator=(Line &&) = delete; 37061da546Spatrick 38061da546Spatrick operator llvm::raw_ostream &() { return P->OS; } 39061da546Spatrick }; 40061da546Spatrick 41061da546Spatrick LinePrinter(int Indent, llvm::raw_ostream &Stream); 42061da546Spatrick 43061da546Spatrick void Indent(uint32_t Amount = 0); 44061da546Spatrick void Unindent(uint32_t Amount = 0); 45061da546Spatrick void NewLine(); 46061da546Spatrick printLine(const llvm::Twine & T)47061da546Spatrick void printLine(const llvm::Twine &T) { line() << T; } formatLine(const char * Fmt,Ts &&...Items)48061da546Spatrick template <typename... Ts> void formatLine(const char *Fmt, Ts &&... Items) { 49061da546Spatrick printLine(llvm::formatv(Fmt, std::forward<Ts>(Items)...)); 50061da546Spatrick } 51061da546Spatrick 52061da546Spatrick void formatBinary(llvm::StringRef Label, llvm::ArrayRef<uint8_t> Data, 53061da546Spatrick uint32_t StartOffset); 54061da546Spatrick void formatBinary(llvm::StringRef Label, llvm::ArrayRef<uint8_t> Data, 55061da546Spatrick uint64_t BaseAddr, uint32_t StartOffset); 56061da546Spatrick line()57061da546Spatrick Line line() { return Line(*this); } getIndentLevel()58061da546Spatrick int getIndentLevel() const { return CurrentIndent; } 59061da546Spatrick }; 60061da546Spatrick 61061da546Spatrick struct AutoIndent { 62061da546Spatrick explicit AutoIndent(LinePrinter &L, uint32_t Amount = 0) 63061da546Spatrick : L(&L), Amount(Amount) { 64061da546Spatrick L.Indent(Amount); 65061da546Spatrick } ~AutoIndentAutoIndent66061da546Spatrick ~AutoIndent() { 67061da546Spatrick if (L) 68061da546Spatrick L->Unindent(Amount); 69061da546Spatrick } 70061da546Spatrick 71061da546Spatrick LinePrinter *L = nullptr; 72061da546Spatrick uint32_t Amount = 0; 73061da546Spatrick }; 74061da546Spatrick 75061da546Spatrick } // namespace lldb_private 76061da546Spatrick 77061da546Spatrick #endif 78