add support for a cout/cerr analog (outs()/errs()) as well as

a simple adaptor class to give raw output capabilities to 
something that wants to write to an ostream.

llvm-svn: 54865
This commit is contained in:
Chris Lattner 2008-08-17 04:13:37 +00:00
parent c9c1d50446
commit dab4a64423
2 changed files with 59 additions and 1 deletions

View File

@ -1,4 +1,4 @@
//===--- raw_ostream.h - Raw output stream ---------------------------------===//
//===--- raw_ostream.h - Raw output stream --------------------------------===//
//
// The LLVM Compiler Infrastructure
//
@ -15,6 +15,7 @@
#define LLVM_SUPPORT_RAW_OSTREAM_H
#include <string>
#include <iosfwd>
namespace llvm {
@ -151,6 +152,8 @@ public:
virtual void flush_impl();
};
/// raw_stdout_ostream - This is a stream that always prints to stdout.
///
class raw_stdout_ostream : public raw_fd_ostream {
// An out of line virtual method to provide a home for the class vtable.
virtual void handle();
@ -158,6 +161,8 @@ public:
raw_stdout_ostream();
};
/// raw_stderr_ostream - This is a stream that always prints to stderr.
///
class raw_stderr_ostream : public raw_fd_ostream {
// An out of line virtual method to provide a home for the class vtable.
virtual void handle();
@ -165,6 +170,28 @@ public:
raw_stderr_ostream();
};
/// outs() - This returns a reference to a raw_ostream for standard output.
/// Use it like: outs() << "foo" << "bar";
raw_ostream &outs();
/// errs() - This returns a reference to a raw_ostream for standard error.
/// Use it like: errs() << "foo" << "bar";
raw_ostream &errs();
/// raw_os_ostream - A raw_ostream that writes to an std::ostream. This is a
/// simple adaptor class.
class raw_os_ostream : public raw_ostream {
std::ostream &OS;
public:
raw_os_ostream(std::ostream &O) : OS(O) {}
/// flush_impl - The is the piece of the class that is implemented by
/// subclasses. This outputs the currently buffered data and resets the
/// buffer to empty.
virtual void flush_impl();
};
} // end llvm namespace
#endif

View File

@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Support/raw_ostream.h"
#include <ostream>
using namespace llvm;
#if !defined(_MSC_VER)
@ -62,6 +63,9 @@ void raw_fd_ostream::flush_impl() {
HandleFlush();
}
//===----------------------------------------------------------------------===//
// raw_stdout/err_ostream
//===----------------------------------------------------------------------===//
raw_stdout_ostream::raw_stdout_ostream():raw_fd_ostream(STDOUT_FILENO, false) {}
raw_stderr_ostream::raw_stderr_ostream():raw_fd_ostream(STDERR_FILENO, false) {}
@ -69,3 +73,30 @@ raw_stderr_ostream::raw_stderr_ostream():raw_fd_ostream(STDERR_FILENO, false) {}
// An out of line virtual method to provide a home for the class vtable.
void raw_stdout_ostream::handle() {}
void raw_stderr_ostream::handle() {}
/// outs() - This returns a reference to a raw_ostream for standard output.
/// Use it like: outs() << "foo" << "bar";
raw_ostream &outs() {
static raw_stdout_ostream S;
return S;
}
/// errs() - This returns a reference to a raw_ostream for standard error.
/// Use it like: errs() << "foo" << "bar";
raw_ostream &errs() {
static raw_stderr_ostream S;
return S;
}
//===----------------------------------------------------------------------===//
// raw_os_ostream
//===----------------------------------------------------------------------===//
/// flush_impl - The is the piece of the class that is implemented by
/// subclasses. This outputs the currently buffered data and resets the
/// buffer to empty.
void raw_os_ostream::flush_impl() {
if (OutBufCur-OutBufStart)
OS.write(OutBufStart, OutBufCur-OutBufStart);
HandleFlush();
}