xref: /openbsd-src/gnu/llvm/lldb/tools/lldb-test/FormatUtil.h (revision dda2819751e49c83612958492e38917049128b41)
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