FIFO resize bugfix and more tests

This commit is contained in:
Aleksandar Fabijanic
2012-04-26 00:08:53 +00:00
parent afc81ef12d
commit 15d960b057
2 changed files with 53 additions and 2 deletions

View File

@@ -88,8 +88,7 @@ public:
throw InvalidAccessException("Can not resize FIFO without data loss."); throw InvalidAccessException("Can not resize FIFO without data loss.");
_buffer.resize(newSize, preserveContent); _buffer.resize(newSize, preserveContent);
if (_used > _buffer.size()) if (!preserveContent) _used = 0;
_used = _buffer.size();
} }
Buffer<T>& peek(Poco::Buffer<T>& buffer, std::size_t length = 0) const Buffer<T>& peek(Poco::Buffer<T>& buffer, std::size_t length = 0) const
@@ -108,6 +107,7 @@ public:
poco_assert (length <= _buffer.size()); poco_assert (length <= _buffer.size());
buffer.resize(length); buffer.resize(length);
std::memcpy(buffer.begin(), _buffer.begin(), length * sizeof(T)); std::memcpy(buffer.begin(), _buffer.begin(), length * sizeof(T));
return buffer; return buffer;
} }
@@ -139,12 +139,14 @@ public:
/// Returns the length of data written. /// Returns the length of data written.
{ {
Mutex::ScopedLock lock(_mutex); Mutex::ScopedLock lock(_mutex);
poco_assert (_used <= _buffer.size()); poco_assert (_used <= _buffer.size());
std::size_t available = _buffer.size() - _used; std::size_t available = _buffer.size() - _used;
std::size_t len = buffer.size() > available ? available : buffer.size(); std::size_t len = buffer.size() > available ? available : buffer.size();
std::memcpy(_buffer.begin() + _used, buffer.begin(), len * sizeof(T)); std::memcpy(_buffer.begin() + _used, buffer.begin(), len * sizeof(T));
_used += len; _used += len;
poco_assert (_used <= _buffer.size()); poco_assert (_used <= _buffer.size());
return len; return len;
} }

View File

@@ -296,7 +296,31 @@ void CoreTest::testFIFOBufferChar()
assert (0 == f.used()); assert (0 == f.used());
try { T i = f[0]; fail ("must fail"); } try { T i = f[0]; fail ("must fail"); }
catch (InvalidAccessException&) { } catch (InvalidAccessException&) { }
assert (f.isEmpty());
assert (5 == f.write(b));
assert (20 == f.size());
assert (5 == f.used());
assert (!f.isEmpty());
assert ('f' == f[0]);
assert ('g' == f[1]);
assert ('h' == f[2]);
assert ('i' == f[3]);
assert ('j' == f[4]);
f.resize(10);
assert (10 == f.size());
assert (5 == f.used());
assert (!f.isEmpty());
assert ('f' == f[0]);
assert ('g' == f[1]);
assert ('h' == f[2]);
assert ('i' == f[3]);
assert ('j' == f[4]);
f.resize(3, false);
assert (3 == f.size());
assert (0 == f.used());
assert (f.isEmpty()); assert (f.isEmpty());
} }
@@ -389,6 +413,31 @@ void CoreTest::testFIFOBufferInt()
catch (InvalidAccessException&) { } catch (InvalidAccessException&) { }
assert (f.isEmpty()); assert (f.isEmpty());
assert (5 == f.write(b));
assert (20 == f.size());
assert (5 == f.used());
assert (!f.isEmpty());
assert (15 == f[0]);
assert (16 == f[1]);
assert (17 == f[2]);
assert (18 == f[3]);
assert (19 == f[4]);
f.resize(10);
assert (10 == f.size());
assert (5 == f.used());
assert (!f.isEmpty());
assert (15 == f[0]);
assert (16 == f[1]);
assert (17 == f[2]);
assert (18 == f[3]);
assert (19 == f[4]);
f.resize(3, false);
assert (3 == f.size());
assert (0 == f.used());
assert (f.isEmpty());
} }