raw_ostream.h revision 9c27886dd5d504f2b03c6fcb57aba23e5e44c4fa
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;
154d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek  uint64_t pos;
15560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
15648534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// raw_fd_ostream - Open the specified file for writing. If an
15748534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// error occurs, information about the error is put into ErrorInfo,
15848534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// and the stream should be immediately destroyed; the string will
15948534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar  /// be empty if no error occurred.
1600d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  ///
1610d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Filename - The file to open. If this is "-" then the
1620d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// stream will use stdout instead.
1630d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// \param Binary - The file should be opened in binary mode on
1640d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  /// platforms that support this distinction.
1650d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar  raw_fd_ostream(const char *Filename, bool Binary, std::string &ErrorInfo);
16660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
16760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// raw_fd_ostream ctor - FD is the file descriptor that this writes to.  If
16860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// ShouldClose is true, this closes the file when
16960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_fd_ostream(int fd, bool shouldClose) : FD(fd), ShouldClose(shouldClose) {}
17060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
17160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  ~raw_fd_ostream();
17260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
17360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// flush_impl - The is the piece of the class that is implemented by
17460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
17560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  /// buffer to empty.
17660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void flush_impl();
17743d1f02b547b146d81abeb0ed0f88628f0fdc7dcTed Kremenek
17843d1f02b547b146d81abeb0ed0f88628f0fdc7dcTed Kremenek  /// close - Manually flush the stream and close the file.
1795984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  void close();
1805984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek
1815984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek  /// tell - Return the current offset with the file.
182d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek  uint64_t tell() {
183d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek    return pos + (OutBufCur - OutBufStart);
1849c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  }
1859c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek
1869c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  /// seek - Flushes the stream and repositions the underlying file descriptor
1879c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  ///  positition to the offset specified from the beginning of the file.
1889c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek  uint64_t seek(uint64_t off);
18960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
19060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
19107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stdout_ostream - This is a stream that always prints to stdout.
19207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
19360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stdout_ostream : public raw_fd_ostream {
19460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
19560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
19660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
19760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stdout_ostream();
19860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
19960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
20007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_stderr_ostream - This is a stream that always prints to stderr.
20107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner///
20260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_stderr_ostream : public raw_fd_ostream {
20360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  // An out of line virtual method to provide a home for the class vtable.
20460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  virtual void handle();
20560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic:
20660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner  raw_stderr_ostream();
20760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner};
20860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
20907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// outs() - This returns a reference to a raw_ostream for standard output.
21007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: outs() << "foo" << "bar";
21107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs();
21207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
21307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// errs() - This returns a reference to a raw_ostream for standard error.
21407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// Use it like: errs() << "foo" << "bar";
21507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs();
21607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
21707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
218097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
21978a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors
220097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===//
221097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner
22207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// raw_os_ostream - A raw_ostream that writes to an std::ostream.  This is a
22307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner/// simple adaptor class.
22407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerclass raw_os_ostream : public raw_ostream {
22507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  std::ostream &OS;
22607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerpublic:
22707f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  raw_os_ostream(std::ostream &O) : OS(O) {}
228944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner  ~raw_os_ostream();
229944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner
23007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
23107f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
23207f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  /// buffer to empty.
23307f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner  virtual void flush_impl();
23407f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner};
23578a2812538d871a62d90f53ed66d26198876d011Chris Lattner
23678a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_string_ostream - A raw_ostream that writes to an std::string.  This is a
23778a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// simple adaptor class.
23878a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream {
23978a2812538d871a62d90f53ed66d26198876d011Chris Lattner  std::string &OS;
24078a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
24178a2812538d871a62d90f53ed66d26198876d011Chris Lattner  raw_string_ostream(std::string &O) : OS(O) {}
24278a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_string_ostream();
24378a2812538d871a62d90f53ed66d26198876d011Chris Lattner
2443d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  /// str - Flushes the stream contents to the target string and returns
2454ac67ef47ada2160d2a6f2340743b624c6e16424Ted Kremenek  ///  the string's reference.
2463d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  std::string& str() {
2473d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    flush();
2483d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek    return OS;
2493d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek  }
2503d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek
25178a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
25278a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
25378a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// buffer to empty.
25478a2812538d871a62d90f53ed66d26198876d011Chris Lattner  virtual void flush_impl();
25578a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
25678a2812538d871a62d90f53ed66d26198876d011Chris Lattner
25778a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// raw_svector_ostream - A raw_ostream that writes to an SmallVector or
25878a2812538d871a62d90f53ed66d26198876d011Chris Lattner/// SmallString.  This is a simple adaptor class.
25978a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_svector_ostream : public raw_ostream {
26078a2812538d871a62d90f53ed66d26198876d011Chris Lattner  SmallVectorImpl<char> &OS;
26178a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic:
26278a2812538d871a62d90f53ed66d26198876d011Chris Lattner  raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {}
26378a2812538d871a62d90f53ed66d26198876d011Chris Lattner  ~raw_svector_ostream();
26478a2812538d871a62d90f53ed66d26198876d011Chris Lattner
26578a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// flush_impl - The is the piece of the class that is implemented by
26678a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// subclasses.  This outputs the currently buffered data and resets the
26778a2812538d871a62d90f53ed66d26198876d011Chris Lattner  /// buffer to empty.
26878a2812538d871a62d90f53ed66d26198876d011Chris Lattner  virtual void flush_impl();
26978a2812538d871a62d90f53ed66d26198876d011Chris Lattner};
27007f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner
27160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace
27260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner
27360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#endif
274