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