raw_ostream.h revision 208ec0f32eed8874074bddf97cd04f60a772198d
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:
45d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///  1. Unbuffered (Unbuffered == true)
46d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///  1. Uninitialized (Unbuffered == false && OutBufStart == 0).
47d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///  2. Buffered (Unbuffered == false && OutBufStart != 0 &&
48d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar  ///               OutBufEnd - OutBufStart >= 64).
4960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  char *OutBufStart, *OutBufEnd, *OutBufCur;
50e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  bool Unbuffered;
51e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
52e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// Error This flag is true if an error of any kind has been detected.
53e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  ///
54e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  bool Error;
55e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
5660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
57e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  // color order matches ANSI escape sequence, don't change
58e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  enum Colors {
59e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    BLACK=0,
60e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    RED,
61e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    GREEN,
62e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    YELLOW,
63e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    BLUE,
64e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    MAGENTA,
65e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    CYAN,
66e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    WHITE,
67e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin    SAVEDCOLOR
68e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  };
69e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
70e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  explicit raw_ostream(bool unbuffered=false)
71e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman    : Unbuffered(unbuffered), Error(false) {
7260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    // Start out ready to flush.
7360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufStart = OutBufEnd = OutBufCur = 0;
7460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
755b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes
76e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  virtual ~raw_ostream();
77fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
788f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the file.
798f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell() { return current_pos() + GetNumBytesInBuffer(); }
808f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
81e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// has_error - Return the value of the flag in this raw_ostream indicating
82e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// whether an output error has been encountered.
83e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  bool has_error() const {
84e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman    return Error;
85996b9d6aa9864c24178891adf29eeafd3f34d90cDan Gohman  }
86e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
87e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// clear_error - Set the flag read by has_error() to false. If the error
88e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// flag is set at the time when this raw_ostream's destructor is called,
89e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// llvm_report_error is called to report the error. Use clear_error()
90e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// after handling the error to avoid this behavior.
91e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  void clear_error() {
92e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman    Error = false;
93996b9d6aa9864c24178891adf29eeafd3f34d90cDan Gohman  }
94e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
9560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
9660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Configuration Interface
9760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
98fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
99208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// SetBuffered - Set the stream to be buffered, with an automatically
100208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// determined buffer size.
101208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  void SetBuffered();
102fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
103208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// SetBufferrSize - Set the stream to be buffered, using the
104208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// specified buffer size.
105208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  void SetBufferSize(size_t Size);
106208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
107208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  size_t GetBufferSize() {
108208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // If we're supposed to be buffered but haven't actually gotten around
109208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // to allocating the buffer yet, return the value that would be used.
110208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    if (!Unbuffered && !OutBufStart)
111208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman      return preferred_buffer_size();
112208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
113208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman    // Otherwise just return the size of the allocated buffer.
114f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman    return OutBufEnd - OutBufStart;
115f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman  }
116f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman
117208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// SetUnbuffered - Set the stream to be unbuffered. When
118208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// unbuffered, the stream will flush after every write. This routine
119e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// will also flush the buffer immediately when the stream is being
120e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// set to unbuffered.
121524dea4d4ca6ecafa18e1e011934a2129c770f4fDan Gohman  void SetUnbuffered();
122e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
123ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  size_t GetNumBytesInBuffer() const {
12489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar    return OutBufCur - OutBufStart;
12589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  }
12689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
12760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
12860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Data Output Interface
12960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
130fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
13160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  void flush() {
13260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur != OutBufStart)
133cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar      flush_nonempty();
13460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
135fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
136f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  raw_ostream &operator<<(char C) {
137f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    if (OutBufCur >= OutBufEnd)
138de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
139f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    *OutBufCur++ = C;
140f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    return *this;
141f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  }
142fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
1431f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(unsigned char C) {
1441f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    if (OutBufCur >= OutBufEnd)
145de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
1461f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    *OutBufCur++ = C;
1471f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    return *this;
1481f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  }
149fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
1501f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(signed char C) {
15160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur >= OutBufEnd)
152de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar      return write(C);
15360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    *OutBufCur++ = C;
15460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    return *this;
15560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
156fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
157dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  raw_ostream &operator<<(const StringRef &Str) {
158dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // Inline fast path, particularly for strings with a known length.
159dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    size_t Size = Str.size();
16038f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar
16138f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    // Make sure we can use the fast path.
16238f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    if (OutBufCur+Size > OutBufEnd)
163dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar      return write(Str.data(), Size);
16438f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar
165dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    memcpy(OutBufCur, Str.data(), Size);
16638f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar    OutBufCur += Size;
167c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
16860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
169fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
170dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  raw_ostream &operator<<(const char *Str) {
171dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // Inline fast path, particulary for constant strings where a sufficiently
172dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    // smart compiler will simplify strlen.
173dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar
174dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    this->operator<<(StringRef(Str));
175dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar    return *this;
176dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar  }
177dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar
178cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  raw_ostream &operator<<(const std::string& Str) {
179c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    write(Str.data(), Str.length());
180c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
181cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
182fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
18366b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long N);
18466b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long N);
18566b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long long N);
18666b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long long N);
187944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  raw_ostream &operator<<(const void *P);
18889a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(unsigned int N) {
189c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(static_cast<unsigned long>(N));
190c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
191cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
192fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
19389a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(int N) {
194c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(static_cast<long>(N));
195c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
196cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
197afc802dc7d963a2cb46f1b0c1f1b0faa5e1dca2aEli Friedman
198cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  raw_ostream &operator<<(double N) {
199c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    this->operator<<(ftostr(N));
200c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar    return *this;
201cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
202fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
20348018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar  /// write_hex - Output \arg N in hexadecimal, without any prefix or padding.
20448018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar  raw_ostream &write_hex(unsigned long long N);
20548018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar
206de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar  raw_ostream &write(unsigned char C);
207ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  raw_ostream &write(const char *Ptr, size_t Size);
208fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
209b2560526d5f6d2f9cc3698244dbb1f4861dc8efcChris Lattner  // Formatted output, see the format() function in Support/Format.h.
210097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner  raw_ostream &operator<<(const format_object_base &Fmt);
211fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
212e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// Changes the foreground color of text that will be output from this point
213e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// forward.
214e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param colors ANSI color to use, the special SAVEDCOLOR can be used to
215e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// change only the bold attribute, and keep colors untouched
216e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param bold bold/brighter text, default false
217e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @param bg if true change the background, default: change foreground
218e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// @returns itself so it can be used within << invocations
219e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &changeColor(enum Colors colors, bool bold=false,
220e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin                                   bool  bg=false) { return *this; }
221e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
222e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// Resets the colors to terminal defaults. Call this when you are done
223e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  /// outputting colored text, or before program exit.
224e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &resetColor() { return *this; }
225e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
22660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
22760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Subclass Interface
22860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
22960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
230cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate:
23189a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - The is the piece of the class that is implemented
23289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// by subclasses.  This writes the \args Size bytes starting at
23389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// \arg Ptr to the underlying stream.
23489a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  ///
23589a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// \invariant { Size > 0 }
236ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size) = 0;
237fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
23860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
23960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
240cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar
2418f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
2428f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
2438f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() = 0;
2448f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
245e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohmanprotected:
246208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// preferred_buffer_size - Return an efficient buffer size for the
247208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// underlying output mechanism.
248208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  virtual size_t preferred_buffer_size();
249208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
250e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// error_detected - Set the flag indicating that an output error has
251e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  /// been encountered.
252e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman  void error_detected() { Error = true; }
253e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman
254fd29440c07f195d7c059efeb50fe0c5905d88b3bDavid Greene  typedef char * iterator;
255a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  iterator begin() { return OutBufStart; }
256a9ad04191cb56c42944b17980b8b2bb2afe11ab2Dan Gohman  iterator end() { return OutBufCur; }
257fd29440c07f195d7c059efeb50fe0c5905d88b3bDavid Greene
258cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  //===--------------------------------------------------------------------===//
259cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  // Private Interface
260cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  //===--------------------------------------------------------------------===//
261cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate:
262cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// flush_nonempty - Flush the current buffer, which is known to be
263cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// non-empty. This outputs the currently buffered data and resets
264cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  /// the buffer to empty.
265cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar  void flush_nonempty();
26633e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman
26733e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  /// copy_to_buffer - Copy data into the buffer. Size must not be
26833e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  /// greater than the number of unused bytes in the buffer.
26933e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman  void copy_to_buffer(const char *Ptr, size_t Size);
27060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
271fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
272097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
273097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner// File Output Streams
274097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
275fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
27660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_fd_ostream - A raw_ostream that writes to a file descriptor.
27760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner///
27860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_fd_ostream : public raw_ostream {
27960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  int FD;
28060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  bool ShouldClose;
281d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek  uint64_t pos;
28289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
28389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
284ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
2858f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
2868f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
2878f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
2888f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() { return pos; }
2898f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
290208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  /// preferred_buffer_size - Determine an efficient buffer size.
291208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman  virtual size_t preferred_buffer_size();
292208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman
29360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
29448534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// raw_fd_ostream - Open the specified file for writing. If an
29548534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// error occurs, information about the error is put into ErrorInfo,
29648534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// and the stream should be immediately destroyed; the string will
29748534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// be empty if no error occurred.
2980d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  ///
2990d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Filename - The file to open. If this is "-" then the
3000d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// stream will use stdout instead.
3010d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Binary - The file should be opened in binary mode on
3020d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// platforms that support this distinction.
303a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  /// \param Force - Don't consider the case where the file already
304a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  /// exists to be an error.
305a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman  raw_fd_ostream(const char *Filename, bool Binary, bool Force,
306a1bdcedc3879510a874d24c450e07feb170d9cd6Dan Gohman                 std::string &ErrorInfo);
307fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
30860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// raw_fd_ostream ctor - FD is the file descriptor that this writes to.  If
309e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  /// ShouldClose is true, this closes the file when the stream is destroyed.
310e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar  raw_fd_ostream(int fd, bool shouldClose,
311e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar                 bool unbuffered=false) : raw_ostream(unbuffered), FD(fd),
312e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar                                          ShouldClose(shouldClose) {}
313e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar
31460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  ~raw_fd_ostream();
315fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
31643d1f02b547b146d81abeb0ed0f88628f0fdc7dcTed Kremenek  /// close - Manually flush the stream and close the file.
3175984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  void close();
318fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
3195984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  /// tell - Return the current offset with the file.
32089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  uint64_t tell() { return pos + GetNumBytesInBuffer(); }
321fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
3229c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  /// seek - Flushes the stream and repositions the underlying file descriptor
3239c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  ///  positition to the offset specified from the beginning of the file.
3249c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  uint64_t seek(uint64_t off);
325e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin
326e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &changeColor(enum Colors colors, bool bold=false,
327e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin                                   bool bg=false);
328e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin  virtual raw_ostream &resetColor();
32960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
330fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
33107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stdout_ostream - This is a stream that always prints to stdout.
33207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
33360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stdout_ostream : public raw_fd_ostream {
33460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
33560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
33660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
33760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stdout_ostream();
33860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
33960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
34007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stderr_ostream - This is a stream that always prints to stderr.
34107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
34260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stderr_ostream : public raw_fd_ostream {
34360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
34460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
34560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
34660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stderr_ostream();
34760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
348fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
34907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// outs() - This returns a reference to a raw_ostream for standard output.
35007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: outs() << "foo" << "bar";
35107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs();
35207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
35307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// errs() - This returns a reference to a raw_ostream for standard error.
35407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: errs() << "foo" << "bar";
35507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs();
356fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
35734ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// nulls() - This returns a reference to a raw_ostream which simply discards
35834ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// output.
35934ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarraw_ostream &nulls();
360fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
361097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
36278a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors
363097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
364fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
36507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_os_ostream - A raw_ostream that writes to an std::ostream.  This is a
366e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// simple adaptor class.  It does not check for output errors; clients should
367e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// use the underlying stream to detect errors.
36807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerclass raw_os_ostream : public raw_ostream {
36907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  std::ostream &OS;
37089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
37189a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
372ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
3738f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
3748f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
3758f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
3768f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos();
3778f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
37807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerpublic:
37907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  raw_os_ostream(std::ostream &O) : OS(O) {}
380944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  ~raw_os_ostream();
3818f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
3828f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
3838f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell();
38407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner};
38578a2812538d871a62d90f53ed66d26198876d011Chris Lattner
38678a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_string_ostream - A raw_ostream that writes to an std::string.  This is a
387e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// simple adaptor class. This class does not encounter output errors.
38878a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream {
38978a2812538d871a62d90f53ed66d26198876d011Chris Lattner  std::string &OS;
39089a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
39189a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
392ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
3938f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
3948f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
3958f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
3968f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos() { return OS.size(); }
39778a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
3982a993f2cc44dc1113d67df03562866eb65337ff1Dan Gohman  explicit raw_string_ostream(std::string &O) : OS(O) {}
39978a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_string_ostream();
400fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
4018f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
4028f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell() { return OS.size() + GetNumBytesInBuffer(); }
4038f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4043d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  /// str - Flushes the stream contents to the target string and returns
4054ac67ef47ada2160d2a6f2340743b624c6e16424Ted Kremenek  ///  the string's reference.
4063d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  std::string& str() {
4073d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    flush();
4083d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    return OS;
4093d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  }
41078a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
411fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
41278a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_svector_ostream - A raw_ostream that writes to an SmallVector or
413e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// SmallString.  This is a simple adaptor class. This class does not
414e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman/// encounter output errors.
41578a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_svector_ostream : public raw_ostream {
41678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  SmallVectorImpl<char> &OS;
41789a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar
41889a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
419ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman  virtual void write_impl(const char *Ptr, size_t Size);
4208f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4218f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// current_pos - Return the current position within the stream, not
4228f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// counting the bytes currently in the buffer.
4238f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  virtual uint64_t current_pos();
42478a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
4252a993f2cc44dc1113d67df03562866eb65337ff1Dan Gohman  explicit raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {}
42678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_svector_ostream();
4278f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor
4288f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  /// tell - Return the current offset with the stream.
4298f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor  uint64_t tell();
43078a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
431fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
43234ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar/// raw_null_ostream - A raw_ostream that discards all output.
43334ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarclass raw_null_ostream : public raw_ostream {
43434ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// write_impl - See raw_ostream::write_impl.
43534ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  virtual void write_impl(const char *Ptr, size_t size);
43634ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
43734ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// current_pos - Return the current position within the stream, not
43834ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  /// counting the bytes currently in the buffer.
43934ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  virtual uint64_t current_pos();
44034ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
44134ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarpublic:
44234ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar  explicit raw_null_ostream() {}
443f78c835faa97a6f5c8021923c05f7514a550619fDan Gohman  ~raw_null_ostream();
44434ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar};
44534ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar
44660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace
44760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
44860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#endif
449