// https://forums.devx.com/showthread.php?175218-streambuf // Created by vijayan on 11/25/10. // #ifndef TEEBUFF_H_ #define TEEBUFF_H_ #include template > struct basic_teebuf : public std::basic_streambuf { typedef std::basic_streambuf streambuf_type; typedef typename TRAITS_TYPE::int_type int_type; basic_teebuf(streambuf_type *buff_a, streambuf_type *buff_b) : first(buff_a), second(buff_b) {} protected: virtual int_type overflow(int_type c) { const int_type eof = TRAITS_TYPE::eof(); if (TRAITS_TYPE::eq_int_type(c, eof)) return TRAITS_TYPE::not_eof(c); else { const CHAR_TYPE ch = TRAITS_TYPE::to_char_type(c); if (TRAITS_TYPE::eq_int_type(first->sputc(ch), eof) || TRAITS_TYPE::eq_int_type(second->sputc(ch), eof)) return eof; else return c; } } virtual int sync() { return !first->pubsync() && !second->pubsync() ? 0 : -1; } private: streambuf_type *first; streambuf_type *second; }; template > struct basic_teestream : public std::basic_ostream { typedef std::basic_ostream stream_type; typedef basic_teebuf streambuff_type; basic_teestream(stream_type &first, stream_type &second) : stream_type(&stmbuf), stmbuf(first.rdbuf(), second.rdbuf()) {} ~basic_teestream() { stmbuf.pubsync(); } private: streambuff_type stmbuf; }; typedef basic_teebuf teebuf; typedef basic_teestream teestream; #endif // TEEBUFF_H_