aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Support/Streams.h
blob: 445ab98c476d7711a325eb10851944a80d2f59d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//===- llvm/Support/Streams.h - Wrappers for iostreams ----------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements a wrapper for the STL I/O streams.  It prevents the need
// to include <iostream> in a file just to get I/O.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_SUPPORT_STREAMS_H
#define LLVM_SUPPORT_STREAMS_H

#include <iosfwd>

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
  /// @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;
  public:
    BaseStream() : Stream(0) {}
    BaseStream(StreamTy &S) : Stream(&S) {}
    BaseStream(StreamTy *S) : Stream(S) {}

    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;
      return *this;
    }

    template <typename Ty>
    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; }
    bool operator != (const BaseStream &S) { return !(*this == S); }
  };

  typedef BaseStream<std::ostream> OStream;
  typedef BaseStream<std::istream> IStream;
  typedef BaseStream<std::stringstream> StringStream;

  extern OStream cout;
  extern OStream cerr;
  extern IStream cin;

} // End llvm namespace

#endif