00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef PALUDIS_GUARD_PALUDIS_UTIL_TAIL_OUTPUT_STREAM_HH
00021 #define PALUDIS_GUARD_PALUDIS_UTIL_TAIL_OUTPUT_STREAM_HH 1
00022
00023 #include <paludis/util/tail_output_stream-fwd.hh>
00024 #include <paludis/util/attributes.hh>
00025 #include <paludis/util/private_implementation_pattern.hh>
00026 #include <paludis/util/sequence.hh>
00027 #include <tr1/memory>
00028 #include <ostream>
00029
00030 namespace paludis
00031 {
00032 class PALUDIS_VISIBLE TailOutputStreamBuf :
00033 public std::streambuf,
00034 private PrivateImplementationPattern<TailOutputStreamBuf>
00035 {
00036 private:
00037 void _append(const std::string &);
00038
00039 protected:
00040 virtual int_type
00041 overflow(int_type c);
00042
00043 virtual std::streamsize
00044 xsputn(const char * s, std::streamsize num);
00045
00046 public:
00047 TailOutputStreamBuf(const unsigned n);
00048 ~TailOutputStreamBuf();
00049
00050 const std::tr1::shared_ptr<const Sequence<std::string> > tail(const bool clear);
00051 };
00052
00053 class PALUDIS_VISIBLE TailOutputStreamBase
00054 {
00055 protected:
00056 TailOutputStreamBuf buf;
00057
00058 public:
00059 TailOutputStreamBase(const unsigned n) :
00060 buf(n)
00061 {
00062 }
00063 };
00064
00065 class PALUDIS_VISIBLE TailOutputStream :
00066 protected TailOutputStreamBase,
00067 public std::ostream
00068 {
00069 public:
00070
00071
00072
00073 TailOutputStream(const unsigned n) :
00074 TailOutputStreamBase(n),
00075 std::ostream(&buf)
00076 {
00077 }
00078
00079 const std::tr1::shared_ptr<const Sequence<std::string> > tail(const bool clear_after)
00080 {
00081 return buf.tail(clear_after);
00082 }
00083
00084
00085 };
00086
00087 #ifdef PALUDIS_HAVE_EXTERN_TEMPLATE
00088 extern template class PrivateImplementationPattern<TailOutputStreamBuf>;
00089 #endif
00090 }
00091
00092 #endif