tee.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef CXXTOOLS_TEE_H
30 #define CXXTOOLS_TEE_H
31 
32 #include <iostream>
33 
34 namespace cxxtools
35 {
36 
37 class Teestreambuf : public std::streambuf
38 {
39  public:
40  Teestreambuf(std::streambuf* buf1 = 0, std::streambuf* buf2 = 0)
41  : streambuf1(buf1),
42  streambuf2(buf2)
43  { setp(0, 0); }
44 
45  void tie(std::streambuf* buf1, std::streambuf* buf2 = 0)
46  {
47  streambuf1 = buf1;
48  streambuf2 = buf2;
49  }
50 
51  private:
52  std::streambuf::int_type overflow(std::streambuf::int_type ch);
53  std::streambuf::int_type underflow();
54  int sync();
55 
56  std::streambuf* streambuf1;
57  std::streambuf* streambuf2;
58 };
59 
61 
62 class Tee : public std::ostream
63 {
64  typedef std::ostream base_class;
65  Teestreambuf streambuf;
66 
67  public:
68  Tee()
69  : std::ostream(0),
70  streambuf(std::cout.rdbuf())
71  {
72  init(&streambuf);
73  }
74  Tee(std::ostream& s1, std::ostream& s2)
75  : std::ostream(0),
76  streambuf(s1.rdbuf(), s2.rdbuf())
77  {
78  init(&streambuf);
79  }
80  Tee(std::ostream& s)
81  : std::ostream(0),
82  streambuf(s.rdbuf(), std::cout.rdbuf())
83  {
84  init(&streambuf);
85  }
86 
87  void assign(std::ostream& s1, std::ostream& s2);
88  void assign(std::ostream& s)
89  { assign(s, std::cout); }
90  void assign_single(std::ostream& s);
91 };
92 
93 }
94 
95 #endif // CXXTOOLS_TEE_H