improve the APIs for creating struct and function types with no arguments/elements
[oota-llvm.git] / include / llvm / Support / Streams.h
index 82ffeeb41bf8bd3f7ea5ddb7de749a926531d834..445ab98c476d7711a325eb10851944a80d2f59d1 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by Bill Wendling and is distributed under the
-// University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
 
 namespace llvm {
 
+  /// FlushStream - Function called by BaseStream to flush an ostream.
+  void FlushStream(std::ostream &S);
+
   /// BaseStream - Acts like the STL streams. It's a wrapper for the std::cerr,
   /// std::cout, std::cin, etc. streams. However, it doesn't require #including
-  /// <iostream> in every file (doing so increases static c'tors & d'tors in the
-  /// object code).
-  /// 
+  /// @verbatim <iostream> @endverbatm in every file (doing so increases static
+  /// c'tors & d'tors in the object code).
+  ///
   template <typename StreamTy>
   class BaseStream {
     StreamTy *Stream;
@@ -34,11 +37,21 @@ namespace llvm {
 
     StreamTy *stream() const { return Stream; }
 
+    inline BaseStream &operator << (std::ios_base &(*Func)(std::ios_base&)) {
+      if (Stream) *Stream << Func;
+      return *this;
+    }
+
     inline BaseStream &operator << (StreamTy &(*Func)(StreamTy&)) {
       if (Stream) *Stream << Func;
       return *this;
     }
 
+    void flush() {
+      if (Stream)
+        FlushStream(*Stream);
+    }
+
     template <typename Ty>
     BaseStream &operator << (const Ty &Thing) {
       if (Stream) *Stream << Thing;
@@ -46,11 +59,19 @@ namespace llvm {
     }
 
     template <typename Ty>
-    BaseStream &operator >> (const Ty &Thing) {
+    BaseStream &operator >> (Ty &Thing) {
       if (Stream) *Stream >> Thing;
       return *this;
     }
 
+    template <typename Ty>
+    BaseStream &write(const Ty &A, unsigned N) {
+      if (Stream) Stream->write(A, N);
+      return *this;
+    }
+
+    operator StreamTy* () { return Stream; }
+
     bool operator == (const StreamTy &S) { return &S == Stream; }
     bool operator != (const StreamTy &S) { return !(*this == S); }
     bool operator == (const BaseStream &S) { return S.Stream == Stream; }
@@ -61,7 +82,6 @@ namespace llvm {
   typedef BaseStream<std::istream> IStream;
   typedef BaseStream<std::stringstream> StringStream;
 
-  extern OStream NullStream;
   extern OStream cout;
   extern OStream cerr;
   extern IStream cin;