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