1fb26025575421f179020b812c4e9e958812a3deeChandler Carruth//===--- MacroBuilder.h - CPP Macro building utility ------------*- C++ -*-===//
2103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//
3103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//                     The LLVM Compiler Infrastructure
4103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//
5103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// This file is distributed under the University of Illinois Open Source
6103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth// License. See LICENSE.TXT for details.
7103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//
8103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//===----------------------------------------------------------------------===//
92f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
102f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \file
112f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett/// \brief Defines the clang::MacroBuilder utility class.
122f7f5b1f5ff023cb8c4008ae53a12b09e3ea2622James Dennett///
13103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth//===----------------------------------------------------------------------===//
14103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
15103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#ifndef LLVM_CLANG_BASIC_MACROBUILDER_H
16103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#define LLVM_CLANG_BASIC_MACROBUILDER_H
17103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
189946fc735d7285f2195f89635370f534afd9877eDmitri Gribenko#include "clang/Basic/LLVM.h"
19103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#include "llvm/ADT/Twine.h"
20103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#include "llvm/Support/raw_ostream.h"
21103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
22103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthnamespace clang {
23103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
24103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthclass MacroBuilder {
258cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  raw_ostream &Out;
26103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruthpublic:
278cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  MacroBuilder(raw_ostream &Output) : Out(Output) {}
28103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
29809d1be9820039b4cf6efa48246a0d70ffa13394James Dennett  /// Append a \#define line for macro of the form "\#define Name Value\n".
308cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void defineMacro(const Twine &Name, const Twine &Value = "1") {
31103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth    Out << "#define " << Name << ' ' << Value << '\n';
32103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth  }
33103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
3401005984f77d8a9c256da2f1f38a04c2edf0337aJames Dennett  /// Append a \#undef line for Name.  Name should be of the form XXX
3501005984f77d8a9c256da2f1f38a04c2edf0337aJames Dennett  /// and we emit "\#undef XXX".
368cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void undefineMacro(const Twine &Name) {
37103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth    Out << "#undef " << Name << '\n';
38103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth  }
39103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
40103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth  /// Directly append Str and a newline to the underlying buffer.
418cc488fefb2fb04bc8d5398da29f0182f97934cfChris Lattner  void append(const Twine &Str) {
42103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth    Out << Str << '\n';
43103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth  }
44103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth};
45103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
46103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth}  // end namespace clang
47103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth
48103b71c37a3c3a3da7128c1d0232a89b1e8d0d90Chandler Carruth#endif
49