X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_snappyfile.hpp;h=33159ec73cc81eb4413158de707940a2c64c5211;hb=9d50fbb84f9b3086aa8e985e32534961336563b2;hp=5489069b0506eadf700b99e69e3ff2abf3d3e890;hpb=b5f2ee344ef2914ca141608107c571ec0c28c6a6;p=apitrace diff --git a/trace_snappyfile.hpp b/trace_snappyfile.hpp index 5489069..33159ec 100644 --- a/trace_snappyfile.hpp +++ b/trace_snappyfile.hpp @@ -1,6 +1,34 @@ +/************************************************************************** + * + * Copyright 2011 Zack Rusin + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * 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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + + #ifndef TRACE_SNAPPYFILE_HPP #define TRACE_SNAPPYFILE_HPP +#include + #include "trace_file.hpp" #include @@ -24,24 +52,43 @@ public: File::Mode mode = File::Read); virtual ~SnappyFile(); + virtual bool supportsOffsets() const; + virtual File::Offset currentOffset(); + virtual void setCurrentOffset(const File::Offset &offset); protected: virtual bool rawOpen(const std::string &filename, File::Mode mode); - virtual bool rawWrite(const void *buffer, int length); - virtual bool rawRead(void *buffer, int length); + virtual bool rawWrite(const void *buffer, size_t length); + virtual bool rawRead(void *buffer, size_t length); virtual int rawGetc(); virtual void rawClose(); - virtual void rawFlush(FlushType type); + virtual void rawFlush(); + virtual bool rawSkip(size_t length); + virtual int rawPercentRead(); private: - inline int freeCacheSize() const + inline size_t usedCacheSize() const + { + assert(m_cachePtr >= m_cache); + return m_cachePtr - m_cache; + } + inline size_t freeCacheSize() const { - if (m_cacheSize > 0) - return m_cacheSize - (m_cachePtr - m_cache); - else + assert(m_cacheSize >= usedCacheSize()); + if (m_cacheSize > 0) { + return m_cacheSize - usedCacheSize(); + } else { return 0; + } + } + inline bool endOfData() const + { + return m_stream.eof() && freeCacheSize() == 0; } - void flushCache(); + void flushWriteCache(); + void flushReadCache(size_t skipLength = 0); void createCache(size_t size); + void writeCompressedLength(size_t length); + size_t readCompressedLength(); private: std::fstream m_stream; char *m_cache; @@ -49,6 +96,9 @@ private: size_t m_cacheSize; char *m_compressedCache; + + File::Offset m_currentOffset; + std::streampos m_endPos; }; }