X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.hpp;h=4b1b70ddad6f6bd886ac7aa51c28f5604b281faf;hb=447f4a55a01e82b0265f44212b8d439fa83750d7;hp=fb61b985d8c2e98862a95af05d37a897a1988c66;hpb=1035b94bc86d70dc0f6af1adcf7f20fd5d2bdca3;p=apitrace diff --git a/trace_file.hpp b/trace_file.hpp index fb61b98..4b1b70d 100644 --- a/trace_file.hpp +++ b/trace_file.hpp @@ -1,8 +1,35 @@ +/************************************************************************** + * + * 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_FILE_HPP #define TRACE_FILE_HPP #include #include +#include namespace Trace { @@ -12,10 +39,15 @@ public: Read, Write }; - enum FlushType { - FlushShallow, - FlushDeep + struct Offset { + Offset(uint64_t _chunk = 0, uint32_t _offsetInChunk = 0) + : chunk(_chunk), + offsetInChunk(_offsetInChunk) + {} + uint64_t chunk; + uint32_t offsetInChunk; }; + public: static bool isZLibCompressed(const std::string &filename); static bool isSnappyCompressed(const std::string &filename); @@ -26,83 +58,165 @@ public: bool isOpened() const; File::Mode mode() const; - std::string filename() const; bool open(const std::string &filename, File::Mode mode); - bool write(const void *buffer, int length); - bool read(void *buffer, int length); + bool write(const void *buffer, size_t length); + bool read(void *buffer, size_t length); void close(); - void flush(FlushType type = FlushShallow); + void flush(void); int getc(); + bool skip(size_t length); + int percentRead(); + virtual bool supportsOffsets() const = 0; + virtual File::Offset currentOffset() = 0; + virtual void setCurrentOffset(const File::Offset &offset); protected: virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0; - virtual bool rawWrite(const void *buffer, int length) = 0; - virtual bool rawRead(void *buffer, int length) = 0; + virtual bool rawWrite(const void *buffer, size_t length) = 0; + virtual bool rawRead(void *buffer, size_t length) = 0; virtual int rawGetc() = 0; virtual void rawClose() = 0; - virtual void rawFlush(FlushType type) = 0; + virtual void rawFlush() = 0; + virtual bool rawSkip(size_t length) = 0; + virtual int rawPercentRead() = 0; protected: - std::string m_filename; File::Mode m_mode; bool m_isOpened; }; +inline bool File::isOpened() const +{ + return m_isOpened; +} + +inline File::Mode File::mode() const +{ + return m_mode; +} + +inline bool File::open(const std::string &filename, File::Mode mode) +{ + if (m_isOpened) { + close(); + } + m_isOpened = rawOpen(filename, mode); + m_mode = mode; + + return m_isOpened; +} + +inline bool File::write(const void *buffer, size_t length) +{ + if (!m_isOpened || m_mode != File::Write) { + return false; + } + return rawWrite(buffer, length); +} + +inline bool File::read(void *buffer, size_t length) +{ + if (!m_isOpened || m_mode != File::Read) { + return false; + } + return rawRead(buffer, length); +} + +inline int File::percentRead() +{ + if (!m_isOpened || m_mode != File::Read) { + return 0; + } + return rawPercentRead(); +} + +inline void File::close() +{ + if (m_isOpened) { + rawClose(); + m_isOpened = false; + } +} + +inline void File::flush(void) +{ + if (m_mode == File::Write) { + rawFlush(); + } +} + +inline int File::getc() +{ + if (!m_isOpened || m_mode != File::Read) { + return -1; + } + return rawGetc(); +} + +inline bool File::skip(size_t length) +{ + if (!m_isOpened || m_mode != File::Read) { + return false; + } + return rawSkip(length); +} + class ZLibFile : public File { public: ZLibFile(const std::string &filename = std::string(), File::Mode mode = File::Read); virtual ~ZLibFile(); + + virtual bool supportsOffsets() const; + virtual File::Offset currentOffset(); 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: void *m_gzFile; + double m_endOffset; }; -namespace snappy { - class File; +inline bool +operator<(const File::Offset &one, const File::Offset &two) +{ + return one.chunk < two.chunk || + (one.chunk == two.chunk && one.offsetInChunk < two.offsetInChunk); } -#define SNAPPY_CHUNK_SIZE (1 * 1024 * 1024) -class SnappyFile : public File { -public: - SnappyFile(const std::string &filename = std::string(), - File::Mode mode = File::Read); - virtual ~SnappyFile(); +inline bool +operator==(const File::Offset &one, const File::Offset &two) +{ + return one.chunk == two.chunk && + one.offsetInChunk == two.offsetInChunk; +} -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 int rawGetc(); - virtual void rawClose(); - virtual void rawFlush(FlushType type); +inline bool +operator>=(const File::Offset &one, const File::Offset &two) +{ + return one.chunk > two.chunk || + (one.chunk == two.chunk && one.offsetInChunk >= two.offsetInChunk); +} -private: - inline int freeCacheSize() const - { - if (m_cacheSize > 0) - return m_cacheSize - (m_cachePtr - m_cache); - else - return 0; - } - void flushCache(); - void createCache(size_t size); -private: - std::fstream m_stream; - char *m_cache; - char *m_cachePtr; - size_t m_cacheSize; +inline bool +operator>(const File::Offset &one, const File::Offset &two) +{ + return two < one; +} - char *m_compressedCache; -}; +inline bool +operator<=(const File::Offset &one, const File::Offset &two) +{ + return two >= one; +} }