raw_ostream.h revision 48534b31d8bc5a68ba152fcdb905bf266def5268
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"
18b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cassert>
19b6c8a4098fd23c21d6cda33b09b99b5a0ac1e13fNick Lewycky#include <cstring>
2060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#include <string>
2107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner#include <iosfwd>
2260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
2360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnernamespace llvm {
24097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner  class format_object_base;
2578a2812538d871a62d90f53ed66d26198876d011Chris Lattner  template <typename T>
2678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  class SmallVectorImpl;
27097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner
2860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_ostream - This class implements an extremely fast bulk output stream
2960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// that can *only* output to a stream.  It does not support seeking, reopening,
3060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// rewinding, line buffered disciplines etc. It is a simple buffer that outputs
3160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// a chunk at a time.
3260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_ostream {
3360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerprotected:
3460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  char *OutBufStart, *OutBufEnd, *OutBufCur;
3560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
3660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_ostream() {
3760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    // Start out ready to flush.
3860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufStart = OutBufEnd = OutBufCur = 0;
3960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
405b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes
415b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes  virtual ~raw_ostream() {
425b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes    delete [] OutBufStart;
435b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes  }
4460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
4560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
4660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Configuration Interface
4760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
4860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
4960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// SetBufferSize - Set the internal buffer size to the specified amount
5060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// instead of the default.
5160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  void SetBufferSize(unsigned Size) {
5260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    assert(Size >= 64 &&
5360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner           "Buffer size must be somewhat large for invariants to hold");
5460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    flush();
5560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
5660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    delete [] OutBufStart;
5760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufStart = new char[Size];
5860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufEnd = OutBufStart+Size;
5960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufCur = OutBufStart;
6060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
6160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
6260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
6360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Data Output Interface
6460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
6560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
6660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  void flush() {
6760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur != OutBufStart)
6860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner      flush_impl();
6960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
7060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
71f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  raw_ostream &operator<<(char C) {
72f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    if (OutBufCur >= OutBufEnd)
73f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray      flush_impl();
74f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    *OutBufCur++ = C;
75f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray    return *this;
76f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray  }
77f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray
781f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(unsigned char C) {
791f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    if (OutBufCur >= OutBufEnd)
801f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson      flush_impl();
811f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    *OutBufCur++ = C;
821f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson    return *this;
831f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  }
841f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson
851f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson  raw_ostream &operator<<(signed char C) {
8660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufCur >= OutBufEnd)
8760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner      flush_impl();
8860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    *OutBufCur++ = C;
8960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    return *this;
9060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
9160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
9260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_ostream &operator<<(const char *Str) {
93d497df5cf5d977522814acef72b8b65f1774408eChris Lattner    return write(Str, strlen(Str));
9460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
9560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
96cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  raw_ostream &operator<<(const std::string& Str) {
97cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson    return write(Str.data(), Str.length());
98cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
99cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson
10066b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long N);
10166b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long N);
10266b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(unsigned long long N);
10366b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &operator<<(long long N);
104944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  raw_ostream &operator<<(const void *P);
10589a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(unsigned int N) {
10689a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson    return this->operator<<(static_cast<unsigned long>(N));
107cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
108cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson
10989a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson  raw_ostream &operator<<(int N) {
11089a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson    return this->operator<<(static_cast<long>(N));
111cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
112afc802dc7d963a2cb46f1b0c1f1b0faa5e1dca2aEli Friedman
113cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  raw_ostream &operator<<(double N) {
114cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson    return this->operator<<(ftostr(N));
115cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson  }
116cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson
11766b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson  raw_ostream &write(const char *Ptr, unsigned Size);
11860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
119b2560526d5f6d2f9cc3698244dbb1f4861dc8efcChris Lattner  // Formatted output, see the format() function in Support/Format.h.
120097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner  raw_ostream &operator<<(const format_object_base &Fmt);
121097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner
12260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
12360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // Subclass Interface
12460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  //===--------------------------------------------------------------------===//
12560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
12660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerprotected:
12760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
12860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// flush_impl - The is the piece of the class that is implemented by
12960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
13060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// buffer to empty.
13160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void flush_impl() = 0;
13260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
13360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// HandleFlush - A stream's implementation of flush should call this after
13460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// emitting the bytes to the data sink.
13560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  void HandleFlush() {
13660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    if (OutBufStart == 0)
13760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner      SetBufferSize(4096);
13860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner    OutBufCur = OutBufStart;
13960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  }
14060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerprivate:
14160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
14260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
14360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
14460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
145097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
146097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner// File Output Streams
147097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
148097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner
14960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// raw_fd_ostream - A raw_ostream that writes to a file descriptor.
15060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner///
15160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_fd_ostream : public raw_ostream {
15260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  int FD;
15360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  bool ShouldClose;
15460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
15548534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// raw_fd_ostream - Open the specified file for writing. If an
15648534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// error occurs, information about the error is put into ErrorInfo,
15748534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// and the stream should be immediately destroyed; the string will
15848534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// be empty if no error occurred.
15960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_fd_ostream(const char *Filename, std::string &ErrorInfo);
16060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
16160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// raw_fd_ostream ctor - FD is the file descriptor that this writes to.  If
16260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// ShouldClose is true, this closes the file when
16360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_fd_ostream(int fd, bool shouldClose) : FD(fd), ShouldClose(shouldClose) {}
16460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
16560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  ~raw_fd_ostream();
16660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
16760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// flush_impl - The is the piece of the class that is implemented by
16860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
16960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// buffer to empty.
17060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void flush_impl();
17160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
17260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
17307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stdout_ostream - This is a stream that always prints to stdout.
17407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
17560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stdout_ostream : public raw_fd_ostream {
17660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
17760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
17860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
17960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stdout_ostream();
18060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
18160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
18207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stderr_ostream - This is a stream that always prints to stderr.
18307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
18460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stderr_ostream : public raw_fd_ostream {
18560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
18660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
18760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
18860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stderr_ostream();
18960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
19060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
19107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// outs() - This returns a reference to a raw_ostream for standard output.
19207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: outs() << "foo" << "bar";
19307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs();
19407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
19507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// errs() - This returns a reference to a raw_ostream for standard error.
19607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: errs() << "foo" << "bar";
19707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs();
19807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
19907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
200097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
20178a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors
202097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
203097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner
20407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_os_ostream - A raw_ostream that writes to an std::ostream.  This is a
20507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// simple adaptor class.
20607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerclass raw_os_ostream : public raw_ostream {
20707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  std::ostream &OS;
20807f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerpublic:
20907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  raw_os_ostream(std::ostream &O) : OS(O) {}
210944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  ~raw_os_ostream();
211944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner
21207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
21307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
21407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// buffer to empty.
21507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  virtual void flush_impl();
21607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner};
21778a2812538d871a62d90f53ed66d26198876d011Chris Lattner
21878a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_string_ostream - A raw_ostream that writes to an std::string.  This is a
21978a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// simple adaptor class.
22078a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream {
22178a2812538d871a62d90f53ed66d26198876d011Chris Lattner  std::string &OS;
22278a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
22378a2812538d871a62d90f53ed66d26198876d011Chris Lattner  raw_string_ostream(std::string &O) : OS(O) {}
22478a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_string_ostream();
22578a2812538d871a62d90f53ed66d26198876d011Chris Lattner
2263d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  /// str - Flushes the stream contents to the target string and returns
2274ac67ef47ada2160d2a6f2340743b624c6e16424Ted Kremenek  ///  the string's reference.
2283d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  std::string& str() {
2293d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    flush();
2303d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    return OS;
2313d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  }
2323d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek
23378a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
23478a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
23578a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// buffer to empty.
23678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  virtual void flush_impl();
23778a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
23878a2812538d871a62d90f53ed66d26198876d011Chris Lattner
23978a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_svector_ostream - A raw_ostream that writes to an SmallVector or
24078a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// SmallString.  This is a simple adaptor class.
24178a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_svector_ostream : public raw_ostream {
24278a2812538d871a62d90f53ed66d26198876d011Chris Lattner  SmallVectorImpl<char> &OS;
24378a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
24478a2812538d871a62d90f53ed66d26198876d011Chris Lattner  raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {}
24578a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_svector_ostream();
24678a2812538d871a62d90f53ed66d26198876d011Chris Lattner
24778a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
24878a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
24978a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// buffer to empty.
25078a2812538d871a62d90f53ed66d26198876d011Chris Lattner  virtual void flush_impl();
25178a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
25207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
25360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace
25460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
25560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#endif
256