restrict dyn_cast_or_null to pointer types, just like cast_or_null; re-commit of...
[oota-llvm.git] / include / llvm / Support / raw_ostream.h
index 3f576df8197504daf99028da68977bd20d316fee..39bdbd804c276382f7ca1760431a242e3b1234b7 100644 (file)
@@ -215,7 +215,7 @@ public:
   /// @param bold bold/brighter text, default false
   /// @param bg if true change the background, default: change foreground
   /// @returns itself so it can be used within << invocations
-  virtual raw_ostream &changeColor(enum Colors, bool = false, bool = false) { 
+  virtual raw_ostream &changeColor(enum Colors, bool = false, bool = false) {
     return *this; }
 
   /// Resets the colors to terminal defaults. Call this when you are done
@@ -382,29 +382,16 @@ public:
   /// flag is set at the time when this raw_ostream's destructor is called,
   /// report_fatal_error is called to report the error. Use clear_error()
   /// after handling the error to avoid this behavior.
+  ///
+  ///   "Errors should never pass silently.
+  ///    Unless explicitly silenced."
+  ///      - from The Zen of Python, by Tim Peters
+  ///
   void clear_error() {
     Error = false;
   }
 };
 
-/// 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();
-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();
-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();
@@ -468,7 +455,7 @@ public:
   /// outside of the raw_svector_ostream's control.  It is only safe to do this
   /// if the raw_svector_ostream has previously been flushed.
   void resync();
-  
+
   /// str - Flushes the stream contents to the target vector and return a
   /// StringRef for the vector contents.
   StringRef str();
@@ -488,23 +475,43 @@ public:
   ~raw_null_ostream();
 };
 
-/// tool_output_file - This class behaves like a raw_fd_ostream but adds a
+/// tool_output_file - This class contains a raw_fd_ostream and adds a
 /// few extra features commonly needed for compiler-like tool output files:
 ///   - The file is automatically deleted if the process is killed.
 ///   - The file is automatically deleted when the tool_output_file
 ///     object is destroyed unless the client calls keep().
-class tool_output_file : public raw_fd_ostream {
-  std::string Filename;
-  bool Keep;
+class tool_output_file {
+  /// Installer - This class is declared before the raw_fd_ostream so that
+  /// it is constructed before the raw_fd_ostream is constructed and
+  /// destructed after the raw_fd_ostream is destructed. It installs
+  /// cleanups in its constructor and uninstalls them in its destructor.
+  class CleanupInstaller {
+    /// Filename - The name of the file.
+    std::string Filename;
+  public:
+    /// Keep - The flag which indicates whether we should not delete the file.
+    bool Keep;
+
+    explicit CleanupInstaller(const char *filename);
+    ~CleanupInstaller();
+  } Installer;
+
+  /// OS - The contained stream. This is intentionally declared after
+  /// Installer.
+  raw_fd_ostream OS;
+
 public:
+  /// tool_output_file - This constructor's arguments are passed to
+  /// to raw_fd_ostream's constructor.
   tool_output_file(const char *filename, std::string &ErrorInfo,
                    unsigned Flags = 0);
 
-  ~tool_output_file();
+  /// os - Return the contained raw_fd_ostream.
+  raw_fd_ostream &os() { return OS; }
 
   /// keep - Indicate that the tool's job wrt this output file has been
   /// successful and the file should not be deleted.
-  void keep() { Keep = true; }
+  void keep() { Installer.Keep = true; }
 };
 
 } // end llvm namespace