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