mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-17 03:03:23 +02:00
FIFOBuferStream and tests (Windows/VS2010 only compiled/tested)
This commit is contained in:
@@ -324,6 +324,7 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release_static_mt|Win32'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release_static_mt|Win32'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="src\Exception.cpp" />
|
<ClCompile Include="src\Exception.cpp" />
|
||||||
|
<ClCompile Include="src\FIFOBufferStream.cpp" />
|
||||||
<ClCompile Include="src\Format.cpp" />
|
<ClCompile Include="src\Format.cpp" />
|
||||||
<ClCompile Include="src\FPEnvironment.cpp" />
|
<ClCompile Include="src\FPEnvironment.cpp" />
|
||||||
<ClCompile Include="src\FPEnvironment_C99.cpp">
|
<ClCompile Include="src\FPEnvironment_C99.cpp">
|
||||||
@@ -989,6 +990,7 @@
|
|||||||
<ClInclude Include="include\Poco\Environment_WIN32U.h" />
|
<ClInclude Include="include\Poco\Environment_WIN32U.h" />
|
||||||
<ClInclude Include="include\Poco\Exception.h" />
|
<ClInclude Include="include\Poco\Exception.h" />
|
||||||
<ClInclude Include="include\Poco\FIFOBuffer.h" />
|
<ClInclude Include="include\Poco\FIFOBuffer.h" />
|
||||||
|
<ClInclude Include="include\Poco\FIFOBufferStream.h" />
|
||||||
<ClInclude Include="include\Poco\Format.h" />
|
<ClInclude Include="include\Poco\Format.h" />
|
||||||
<ClInclude Include="include\Poco\Foundation.h" />
|
<ClInclude Include="include\Poco\Foundation.h" />
|
||||||
<ClInclude Include="include\Poco\FPEnvironment.h" />
|
<ClInclude Include="include\Poco\FPEnvironment.h" />
|
||||||
|
@@ -876,6 +876,9 @@
|
|||||||
<ClCompile Include="src\Windows1251Encoding.cpp">
|
<ClCompile Include="src\Windows1251Encoding.cpp">
|
||||||
<Filter>Text\Source Files</Filter>
|
<Filter>Text\Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\FIFOBufferStream.cpp">
|
||||||
|
<Filter>Streams\Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="include\Poco\Any.h">
|
<ClInclude Include="include\Poco\Any.h">
|
||||||
@@ -1802,6 +1805,9 @@
|
|||||||
<ClInclude Include="include\Poco\FIFOBuffer.h">
|
<ClInclude Include="include\Poco\FIFOBuffer.h">
|
||||||
<Filter>Core\Header Files</Filter>
|
<Filter>Core\Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="include\Poco\FIFOBufferStream.h">
|
||||||
|
<Filter>Streams\Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="src\pocomsg.rc">
|
<ResourceCompile Include="src\pocomsg.rc">
|
||||||
|
@@ -61,16 +61,46 @@ public:
|
|||||||
Buffer(std::size_t capacity):
|
Buffer(std::size_t capacity):
|
||||||
_capacity(capacity),
|
_capacity(capacity),
|
||||||
_used(capacity),
|
_used(capacity),
|
||||||
_ptr(new T[capacity])
|
_ptr(new T[capacity]),
|
||||||
|
_ownMem(true)
|
||||||
/// Creates and allocates the Buffer.
|
/// Creates and allocates the Buffer.
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
explicit Buffer(T* pMem, std::size_t length):
|
||||||
|
_capacity(length),
|
||||||
|
_used(length),
|
||||||
|
_ptr(pMem),
|
||||||
|
_ownMem(false)
|
||||||
|
/// Creates the Buffer. Length argument specifies the length
|
||||||
|
/// of the supplied memory pointed to by pMem in the number
|
||||||
|
/// of elements of type T. Supplied pointer is considered
|
||||||
|
/// blank and not owned by Buffer, so in this case Buffer
|
||||||
|
/// only acts as a wrapper around externally supplied
|
||||||
|
/// (and lifetime-managed) memory.
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit Buffer(const T* pMem, std::size_t length):
|
||||||
|
_capacity(length),
|
||||||
|
_used(length),
|
||||||
|
_ptr(new T[length]),
|
||||||
|
_ownMem(true)
|
||||||
|
/// Creates and allocates the Buffer; copies the contents of
|
||||||
|
/// the supplied memory into the buffer. Length argument specifies
|
||||||
|
/// the length of the supplied memory pointed to by pMem in the
|
||||||
|
/// number of elements of type T.
|
||||||
|
{
|
||||||
|
if (_used)
|
||||||
|
std::memcpy(_ptr, pMem, _used * sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
Buffer(const Buffer& other):
|
Buffer(const Buffer& other):
|
||||||
/// Copy constructor.
|
/// Copy constructor.
|
||||||
_capacity(other._used),
|
_capacity(other._used),
|
||||||
_used(other._used),
|
_used(other._used),
|
||||||
_ptr(new T[other._used])
|
_ptr(new T[other._used]),
|
||||||
|
_ownMem(true)
|
||||||
{
|
{
|
||||||
if (_used)
|
if (_used)
|
||||||
std::memcpy(_ptr, other._ptr, _used * sizeof(T));
|
std::memcpy(_ptr, other._ptr, _used * sizeof(T));
|
||||||
@@ -91,7 +121,7 @@ public:
|
|||||||
~Buffer()
|
~Buffer()
|
||||||
/// Destroys the Buffer.
|
/// Destroys the Buffer.
|
||||||
{
|
{
|
||||||
delete [] _ptr;
|
if (_ownMem) delete [] _ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(std::size_t newCapacity, bool preserveContent = true)
|
void resize(std::size_t newCapacity, bool preserveContent = true)
|
||||||
@@ -99,7 +129,13 @@ public:
|
|||||||
/// the content of the old buffer is copied over to the
|
/// the content of the old buffer is copied over to the
|
||||||
/// new buffer. The new capacity can be larger or smaller than
|
/// new buffer. The new capacity can be larger or smaller than
|
||||||
/// the current one, but it must not be 0.
|
/// the current one, but it must not be 0.
|
||||||
|
/// Buffers only wrapping externally owned storage can not be
|
||||||
|
/// resized. If resize is attempted on those, IllegalAccessException
|
||||||
|
/// is thrown.
|
||||||
{
|
{
|
||||||
|
if (!_ownMem)
|
||||||
|
throw InvalidAccessException("Cannot resize buffer which does not own its storage.");
|
||||||
|
|
||||||
poco_assert(newCapacity);
|
poco_assert(newCapacity);
|
||||||
|
|
||||||
if (newCapacity > _capacity)
|
if (newCapacity > _capacity)
|
||||||
@@ -116,11 +152,20 @@ public:
|
|||||||
_used = newCapacity;
|
_used = newCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void assign(const T* buf, std::size_t sz)
|
||||||
|
/// Assigns the argument buffer to this buffer.
|
||||||
|
/// If necessary, resizes the buffer.
|
||||||
|
{
|
||||||
|
if (0 == sz) return;
|
||||||
|
if (sz > _capacity) resize(sz, false);
|
||||||
|
std::memcpy(_ptr, buf, sz);
|
||||||
|
_used = sz;
|
||||||
|
}
|
||||||
|
|
||||||
void append(const T* buf, std::size_t sz)
|
void append(const T* buf, std::size_t sz)
|
||||||
/// Resizes this buffer and appends the argument buffer.
|
/// Resizes this buffer and appends the argument buffer.
|
||||||
{
|
{
|
||||||
if (0 == sz)
|
if (0 == sz) return;
|
||||||
return;
|
|
||||||
std::size_t oldSize = _used;
|
std::size_t oldSize = _used;
|
||||||
resize(_used + sz, true);
|
resize(_used + sz, true);
|
||||||
std::memcpy(_ptr + oldSize, buf, sz);
|
std::memcpy(_ptr + oldSize, buf, sz);
|
||||||
@@ -234,6 +279,7 @@ private:
|
|||||||
std::size_t _capacity;
|
std::size_t _capacity;
|
||||||
std::size_t _used;
|
std::size_t _used;
|
||||||
T* _ptr;
|
T* _ptr;
|
||||||
|
bool _ownMem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -67,7 +67,7 @@ public:
|
|||||||
|
|
||||||
mutable Poco::BasicEvent<bool> writable;
|
mutable Poco::BasicEvent<bool> writable;
|
||||||
/// Event indicating "writability" of the buffer,
|
/// Event indicating "writability" of the buffer,
|
||||||
/// triggerred as follows:
|
/// triggered as follows:
|
||||||
///
|
///
|
||||||
/// * when buffer transitions from non-full to full,
|
/// * when buffer transitions from non-full to full,
|
||||||
/// Writable event observers are notified, with
|
/// Writable event observers are notified, with
|
||||||
@@ -79,7 +79,7 @@ public:
|
|||||||
|
|
||||||
mutable Poco::BasicEvent<bool> readable;
|
mutable Poco::BasicEvent<bool> readable;
|
||||||
/// Event indicating "readability" of the buffer,
|
/// Event indicating "readability" of the buffer,
|
||||||
/// triggerred as follows:
|
/// triggered as follows:
|
||||||
///
|
///
|
||||||
/// * when buffer transitions from non-empty to empty,
|
/// * when buffer transitions from non-empty to empty,
|
||||||
/// Readable event observers are notified, with false
|
/// Readable event observers are notified, with false
|
||||||
@@ -94,7 +94,25 @@ public:
|
|||||||
_begin(0),
|
_begin(0),
|
||||||
_used(0),
|
_used(0),
|
||||||
_notify(notify)
|
_notify(notify)
|
||||||
/// Creates and allocates the FIFOBuffer.
|
/// Creates the FIFOBuffer.
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit BasicFIFOBuffer(T* pBuffer, std::size_t size, bool notify = false):
|
||||||
|
_buffer(pBuffer, size),
|
||||||
|
_begin(0),
|
||||||
|
_used(0),
|
||||||
|
_notify(notify)
|
||||||
|
/// Creates the FIFOBuffer.
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit BasicFIFOBuffer(const T* pBuffer, std::size_t size, bool notify = false):
|
||||||
|
_buffer(pBuffer, size),
|
||||||
|
_begin(0),
|
||||||
|
_used(size),
|
||||||
|
_notify(notify)
|
||||||
|
/// Creates the FIFOBuffer.
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,24 +141,64 @@ public:
|
|||||||
if (_notify) notify(usedBefore);
|
if (_notify) notify(usedBefore);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t peek(T* pBuffer, std::size_t length) const
|
||||||
|
/// Peeks into the data currently in the FIFO
|
||||||
|
/// without actually extracting it.
|
||||||
|
/// If length is zero, the return is immediate.
|
||||||
|
/// If length is greater than used length,
|
||||||
|
/// it is substituted with the the current FIFO
|
||||||
|
/// used length.
|
||||||
|
///
|
||||||
|
/// Returns the number of elements copied in the
|
||||||
|
/// supplied buffer.
|
||||||
|
{
|
||||||
|
if (0 == length) return 0;
|
||||||
|
Mutex::ScopedLock lock(_mutex);
|
||||||
|
if (length > _used) length = _used;
|
||||||
|
std::memcpy(pBuffer, _buffer.begin() + _begin, length * sizeof(T));
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
std::size_t peek(Poco::Buffer<T>& buffer, std::size_t length = 0) const
|
std::size_t peek(Poco::Buffer<T>& buffer, std::size_t length = 0) const
|
||||||
/// Peeks into the data currently in the FIFO
|
/// Peeks into the data currently in the FIFO
|
||||||
/// without actually extracting it.
|
/// without actually extracting it.
|
||||||
/// Resizes the supplied buffer to the size of
|
/// Resizes the supplied buffer to the size of
|
||||||
/// data written to it. If length is not
|
/// data written to it. If length is not
|
||||||
/// supplied by the caller, the current FIFO used length
|
/// supplied by the caller or is greater than length
|
||||||
/// is substituted for it.
|
/// of currently used data, the current FIFO used
|
||||||
|
/// data length is substituted for it.
|
||||||
|
///
|
||||||
|
/// Returns the number of elements copied in the
|
||||||
|
/// supplied buffer.
|
||||||
|
{
|
||||||
|
Mutex::ScopedLock lock(_mutex);
|
||||||
|
if (0 == length || length > _used) length = _used;
|
||||||
|
buffer.resize(length);
|
||||||
|
return peek(buffer.begin(), length);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t read(T* pBuffer, std::size_t length)
|
||||||
|
/// Copies the data currently in the FIFO
|
||||||
|
/// into the supplied buffer.
|
||||||
|
/// Resizes the supplied buffer to the size of
|
||||||
|
/// data written to it.
|
||||||
///
|
///
|
||||||
/// Returns the reference to the buffer.
|
/// Returns the reference to the buffer.
|
||||||
{
|
{
|
||||||
Mutex::ScopedLock lock(_mutex);
|
Mutex::ScopedLock lock(_mutex);
|
||||||
|
|
||||||
if (0 == length || length > _used) length = _used;
|
if (0 == _used) return 0;
|
||||||
poco_assert (length <= _buffer.size());
|
|
||||||
buffer.resize(length);
|
|
||||||
std::memcpy(buffer.begin(), _buffer.begin() + _begin, length * sizeof(T));
|
|
||||||
|
|
||||||
return length;
|
std::size_t usedBefore = _used;
|
||||||
|
std::size_t readLen = peek(pBuffer, length);
|
||||||
|
poco_assert (_used >= readLen);
|
||||||
|
_used -= readLen;
|
||||||
|
if (0 == _used) _begin = 0;
|
||||||
|
else _begin += length;
|
||||||
|
|
||||||
|
if (_notify) notify(usedBefore);
|
||||||
|
|
||||||
|
return readLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t read(Poco::Buffer<T>& buffer, std::size_t length = 0)
|
std::size_t read(Poco::Buffer<T>& buffer, std::size_t length = 0)
|
||||||
@@ -167,6 +225,38 @@ public:
|
|||||||
return readLen;
|
return readLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t write(const T* pBuffer, std::size_t length)
|
||||||
|
/// Writes data from supplied buffer to the FIFO buffer.
|
||||||
|
/// If there is no sufficient space for the whole
|
||||||
|
/// buffer to be written, data up to available
|
||||||
|
/// length is written.
|
||||||
|
/// The length of data to be written is determined from the
|
||||||
|
/// length argument. Function does nothing and returns zero
|
||||||
|
/// if length argument is equal to zero.
|
||||||
|
///
|
||||||
|
/// Returns the length of data written.
|
||||||
|
{
|
||||||
|
if (0 == length || isFull()) return 0;
|
||||||
|
|
||||||
|
Mutex::ScopedLock lock(_mutex);
|
||||||
|
|
||||||
|
if (_buffer.size() - (_begin + _used) < length)
|
||||||
|
{
|
||||||
|
std::memmove(_buffer.begin(), _buffer.begin() + _begin, _used);
|
||||||
|
_begin = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t usedBefore = _used;
|
||||||
|
std::size_t available = _buffer.size() - _used - _begin;
|
||||||
|
std::size_t len = length > available ? available : length;
|
||||||
|
std::memcpy(_buffer.begin() + _begin + _used, pBuffer, len * sizeof(T));
|
||||||
|
_used += len;
|
||||||
|
poco_assert (_used <= _buffer.size());
|
||||||
|
if (_notify) notify(usedBefore);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
std::size_t write(const Buffer<T>& buffer, std::size_t length = 0)
|
std::size_t write(const Buffer<T>& buffer, std::size_t length = 0)
|
||||||
/// Writes data from supplied buffer to the FIFO buffer.
|
/// Writes data from supplied buffer to the FIFO buffer.
|
||||||
/// If there is no sufficient space for the whole
|
/// If there is no sufficient space for the whole
|
||||||
@@ -178,25 +268,11 @@ public:
|
|||||||
///
|
///
|
||||||
/// Returns the length of data written.
|
/// Returns the length of data written.
|
||||||
{
|
{
|
||||||
Mutex::ScopedLock lock(_mutex);
|
if (isFull()) return 0;
|
||||||
|
|
||||||
if (0 == length || length > buffer.size()) length = buffer.size();
|
if (0 == length || length > buffer.size()) length = buffer.size();
|
||||||
|
|
||||||
if (_buffer.size() - (_begin + _used) < length)
|
return write(buffer.begin(), length);
|
||||||
{
|
|
||||||
std::memmove(_buffer.begin(), _buffer.begin() + _begin, _used);
|
|
||||||
_begin = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t usedBefore = _used;
|
|
||||||
std::size_t available = _buffer.size() - _used - _begin;
|
|
||||||
std::size_t len = length > available ? available : length;
|
|
||||||
std::memcpy(_buffer.begin() + _begin + _used, buffer.begin(), len * sizeof(T));
|
|
||||||
_used += len;
|
|
||||||
poco_assert (_used <= _buffer.size());
|
|
||||||
if (_notify) notify(usedBefore);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t size() const
|
std::size_t size() const
|
||||||
@@ -310,6 +386,24 @@ public:
|
|||||||
return 0 == _used;
|
return 0 == _used;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isFull() const
|
||||||
|
/// Returns true is buffer is full, false otherwise.
|
||||||
|
{
|
||||||
|
return size() == _used;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setNotify(bool notify = true)
|
||||||
|
/// Enables/disables notifications.
|
||||||
|
{
|
||||||
|
_notify = notify;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getNotify() const
|
||||||
|
/// Returns true if notifications are enabled, false otherwise.
|
||||||
|
{
|
||||||
|
return _notify;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void notify(std::size_t usedBefore)
|
void notify(std::size_t usedBefore)
|
||||||
{
|
{
|
||||||
|
176
Foundation/include/Poco/FIFOBufferStream.h
Normal file
176
Foundation/include/Poco/FIFOBufferStream.h
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
//
|
||||||
|
// FIFOBufferStream.h
|
||||||
|
//
|
||||||
|
// $Id: //poco/1.4/Foundation/include/Poco/FIFOBufferStream.h#1 $
|
||||||
|
//
|
||||||
|
// Library: Foundation
|
||||||
|
// Package: Streams
|
||||||
|
// Module: FIFOBufferStream
|
||||||
|
//
|
||||||
|
// Definition of the FIFOBufferStream class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef Foundation_FIFOBufferStream_INCLUDED
|
||||||
|
#define Foundation_FIFOBufferStream_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Foundation.h"
|
||||||
|
#include "Poco/FIFOBuffer.h"
|
||||||
|
#include "Poco/BufferedBidirectionalStreamBuf.h"
|
||||||
|
#include <istream>
|
||||||
|
#include <ostream>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Poco {
|
||||||
|
|
||||||
|
|
||||||
|
class Foundation_API FIFOBufferStreamBuf: public BufferedBidirectionalStreamBuf
|
||||||
|
/// This is the streambuf class used for reading from and writing to a FIFOBuffer.
|
||||||
|
/// FIFOBuffer is enabled for emtpy/non-empty/full state transitions notifications.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf();
|
||||||
|
/// Creates a FIFOBufferStreamBuf.
|
||||||
|
|
||||||
|
explicit FIFOBufferStreamBuf(FIFOBuffer& fifoBuffer);
|
||||||
|
/// Creates a FIFOBufferStreamBuf and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOBufferStreamBuf(char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStreamBuf and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOBufferStreamBuf(const char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStreamBuf and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOBufferStreamBuf(std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStreamBuf of the given length.
|
||||||
|
|
||||||
|
~FIFOBufferStreamBuf();
|
||||||
|
/// Destroys the FIFOBufferStreamBuf.
|
||||||
|
|
||||||
|
FIFOBuffer& fifoBuffer();
|
||||||
|
/// Returns the underlying FIFO buffer reference.
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int readFromDevice(char* buffer, std::streamsize length);
|
||||||
|
int writeToDevice(const char* buffer, std::streamsize length);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
STREAM_BUFFER_SIZE = 1024
|
||||||
|
};
|
||||||
|
|
||||||
|
FIFOBuffer* _pFIFOBuffer;
|
||||||
|
FIFOBuffer& _fifoBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Foundation_API FIFOIOS: public virtual std::ios
|
||||||
|
/// The base class for FIFOBufferInputStream and
|
||||||
|
/// FIFOBufferStream.
|
||||||
|
///
|
||||||
|
/// This class is needed to ensure the correct initialization
|
||||||
|
/// order of the stream buffer and base classes.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit FIFOIOS(FIFOBuffer& buffer);
|
||||||
|
/// Creates a FIFOIOS and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOIOS(char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOIOS and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOIOS(const char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOIOS and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOIOS(std::size_t length);
|
||||||
|
/// Creates a FIFOIOS of the given length.
|
||||||
|
|
||||||
|
~FIFOIOS();
|
||||||
|
/// Destroys the FIFOIOS.
|
||||||
|
///
|
||||||
|
/// Flushes the buffer.
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf* rdbuf();
|
||||||
|
/// Returns a pointer to the internal FIFOBufferStreamBuf.
|
||||||
|
|
||||||
|
void close();
|
||||||
|
/// Flushes the stream.
|
||||||
|
|
||||||
|
protected:
|
||||||
|
FIFOBufferStreamBuf _buf;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Foundation_API FIFOBufferStream: public FIFOIOS, public std::iostream
|
||||||
|
/// An output stream for writing to a FIFO.
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Poco::BasicEvent<bool>& writable;
|
||||||
|
Poco::BasicEvent<bool>& readable;
|
||||||
|
|
||||||
|
explicit FIFOBufferStream(FIFOBuffer& buffer);
|
||||||
|
/// Creates the FIFOBufferStream with supplied buffer as initial value.
|
||||||
|
|
||||||
|
explicit FIFOBufferStream(char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStream and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOBufferStream(const char* pBuffer, std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStream and assigns the given buffer to it.
|
||||||
|
|
||||||
|
explicit FIFOBufferStream(std::size_t length);
|
||||||
|
/// Creates a FIFOBufferStream of the given length.
|
||||||
|
|
||||||
|
~FIFOBufferStream();
|
||||||
|
/// Destroys the FIFOBufferStream.
|
||||||
|
///
|
||||||
|
/// Flushes the buffer.
|
||||||
|
|
||||||
|
private:
|
||||||
|
FIFOBufferStream();
|
||||||
|
FIFOBufferStream(const FIFOBufferStream& other);
|
||||||
|
FIFOBufferStream& operator =(const FIFOBufferStream& other);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// inlines
|
||||||
|
///
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBuffer& FIFOBufferStreamBuf::fifoBuffer()
|
||||||
|
{
|
||||||
|
return _fifoBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Poco
|
||||||
|
|
||||||
|
|
||||||
|
#endif // Foundation_FIFOBufferStream_INCLUDED
|
@@ -58,7 +58,7 @@ class BasicMemoryStreamBuf: public std::basic_streambuf<ch, tr>
|
|||||||
/// stream buffer for reading and writing from a memory area.
|
/// stream buffer for reading and writing from a memory area.
|
||||||
///
|
///
|
||||||
/// This streambuf only supports unidirectional streams.
|
/// This streambuf only supports unidirectional streams.
|
||||||
/// In other words, the BasicBufferedStreamBuf can be
|
/// In other words, the BasicMemoryStreamBuf can be
|
||||||
/// used for the implementation of an istream or an
|
/// used for the implementation of an istream or an
|
||||||
/// ostream, but not for an iostream.
|
/// ostream, but not for an iostream.
|
||||||
{
|
{
|
||||||
|
@@ -93,17 +93,17 @@ public:
|
|||||||
{
|
{
|
||||||
if (_ispb)
|
if (_ispb)
|
||||||
{
|
{
|
||||||
return _pb;
|
return _pb;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int_type c = readFromDevice();
|
int_type c = readFromDevice();
|
||||||
if (c != char_traits::eof())
|
if (c != char_traits::eof())
|
||||||
{
|
{
|
||||||
_ispb = true;
|
_ispb = true;
|
||||||
_pb = c;
|
_pb = c;
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,12 +116,12 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int_type c = readFromDevice();
|
int_type c = readFromDevice();
|
||||||
if (c != char_traits::eof())
|
if (c != char_traits::eof())
|
||||||
{
|
{
|
||||||
_pb = c;
|
_pb = c;
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,13 +129,13 @@ public:
|
|||||||
{
|
{
|
||||||
if (_ispb)
|
if (_ispb)
|
||||||
{
|
{
|
||||||
return char_traits::eof();
|
return char_traits::eof();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_ispb = true;
|
_ispb = true;
|
||||||
_pb = c;
|
_pb = c;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
208
Foundation/src/FIFOBufferStream.cpp
Normal file
208
Foundation/src/FIFOBufferStream.cpp
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
//
|
||||||
|
// FIFOBufferStream.cpp
|
||||||
|
//
|
||||||
|
// $Id: //poco/1.4/Foundation/src/FIFOBufferStream.cpp#1 $
|
||||||
|
//
|
||||||
|
// Library: Foundation
|
||||||
|
// Package: Streams
|
||||||
|
// Module: FIFOBufferStream
|
||||||
|
//
|
||||||
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/FIFOBufferStream.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Poco {
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// FIFOBufferStreamBuf
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::FIFOBufferStreamBuf():
|
||||||
|
BufferedBidirectionalStreamBuf(STREAM_BUFFER_SIZE + 4, std::ios::in | std::ios::out),
|
||||||
|
_pFIFOBuffer(new FIFOBuffer(STREAM_BUFFER_SIZE, true)),
|
||||||
|
_fifoBuffer(*_pFIFOBuffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::FIFOBufferStreamBuf(FIFOBuffer& fifoBuffer):
|
||||||
|
BufferedBidirectionalStreamBuf(fifoBuffer.size() + 4, std::ios::in | std::ios::out),
|
||||||
|
_pFIFOBuffer(0),
|
||||||
|
_fifoBuffer(fifoBuffer)
|
||||||
|
{
|
||||||
|
fifoBuffer.setNotify(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::FIFOBufferStreamBuf(char* pBuffer, std::size_t length):
|
||||||
|
BufferedBidirectionalStreamBuf(length + 4, std::ios::in | std::ios::out),
|
||||||
|
_pFIFOBuffer(new FIFOBuffer(pBuffer, length, true)),
|
||||||
|
_fifoBuffer(*_pFIFOBuffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::FIFOBufferStreamBuf(const char* pBuffer, std::size_t length):
|
||||||
|
BufferedBidirectionalStreamBuf(length + 4, std::ios::in | std::ios::out),
|
||||||
|
_pFIFOBuffer(new FIFOBuffer(pBuffer, length, true)),
|
||||||
|
_fifoBuffer(*_pFIFOBuffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::FIFOBufferStreamBuf(std::size_t length):
|
||||||
|
BufferedBidirectionalStreamBuf(length + 4, std::ios::in | std::ios::out),
|
||||||
|
_pFIFOBuffer(new FIFOBuffer(length, true)),
|
||||||
|
_fifoBuffer(*_pFIFOBuffer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf::~FIFOBufferStreamBuf()
|
||||||
|
{
|
||||||
|
delete _pFIFOBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int FIFOBufferStreamBuf::readFromDevice(char* buffer, std::streamsize length)
|
||||||
|
{
|
||||||
|
poco_assert (length > 0);
|
||||||
|
return _fifoBuffer.read(buffer, static_cast<std::size_t>(length));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int FIFOBufferStreamBuf::writeToDevice(const char* buffer, std::streamsize length)
|
||||||
|
{
|
||||||
|
poco_assert (length > 0);
|
||||||
|
return _fifoBuffer.write(buffer, static_cast<std::size_t>(length));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// FIFOIOS
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
FIFOIOS::FIFOIOS(FIFOBuffer& fifoBuffer): _buf(fifoBuffer)
|
||||||
|
{
|
||||||
|
poco_ios_init(&_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOIOS::FIFOIOS(char* pBuffer, std::size_t length): _buf(pBuffer, length)
|
||||||
|
{
|
||||||
|
poco_ios_init(&_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOIOS::FIFOIOS(const char* pBuffer, std::size_t length): _buf(pBuffer, length)
|
||||||
|
{
|
||||||
|
poco_ios_init(&_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOIOS::FIFOIOS(std::size_t length): _buf(length)
|
||||||
|
{
|
||||||
|
poco_ios_init(&_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOIOS::~FIFOIOS()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_buf.sync();
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamBuf* FIFOIOS::rdbuf()
|
||||||
|
{
|
||||||
|
return &_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOIOS::close()
|
||||||
|
{
|
||||||
|
_buf.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// FIFOBufferStream
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStream::FIFOBufferStream(FIFOBuffer& fifoBuffer):
|
||||||
|
FIFOIOS(fifoBuffer),
|
||||||
|
readable(_buf.fifoBuffer().readable),
|
||||||
|
writable(_buf.fifoBuffer().writable),
|
||||||
|
std::iostream(&_buf)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStream::FIFOBufferStream(char* pBuffer, std::size_t length):
|
||||||
|
FIFOIOS(pBuffer, length),
|
||||||
|
readable(_buf.fifoBuffer().readable),
|
||||||
|
writable(_buf.fifoBuffer().writable),
|
||||||
|
std::iostream(&_buf)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStream::FIFOBufferStream(const char* pBuffer, std::size_t length):
|
||||||
|
FIFOIOS(pBuffer, length),
|
||||||
|
readable(_buf.fifoBuffer().readable),
|
||||||
|
writable(_buf.fifoBuffer().writable),
|
||||||
|
std::iostream(&_buf)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStream::FIFOBufferStream(std::size_t length):
|
||||||
|
FIFOIOS(length),
|
||||||
|
readable(_buf.fifoBuffer().readable),
|
||||||
|
writable(_buf.fifoBuffer().writable),
|
||||||
|
std::iostream(&_buf)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStream::~FIFOBufferStream()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Poco
|
@@ -308,6 +308,7 @@
|
|||||||
<ClCompile Include="src\CoreTest.cpp" />
|
<ClCompile Include="src\CoreTest.cpp" />
|
||||||
<ClCompile Include="src\CoreTestSuite.cpp" />
|
<ClCompile Include="src\CoreTestSuite.cpp" />
|
||||||
<ClCompile Include="src\DynamicFactoryTest.cpp" />
|
<ClCompile Include="src\DynamicFactoryTest.cpp" />
|
||||||
|
<ClCompile Include="src\FIFOBufferStreamTest.cpp" />
|
||||||
<ClCompile Include="src\FormatTest.cpp" />
|
<ClCompile Include="src\FormatTest.cpp" />
|
||||||
<ClCompile Include="src\FPETest.cpp" />
|
<ClCompile Include="src\FPETest.cpp" />
|
||||||
<ClCompile Include="src\MemoryPoolTest.cpp" />
|
<ClCompile Include="src\MemoryPoolTest.cpp" />
|
||||||
@@ -439,6 +440,7 @@
|
|||||||
<ClInclude Include="src\CoreTest.h" />
|
<ClInclude Include="src\CoreTest.h" />
|
||||||
<ClInclude Include="src\CoreTestSuite.h" />
|
<ClInclude Include="src\CoreTestSuite.h" />
|
||||||
<ClInclude Include="src\DynamicFactoryTest.h" />
|
<ClInclude Include="src\DynamicFactoryTest.h" />
|
||||||
|
<ClInclude Include="src\FIFOBufferStreamTest.h" />
|
||||||
<ClInclude Include="src\FormatTest.h" />
|
<ClInclude Include="src\FormatTest.h" />
|
||||||
<ClInclude Include="src\FPETest.h" />
|
<ClInclude Include="src\FPETest.h" />
|
||||||
<ClInclude Include="src\MemoryPoolTest.h" />
|
<ClInclude Include="src\MemoryPoolTest.h" />
|
||||||
|
@@ -567,6 +567,9 @@
|
|||||||
<ClCompile Include="src\ArrayTest.cpp">
|
<ClCompile Include="src\ArrayTest.cpp">
|
||||||
<Filter>Core\Source Files</Filter>
|
<Filter>Core\Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\FIFOBufferStreamTest.cpp">
|
||||||
|
<Filter>Streams\Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="src\AnyTest.h">
|
<ClInclude Include="src\AnyTest.h">
|
||||||
@@ -953,5 +956,8 @@
|
|||||||
<ClInclude Include="src\ArrayTest.h">
|
<ClInclude Include="src\ArrayTest.h">
|
||||||
<Filter>Core\Source Files</Filter>
|
<Filter>Core\Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\FIFOBufferStreamTest.h">
|
||||||
|
<Filter>Streams\Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@@ -258,7 +258,25 @@ void CoreTest::testBuffer()
|
|||||||
|
|
||||||
g.append("hello", 5);
|
g.append("hello", 5);
|
||||||
assert (g.size() == 10);
|
assert (g.size() == 10);
|
||||||
assert ( !memcmp(g.begin(), "hellohello", 10) );
|
assert ( !std::memcmp(g.begin(), "hellohello", 10) );
|
||||||
|
|
||||||
|
char h[10];
|
||||||
|
Buffer<char> i(h, 10);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
i.append("hello", 5);
|
||||||
|
fail ("must fail");
|
||||||
|
}
|
||||||
|
catch (InvalidAccessException&) { }
|
||||||
|
|
||||||
|
i.assign("hello", 5);
|
||||||
|
assert ( !std::memcmp(&h[0], "hello", 5) );
|
||||||
|
|
||||||
|
const char j[10] = "hello";
|
||||||
|
Buffer<char> k(j, 5);
|
||||||
|
k.append("hello", 5);
|
||||||
|
assert ( !std::memcmp(&j[0], "hello", 5) );
|
||||||
|
assert ( !std::memcmp(k.begin(), "hellohello", 10) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -267,6 +285,10 @@ void CoreTest::testFIFOBufferChar()
|
|||||||
typedef FIFOBuffer::Type T;
|
typedef FIFOBuffer::Type T;
|
||||||
|
|
||||||
FIFOBuffer f(20, true);
|
FIFOBuffer f(20, true);
|
||||||
|
|
||||||
|
assert (f.isEmpty());
|
||||||
|
assert (!f.isFull());
|
||||||
|
|
||||||
Buffer<T> b(10);
|
Buffer<T> b(10);
|
||||||
std::vector<T> v;
|
std::vector<T> v;
|
||||||
|
|
||||||
@@ -423,6 +445,7 @@ void CoreTest::testFIFOBufferChar()
|
|||||||
assert(2 == _readableToNot);
|
assert(2 == _readableToNot);
|
||||||
assert(0 == _notToWritable);
|
assert(0 == _notToWritable);
|
||||||
assert(1 == _writableToNot);
|
assert(1 == _writableToNot);
|
||||||
|
assert (f.isFull());
|
||||||
|
|
||||||
f.read(b);
|
f.read(b);
|
||||||
assert(3 == _notToReadable);
|
assert(3 == _notToReadable);
|
||||||
@@ -545,6 +568,7 @@ void CoreTest::testFIFOBufferChar()
|
|||||||
assert(6 == _readableToNot);
|
assert(6 == _readableToNot);
|
||||||
assert(1 == _notToWritable);
|
assert(1 == _notToWritable);
|
||||||
assert(2 == _writableToNot);
|
assert(2 == _writableToNot);
|
||||||
|
assert (f.isFull());
|
||||||
|
|
||||||
assert (10 == f.size());
|
assert (10 == f.size());
|
||||||
assert (10 == f.used());
|
assert (10 == f.used());
|
||||||
|
222
Foundation/testsuite/src/FIFOBufferStreamTest.cpp
Normal file
222
Foundation/testsuite/src/FIFOBufferStreamTest.cpp
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
//
|
||||||
|
// FIFOBufferStreamTest.cpp
|
||||||
|
//
|
||||||
|
// $Id: //poco/1.4/Foundation/testsuite/src/FIFOBufferStreamTest.cpp#2 $
|
||||||
|
//
|
||||||
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include "FIFOBufferStreamTest.h"
|
||||||
|
#include "CppUnit/TestCaller.h"
|
||||||
|
#include "CppUnit/TestSuite.h"
|
||||||
|
#include "Poco/FIFOBuffer.h"
|
||||||
|
#include "Poco/FIFOBufferStream.h"
|
||||||
|
#include "Poco/Delegate.h"
|
||||||
|
|
||||||
|
|
||||||
|
using Poco::FIFOBuffer;
|
||||||
|
using Poco::FIFOBufferStream;
|
||||||
|
using Poco::delegate;
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamTest::FIFOBufferStreamTest(const std::string& name): CppUnit::TestCase(name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FIFOBufferStreamTest::~FIFOBufferStreamTest()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::testInput()
|
||||||
|
{
|
||||||
|
const char* data = "This is a test";
|
||||||
|
FIFOBuffer fb1(data, 14);
|
||||||
|
FIFOBufferStream str1(fb1);
|
||||||
|
assert (str1.rdbuf()->fifoBuffer().isFull());
|
||||||
|
|
||||||
|
int c = str1.get();
|
||||||
|
assert (c == 'T');
|
||||||
|
c = str1.get();
|
||||||
|
assert (c == 'h');
|
||||||
|
|
||||||
|
std::string str;
|
||||||
|
str1 >> str;
|
||||||
|
assert (str == "is");
|
||||||
|
|
||||||
|
char buffer[32];
|
||||||
|
str1.read(buffer, sizeof(buffer));
|
||||||
|
assert (str1.gcount() == 10);
|
||||||
|
buffer[str1.gcount()] = 0;
|
||||||
|
assert (std::string(" is a test") == buffer);
|
||||||
|
|
||||||
|
const char* data2 = "123";
|
||||||
|
FIFOBufferStream str2(data2, 3);
|
||||||
|
|
||||||
|
c = str2.get();
|
||||||
|
assert (c == '1');
|
||||||
|
assert (str2.good());
|
||||||
|
c = str2.get();
|
||||||
|
assert (c == '2');
|
||||||
|
str2.unget();
|
||||||
|
c = str2.get();
|
||||||
|
assert (c == '2');
|
||||||
|
assert (str2.good());
|
||||||
|
c = str2.get();
|
||||||
|
assert (c == '3');
|
||||||
|
assert (str2.good());
|
||||||
|
c = str2.get();
|
||||||
|
assert (c == -1);
|
||||||
|
assert (str2.eof());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::testOutput()
|
||||||
|
{
|
||||||
|
char output[64];
|
||||||
|
FIFOBufferStream iostr1(output, 64);
|
||||||
|
iostr1 << "This is a test " << 42 << std::ends << std::flush;
|
||||||
|
assert (std::string("This is a test 42") == output);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::testNotify()
|
||||||
|
{
|
||||||
|
FIFOBuffer fb(18);
|
||||||
|
FIFOBufferStream iostr(fb);
|
||||||
|
assert (iostr.rdbuf()->fifoBuffer().isEmpty());
|
||||||
|
|
||||||
|
assert (0 == _readableToNot);
|
||||||
|
assert (0 == _notToReadable);
|
||||||
|
assert (0 == _writableToNot);
|
||||||
|
assert (0 == _notToWritable);
|
||||||
|
|
||||||
|
iostr.readable += delegate(this, &FIFOBufferStreamTest::onReadable);
|
||||||
|
iostr.writable += delegate(this, &FIFOBufferStreamTest::onWritable);
|
||||||
|
|
||||||
|
iostr << "This is a test " << 42 << std::ends << std::flush;
|
||||||
|
assert (iostr.rdbuf()->fifoBuffer().isFull());
|
||||||
|
|
||||||
|
assert (0 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (0 == _notToWritable);
|
||||||
|
|
||||||
|
char input[64];
|
||||||
|
iostr >> input;
|
||||||
|
assert (std::string("This") == input);
|
||||||
|
assert (iostr.rdbuf()->fifoBuffer().isEmpty());
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr >> input;
|
||||||
|
assert (std::string("is") == input);
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr >> input;
|
||||||
|
assert (std::string("a") == input);
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr >> input;
|
||||||
|
assert (std::string("test") == input);
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr >> input;
|
||||||
|
assert (std::string("42") == input);
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (1 == _notToReadable);
|
||||||
|
assert (1 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr << "This is a test " << 42 << std::ends << std::flush;
|
||||||
|
assert (iostr.rdbuf()->fifoBuffer().isFull());
|
||||||
|
|
||||||
|
assert (1 == _readableToNot);
|
||||||
|
assert (2 == _notToReadable);
|
||||||
|
assert (2 == _writableToNot);
|
||||||
|
assert (1 == _notToWritable);
|
||||||
|
|
||||||
|
iostr.readable -= delegate(this, &FIFOBufferStreamTest::onReadable);
|
||||||
|
iostr.writable -= delegate(this, &FIFOBufferStreamTest::onWritable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::onReadable(bool& b)
|
||||||
|
{
|
||||||
|
if (b) ++_notToReadable;
|
||||||
|
else ++_readableToNot;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::onWritable(bool& b)
|
||||||
|
{
|
||||||
|
if (b) ++_notToWritable;
|
||||||
|
else ++_writableToNot;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::setUp()
|
||||||
|
{
|
||||||
|
_readableToNot = 0;
|
||||||
|
_notToReadable = 0;
|
||||||
|
_writableToNot = 0;
|
||||||
|
_notToWritable = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FIFOBufferStreamTest::tearDown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CppUnit::Test* FIFOBufferStreamTest::suite()
|
||||||
|
{
|
||||||
|
CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("FIFOBufferStreamTest");
|
||||||
|
|
||||||
|
CppUnit_addTest(pSuite, FIFOBufferStreamTest, testInput);
|
||||||
|
CppUnit_addTest(pSuite, FIFOBufferStreamTest, testOutput);
|
||||||
|
CppUnit_addTest(pSuite, FIFOBufferStreamTest, testNotify);
|
||||||
|
|
||||||
|
return pSuite;
|
||||||
|
}
|
70
Foundation/testsuite/src/FIFOBufferStreamTest.h
Normal file
70
Foundation/testsuite/src/FIFOBufferStreamTest.h
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
//
|
||||||
|
// FIFOBufferStreamTest.h
|
||||||
|
//
|
||||||
|
// $Id: //poco/1.4/Foundation/testsuite/src/FIFOBufferStreamTest.h#1 $
|
||||||
|
//
|
||||||
|
// Definition of the FIFOBufferStreamTest class.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2009, Applied Informatics Software Engineering GmbH.
|
||||||
|
// and Contributors.
|
||||||
|
//
|
||||||
|
// Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
// obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
// this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
// execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
// Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
// do so, all subject to the following:
|
||||||
|
//
|
||||||
|
// The copyright notices in the Software and this entire statement, including
|
||||||
|
// the above license grant, this restriction and the following disclaimer,
|
||||||
|
// must be included in all copies of the Software, in whole or in part, and
|
||||||
|
// all derivative works of the Software, unless such copies or derivative
|
||||||
|
// works are solely in the form of machine-executable object code generated by
|
||||||
|
// a source language processor.
|
||||||
|
//
|
||||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
// DEALINGS IN THE SOFTWARE.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef FIFOBufferStreamTest_INCLUDED
|
||||||
|
#define FIFOBufferStreamTest_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "Poco/Foundation.h"
|
||||||
|
#include "CppUnit/TestCase.h"
|
||||||
|
|
||||||
|
|
||||||
|
class FIFOBufferStreamTest: public CppUnit::TestCase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FIFOBufferStreamTest(const std::string& name);
|
||||||
|
~FIFOBufferStreamTest();
|
||||||
|
|
||||||
|
void testInput();
|
||||||
|
void testOutput();
|
||||||
|
void testNotify();
|
||||||
|
|
||||||
|
void setUp();
|
||||||
|
void tearDown();
|
||||||
|
|
||||||
|
static CppUnit::Test* suite();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void onReadable(bool& b);
|
||||||
|
void onWritable(bool& b);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _readableToNot;
|
||||||
|
int _notToReadable;
|
||||||
|
int _writableToNot;
|
||||||
|
int _notToWritable;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // FIFOBufferStreamTest_INCLUDED
|
@@ -43,6 +43,7 @@
|
|||||||
#include "TeeStreamTest.h"
|
#include "TeeStreamTest.h"
|
||||||
#include "FileStreamTest.h"
|
#include "FileStreamTest.h"
|
||||||
#include "MemoryStreamTest.h"
|
#include "MemoryStreamTest.h"
|
||||||
|
#include "FIFOBufferStreamTest.h"
|
||||||
|
|
||||||
|
|
||||||
CppUnit::Test* StreamsTestSuite::suite()
|
CppUnit::Test* StreamsTestSuite::suite()
|
||||||
@@ -61,6 +62,7 @@ CppUnit::Test* StreamsTestSuite::suite()
|
|||||||
pSuite->addTest(TeeStreamTest::suite());
|
pSuite->addTest(TeeStreamTest::suite());
|
||||||
pSuite->addTest(FileStreamTest::suite());
|
pSuite->addTest(FileStreamTest::suite());
|
||||||
pSuite->addTest(MemoryStreamTest::suite());
|
pSuite->addTest(MemoryStreamTest::suite());
|
||||||
|
pSuite->addTest(FIFOBufferStreamTest::suite());
|
||||||
|
|
||||||
return pSuite;
|
return pSuite;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user