Should help when skipping very big blobs, but don't have such trace
handy now.
assert(m_cachePtr == m_cache);
}
assert(m_cachePtr == m_cache);
}
-void SnappyFile::flushReadCache()
+void SnappyFile::flushReadCache(size_t skipLength)
{
//assert(m_cachePtr == m_cache + m_cacheSize);
m_currentOffset.chunk = m_stream.tellg();
{
//assert(m_cachePtr == m_cache + m_cacheSize);
m_currentOffset.chunk = m_stream.tellg();
::snappy::GetUncompressedLength(m_compressedCache, compressedLength,
&m_cacheSize);
createCache(m_cacheSize);
::snappy::GetUncompressedLength(m_compressedCache, compressedLength,
&m_cacheSize);
createCache(m_cacheSize);
- ::snappy::RawUncompress(m_compressedCache, compressedLength,
- m_cache);
+ if (skipLength < m_cacheSize) {
+ ::snappy::RawUncompress(m_compressedCache, compressedLength,
+ m_cache);
+ }
} else {
createCache(0);
}
} else {
createCache(0);
}
m_cachePtr += chunkSize;
sizeToRead -= chunkSize;
if (sizeToRead > 0) {
m_cachePtr += chunkSize;
sizeToRead -= chunkSize;
if (sizeToRead > 0) {
+ flushReadCache(sizeToRead);
}
if (!m_cacheSize) {
break;
}
if (!m_cacheSize) {
break;
return m_stream.eof() && freeCacheSize() == 0;
}
void flushWriteCache();
return m_stream.eof() && freeCacheSize() == 0;
}
void flushWriteCache();
+ void flushReadCache(size_t skipLength = 0);
void createCache(size_t size);
void writeCompressedLength(size_t length);
size_t readCompressedLength();
void createCache(size_t size);
void writeCompressedLength(size_t length);
size_t readCompressedLength();