From d44ece9babc5d70e1194a29a54b72dae1fe70ceb Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Thu, 22 Sep 2016 09:48:01 -0600 Subject: Included the experimental TeeStream. This allows you to write data to multiple streams simultaneously and easily. It's pretty much complete, but it feels like it could use more...features somehow. --- src/unstable/teestream.cpp | 117 +++++++++++++++++++++++++++++++++++++++++++++ src/unstable/teestream.h | 65 +++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 src/unstable/teestream.cpp create mode 100644 src/unstable/teestream.h diff --git a/src/unstable/teestream.cpp b/src/unstable/teestream.cpp new file mode 100644 index 0000000..52802ef --- /dev/null +++ b/src/unstable/teestream.cpp @@ -0,0 +1,117 @@ +/* + Bu::TeeStream::* Copyright (C) 2007-2014 Xagasoft, All rights reserved. + Bu::TeeStream::* + Bu::TeeStream::* This file is part of the libbu++ library and is released under the + Bu::TeeStream::* terms of the license contained in the file LICENSE. + Bu::TeeStream::*/ + +#include "bu/teestream.h" + +Bu::TeeStream::TeeStream() +{ +} + +Bu::TeeStream::~TeeStream() +{ +} + +void Bu::TeeStream::addStream( Bu::Stream &rStream ) +{ + lStream.append( StreamWrapper( rStream ) ); +} + +#define delegate \ + for( StreamRefList::iterator i = lStream.begin(); i; i++ ) \ + (*i).rStream + +void Bu::TeeStream::close() +{ + delegate.close(); +} + +Bu::size Bu::TeeStream::tell() +{ + return 0; +} + +void Bu::TeeStream::seek( Bu::size ) +{ +} + +void Bu::TeeStream::setPos( Bu::size ) +{ +} + +void Bu::TeeStream::setPosEnd( Bu::size ) +{ +} + +bool Bu::TeeStream::isEos() +{ + return false; +} + +bool Bu::TeeStream::isOpen() +{ + return true; +} + +void Bu::TeeStream::flush() +{ + delegate.flush(); +} + +bool Bu::TeeStream::canRead() +{ + return false; +} + +bool Bu::TeeStream::canWrite() +{ + return true; +} + +bool Bu::TeeStream::isReadable() +{ + return false; +} + +bool Bu::TeeStream::isWritable() +{ + return true; +} + +bool Bu::TeeStream::isSeekable() +{ + return false; +} + +bool Bu::TeeStream::isBlocking() +{ + return true; +} + +void Bu::TeeStream::setBlocking( bool bBlocking ) +{ + delegate.setBlocking( bBlocking ); +} + +void Bu::TeeStream::setSize( Bu::size ) +{ +} + +Bu::size Bu::TeeStream::getSize() const +{ + return 0; +} + +Bu::size Bu::TeeStream::getBlockSize() const +{ + return 0; +} + +Bu::String Bu::TeeStream::getLocation() const +{ + return "Invalid"; +} + diff --git a/src/unstable/teestream.h b/src/unstable/teestream.h new file mode 100644 index 0000000..f7287f1 --- /dev/null +++ b/src/unstable/teestream.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2014 Xagasoft, All rights reserved. + * + * This file is part of the libbu++ library and is released under the + * terms of the license contained in the file LICENSE. + */ + +#ifndef BU_TEE_STREAM_H +#define BU_TEE_STREAM_H + +#include "bu/filter.h" + +namespace Bu +{ + class TeeStream : public Bu::Stream + { + public: + TeeStream(); + virtual ~TeeStream(); + + void addStream( Bu::Stream &rStream ); + + virtual void close(); + virtual Bu::size tell(); + virtual void seek( Bu::size offset ); + virtual void setPos( Bu::size pos ); + virtual void setPosEnd( Bu::size pos ); + virtual bool isEos(); + virtual bool isOpen(); + + virtual void flush(); + + virtual bool canRead(); + virtual bool canWrite(); + + virtual bool isReadable(); + virtual bool isWritable(); + virtual bool isSeekable(); + + virtual bool isBlocking(); + virtual void setBlocking( bool bBlocking=true ); + + /** + * Most filters won't re-implement this, it doesn't make a lot of sense + * for filters, in general. + */ + virtual void setSize( Bu::size iSize ); + + virtual size getSize() const; + virtual size getBlockSize() const; + virtual Bu::String getLocation() const; + + private: + class StreamWrapper + { + public: + StreamWrapper( Bu::Stream &r ) : rStream( r ) { } + Bu::Stream &rStream; + }; + typedef Bu::List StreamRefList; + StreamRefList lStream; + }; +} + +#endif -- cgit v1.2.3