raw_ostream.h revision 906d5b4455c6d605ab62f26d45cad2e49bf948bb
148534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar//===--- raw_ostream.h - Raw output stream ----------------------*- C++ -*-===//
260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//
360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//                     The LLVM Compiler Infrastructure
460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//
560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// This file is distributed under the University of Illinois Open Source
660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// License. See LICENSE.TXT for details.
760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//
860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===//
960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//
1060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//  This file defines the raw_ostream class.
1160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//
1260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===//
1360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
1460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#ifndef LLVM_SUPPORT_RAW_OSTREAM_H
1560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#define LLVM_SUPPORT_RAW_OSTREAM_H
1660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
17cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/ADT/StringExtras.h"
18dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar#include "llvm/ADT/StringRef.h"
19b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cassert>
20b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cstring>
2160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#include <string>
2207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner#include <iosfwd>
2360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
2460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnernamespace llvm {
25097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner  class format_object_base;
2678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  template <typename T>
2778a2812538d871a62d90f53ed66d26198876d011Chris Lattner  class SmallVectorImpl;
28fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
2960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_ostream - This class implements an extremely fast bulk output stream
3060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// that can *only* output to a stream.  It does not support seeking, reopening,
3160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// rewinding, line buffered disciplines etc. It is a simple buffer that outputs
3260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// a chunk at a time.
3360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_ostream {
3489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbarprivate:
35b3667ae9b6fb204e60d4e1def21442fbf0251f99Dan Gohman  // Do not implement. raw_ostream is noncopyable.
36b3667ae9b6fb204e60d4e1def21442fbf0251f99Dan Gohman  void operator=(const raw_ostream &);
37b3667ae9b6fb204e60d4e1def21442fbf0251f99Dan Gohman  raw_ostream(const raw_ostream &);
38b3667ae9b6fb204e60d4e1def21442fbf0251f99Dan Gohman
39d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  /// The buffer is handled in such a way that the buffer is
40d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  /// uninitialized, unbuffered, or out of space when OutBufCur >=
41d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  /// OutBufEnd. Thus a single comparison suffices to determine if we
42d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  /// need to take the slow path to write a single character.
43d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///
44d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  /// The buffer is in one of three states:
45906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///  1. Unbuffered (BufferMode == Unbuffered)
46906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///  1. Uninitialized (BufferMode != Unbuffered && OutBufStart == 0).
47906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///  2. Buffered (BufferMode != Unbuffered && OutBufStart != 0 &&
48d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///               OutBufEnd - OutBufStart >= 64).
49906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///
50906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// If buffered, then the raw_ostream owns the buffer if (BufferMode ==
51906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// InternalBuffer); otherwise the buffer has been set via SetBuffer and is
52906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// managed by the subclass.
53906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///
54906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// If a subclass installs an external buffer using SetBuffer then it can wait
55906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// for a \see write_impl() call to handle the data which has been put into
56906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// this buffer.
5760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  char *OutBufStart, *OutBufEnd, *OutBufCur;
58906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar
59906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  enum BufferKind {
60906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    Unbuffered = 0,
61906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    InternalBuffer,
62906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    ExternalBuffer
63906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  } BufferMode;
64e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
65e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// Error This flag is true if an error of any kind has been detected.
66e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  ///
67e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  bool Error;
68e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
6960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
70e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  // color order matches ANSI escape sequence, don't change
71e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  enum Colors {
72e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    BLACK=0,
73e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    RED,
74e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    GREEN,
75e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    YELLOW,
76e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    BLUE,
77e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    MAGENTA,
78e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    CYAN,
79e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    WHITE,
80e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    SAVEDCOLOR
81e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  };
82e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
83e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  explicit raw_ostream(bool unbuffered=false)
84906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    : BufferMode(unbuffered ? Unbuffered : InternalBuffer), Error(false) {
8560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    // Start out ready to flush.
8660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufStart = OutBufEnd = OutBufCur = 0;
8760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
885b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes
89e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  virtual ~raw_ostream();
90fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
918f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the file.
928f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell() { return current_pos() + GetNumBytesInBuffer(); }
938f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
94e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// has_error - Return the value of the flag in this raw_ostream indicating
95e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// whether an output error has been encountered.
96e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  bool has_error() const {
97e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman    return Error;
98996b9d6aa9864c24178891adf29eeafd3f34d90cDan Gohman  }
99e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
100e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// clear_error - Set the flag read by has_error() to false. If the error
101e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// flag is set at the time when this raw_ostream's destructor is called,
102e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// llvm_report_error is called to report the error. Use clear_error()
103e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// after handling the error to avoid this behavior.
104e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  void clear_error() {
105e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman    Error = false;
106996b9d6aa9864c24178891adf29eeafd3f34d90cDan Gohman  }
107e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
10860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
10960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Configuration Interface
11060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
111fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
112208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// SetBuffered - Set the stream to be buffered, with an automatically
113208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// determined buffer size.
114208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  void SetBuffered();
115fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
116906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// SetBufferSize - Set the stream to be buffered, using the
117208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// specified buffer size.
118906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  void SetBufferSize(size_t Size) {
119906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    flush();
120906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    SetBufferAndMode(new char[Size], Size, InternalBuffer);
121906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  }
122208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
123208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  size_t GetBufferSize() {
124208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // If we're supposed to be buffered but haven't actually gotten around
125208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // to allocating the buffer yet, return the value that would be used.
126208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    if (!Unbuffered && !OutBufStart)
127208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman      return preferred_buffer_size();
128208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
129208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // Otherwise just return the size of the allocated buffer.
130f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman    return OutBufEnd - OutBufStart;
131f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman  }
132f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman
133208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// SetUnbuffered - Set the stream to be unbuffered. When
134208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// unbuffered, the stream will flush after every write. This routine
135e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// will also flush the buffer immediately when the stream is being
136e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// set to unbuffered.
137906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  void SetUnbuffered() {
138906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    flush();
139906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    SetBufferAndMode(0, 0, Unbuffered);
140906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  }
141e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
142ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  size_t GetNumBytesInBuffer() const {
14389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar    return OutBufCur - OutBufStart;
14489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  }
14589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
14660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
14760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Data Output Interface
14860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
149fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
15060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  void flush() {
15160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur != OutBufStart)
152cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar      flush_nonempty();
15360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
154fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
155f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  raw_ostream &operator<<(char C) {
156f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    if (OutBufCur >= OutBufEnd)
157de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
158f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    *OutBufCur++ = C;
159f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    return *this;
160f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  }
161fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
1621f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(unsigned char C) {
1631f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    if (OutBufCur >= OutBufEnd)
164de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
1651f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    *OutBufCur++ = C;
1661f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    return *this;
1671f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  }
168fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
1691f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(signed char C) {
17060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur >= OutBufEnd)
171de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
17260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    *OutBufCur++ = C;
17360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    return *this;
17460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
175fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
176dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  raw_ostream &operator<<(const StringRef &Str) {
177dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // Inline fast path, particularly for strings with a known length.
178dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    size_t Size = Str.size();
17938f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar
18038f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    // Make sure we can use the fast path.
18138f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    if (OutBufCur+Size > OutBufEnd)
182dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar      return write(Str.data(), Size);
18338f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar
184dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    memcpy(OutBufCur, Str.data(), Size);
18538f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    OutBufCur += Size;
186c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
18760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
188fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
189dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  raw_ostream &operator<<(const char *Str) {
190dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // Inline fast path, particulary for constant strings where a sufficiently
191dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // smart compiler will simplify strlen.
192dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar
193dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    this->operator<<(StringRef(Str));
194dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    return *this;
195dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  }
196dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar
197906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  raw_ostream &operator<<(const std::string &Str) {
198906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    // Avoid the fast path, it would only increase code size for a marginal win.
199906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar
200c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    write(Str.data(), Str.length());
201c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
202cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
203fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
20466b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long N);
20566b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long N);
20666b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long long N);
20766b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long long N);
208944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  raw_ostream &operator<<(const void *P);
20989a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(unsigned int N) {
210c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(static_cast<unsigned long>(N));
211c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
212cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
213fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
21489a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(int N) {
215c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(static_cast<long>(N));
216c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
217cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
218afc802dc7d963a2cb46f1b0c1f1b0faa5e1dca2aEli Friedman
219cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  raw_ostream &operator<<(double N) {
220c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(ftostr(N));
221c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
222cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
223fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
22448018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar  /// write_hex - Output \arg N in hexadecimal, without any prefix or padding.
22548018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar  raw_ostream &write_hex(unsigned long long N);
22648018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar
227de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar  raw_ostream &write(unsigned char C);
228ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  raw_ostream &write(const char *Ptr, size_t Size);
229fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
230b2560526d5f6d2f9cc3698244dbb1f4861dc8efcChris Lattner  // Formatted output, see the format() function in Support/Format.h.
231097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner  raw_ostream &operator<<(const format_object_base &Fmt);
232fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
233e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// Changes the foreground color of text that will be output from this point
234e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// forward.
235e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param colors ANSI color to use, the special SAVEDCOLOR can be used to
236e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// change only the bold attribute, and keep colors untouched
237e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param bold bold/brighter text, default false
238e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param bg if true change the background, default: change foreground
239e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @returns itself so it can be used within << invocations
240e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &changeColor(enum Colors colors, bool bold=false,
241e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin                                   bool  bg=false) { return *this; }
242e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
243e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// Resets the colors to terminal defaults. Call this when you are done
244e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// outputting colored text, or before program exit.
245e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &resetColor() { return *this; }
246e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
24760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
24860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Subclass Interface
24960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
25060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
251cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate:
25289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - The is the piece of the class that is implemented
25389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// by subclasses.  This writes the \args Size bytes starting at
25489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// \arg Ptr to the underlying stream.
25589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  ///
256906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// This function is guaranteed to only be called at a point at which it is
257906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// safe for the subclass to install a new buffer via SetBuffer.
258906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///
259906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// \arg Ptr - The start of the data to be written. For buffered streams this
260906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// is guaranteed to be the start of the buffer.
261906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// \arg Size - The number of bytes to be written.
262906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  ///
26389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// \invariant { Size > 0 }
264ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size) = 0;
265fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
26660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
26760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
268cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar
2698f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
2708f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
2718f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() = 0;
2728f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
273e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohmanprotected:
274906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// SetBuffer - Use the provided buffer as the raw_ostream buffer. This is
275906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// intended for use only by subclasses which can arrange for the output to go
276906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// directly into the desired output buffer, instead of being copied on each
277906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// flush.
278906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  void SetBuffer(char *BufferStart, size_t Size) {
279906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar    SetBufferAndMode(BufferStart, Size, ExternalBuffer);
280906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  }
281906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar
282208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// preferred_buffer_size - Return an efficient buffer size for the
283208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// underlying output mechanism.
284208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  virtual size_t preferred_buffer_size();
285208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
286e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// error_detected - Set the flag indicating that an output error has
287e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// been encountered.
288e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  void error_detected() { Error = true; }
289e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
290ab810275448c34c072c47be1f16ae1d679bfd20cDaniel Dunbar  /// getBufferStart - Return the beginning of the current stream buffer, or 0
291ab810275448c34c072c47be1f16ae1d679bfd20cDaniel Dunbar  /// if the stream is unbuffered.
292ab810275448c34c072c47be1f16ae1d679bfd20cDaniel Dunbar  const char *getBufferStart() const { return OutBufStart; }
293fd29440c07f195d7c059efeb50fe0c5905d88b3bDavid Greene
294cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  //===--------------------------------------------------------------------===//
295cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  // Private Interface
296cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  //===--------------------------------------------------------------------===//
297cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate:
298906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  /// SetBufferAndMode - Install the given buffer and mode.
299906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  void SetBufferAndMode(char *BufferStart, size_t Size, BufferKind Mode);
300906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar
301cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// flush_nonempty - Flush the current buffer, which is known to be
302cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// non-empty. This outputs the currently buffered data and resets
303cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// the buffer to empty.
304cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  void flush_nonempty();
30533e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman
30633e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  /// copy_to_buffer - Copy data into the buffer. Size must not be
30733e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  /// greater than the number of unused bytes in the buffer.
30833e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  void copy_to_buffer(const char *Ptr, size_t Size);
30960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
310fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
311097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
312097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner// File Output Streams
313097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
314fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
31560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_fd_ostream - A raw_ostream that writes to a file descriptor.
31660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner///
31760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_fd_ostream : public raw_ostream {
31860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  int FD;
31960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  bool ShouldClose;
320d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek  uint64_t pos;
32189a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
32289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
323ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
3248f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
3258f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
3268f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
3278f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() { return pos; }
3288f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
329208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// preferred_buffer_size - Determine an efficient buffer size.
330208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  virtual size_t preferred_buffer_size();
331208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
33260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
33348534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// raw_fd_ostream - Open the specified file for writing. If an
33448534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// error occurs, information about the error is put into ErrorInfo,
33548534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// and the stream should be immediately destroyed; the string will
33648534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// be empty if no error occurred.
3370d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  ///
3380d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Filename - The file to open. If this is "-" then the
3390d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// stream will use stdout instead.
3400d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Binary - The file should be opened in binary mode on
3410d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// platforms that support this distinction.
342a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  /// \param Force - Don't consider the case where the file already
343a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  /// exists to be an error.
344a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  raw_fd_ostream(const char *Filename, bool Binary, bool Force,
345a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman                 std::string &ErrorInfo);
346fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
34760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// raw_fd_ostream ctor - FD is the file descriptor that this writes to.  If
348e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// ShouldClose is true, this closes the file when the stream is destroyed.
349e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  raw_fd_ostream(int fd, bool shouldClose,
350e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar                 bool unbuffered=false) : raw_ostream(unbuffered), FD(fd),
351e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar                                          ShouldClose(shouldClose) {}
352e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
35360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  ~raw_fd_ostream();
354fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
35543d1f02b547b146d81abeb0ed0f88628f0fdc7dcTed Kremenek  /// close - Manually flush the stream and close the file.
3565984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  void close();
357fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
3585984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  /// tell - Return the current offset with the file.
35989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  uint64_t tell() { return pos + GetNumBytesInBuffer(); }
360fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
3619c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  /// seek - Flushes the stream and repositions the underlying file descriptor
3629c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  ///  positition to the offset specified from the beginning of the file.
3639c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  uint64_t seek(uint64_t off);
364e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
365e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &changeColor(enum Colors colors, bool bold=false,
366e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin                                   bool bg=false);
367e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &resetColor();
36860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
369fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
37007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stdout_ostream - This is a stream that always prints to stdout.
37107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
37260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stdout_ostream : public raw_fd_ostream {
37360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
37460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
37560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
37660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stdout_ostream();
37760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
37860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
37907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stderr_ostream - This is a stream that always prints to stderr.
38007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
38160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stderr_ostream : public raw_fd_ostream {
38260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
38360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
38460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
38560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stderr_ostream();
38660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
387fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
38807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// outs() - This returns a reference to a raw_ostream for standard output.
38907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: outs() << "foo" << "bar";
39007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs();
39107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
39207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// errs() - This returns a reference to a raw_ostream for standard error.
39307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: errs() << "foo" << "bar";
39407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs();
395fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
39634ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// nulls() - This returns a reference to a raw_ostream which simply discards
39734ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// output.
39834ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarraw_ostream &nulls();
399fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
400097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
40178a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors
402097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
403fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
40407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_os_ostream - A raw_ostream that writes to an std::ostream.  This is a
405e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// simple adaptor class.  It does not check for output errors; clients should
406e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// use the underlying stream to detect errors.
40707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerclass raw_os_ostream : public raw_ostream {
40807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  std::ostream &OS;
40989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
41089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
411ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
4128f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4138f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
4148f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
4158f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos();
4168f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
41707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerpublic:
41835979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar  raw_os_ostream(std::ostream &O) : OS(O) {}
41935979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar  ~raw_os_ostream();
4208f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4218f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
4228f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell();
42307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner};
42478a2812538d871a62d90f53ed66d26198876d011Chris Lattner
42578a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_string_ostream - A raw_ostream that writes to an std::string.  This is a
426e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// simple adaptor class. This class does not encounter output errors.
42778a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream {
42878a2812538d871a62d90f53ed66d26198876d011Chris Lattner  std::string &OS;
42989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
43089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
431ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
4328f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4338f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
4348f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
4358f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() { return OS.size(); }
43678a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
43735979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar  explicit raw_string_ostream(std::string &O) : OS(O) {}
43835979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar  ~raw_string_ostream();
439fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
4408f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
4418f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell() { return OS.size() + GetNumBytesInBuffer(); }
4428f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4433d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  /// str - Flushes the stream contents to the target string and returns
4444ac67ef47ada2160d2a6f2340743b624c6e16424Ted Kremenek  ///  the string's reference.
4453d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  std::string& str() {
4463d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    flush();
4473d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    return OS;
4483d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  }
44978a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
450fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
45178a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_svector_ostream - A raw_ostream that writes to an SmallVector or
452e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// SmallString.  This is a simple adaptor class. This class does not
453e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// encounter output errors.
45478a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_svector_ostream : public raw_ostream {
45578a2812538d871a62d90f53ed66d26198876d011Chris Lattner  SmallVectorImpl<char> &OS;
45689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
45789a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
458ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
4598f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4608f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
4618f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
4628f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos();
46378a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
464906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar  explicit raw_svector_ostream(SmallVectorImpl<char> &O);
46535979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar  ~raw_svector_ostream();
4668f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4678f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
4688f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell();
46978a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
470fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
47134ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// raw_null_ostream - A raw_ostream that discards all output.
47234ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarclass raw_null_ostream : public raw_ostream {
47334ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
47434ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  virtual void write_impl(const char *Ptr, size_t size);
47534ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
47634ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// current_pos - Return the current position within the stream, not
47734ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// counting the bytes currently in the buffer.
47834ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  virtual uint64_t current_pos();
47934ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
48034ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarpublic:
48134ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  explicit raw_null_ostream() {}
482f78c835faa97a6f5c8021923c05f7514a550619fDan Gohman  ~raw_null_ostream();
48334ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar};
48434ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
48560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace
48660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
48760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#endif
488