]> git.cworth.org Git - apitrace/blob - common/trace_file.hpp
Re-organize the Trace::File code.
[apitrace] / common / trace_file.hpp
1 /**************************************************************************
2  *
3  * Copyright 2011 Zack Rusin
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 #ifndef TRACE_FILE_HPP
28 #define TRACE_FILE_HPP
29
30 #include <string>
31 #include <fstream>
32 #include <stdint.h>
33
34 namespace Trace {
35
36 class File {
37 public:
38     enum Mode {
39         Read,
40         Write
41     };
42     struct Offset {
43         Offset(uint64_t _chunk = 0, uint32_t _offsetInChunk = 0)
44             : chunk(_chunk),
45               offsetInChunk(_offsetInChunk)
46         {}
47         uint64_t chunk;
48         uint32_t offsetInChunk;
49     };
50
51 public:
52     static bool isZLibCompressed(const std::string &filename);
53     static bool isSnappyCompressed(const std::string &filename);
54     static File *createZLib(void);
55     static File *createSnappy(void);
56 public:
57     File(const std::string &filename = std::string(),
58          File::Mode mode = File::Read);
59     virtual ~File();
60
61     bool isOpened() const;
62     File::Mode mode() const;
63
64     bool open(const std::string &filename, File::Mode mode);
65     bool write(const void *buffer, size_t length);
66     bool read(void *buffer, size_t length);
67     void close();
68     void flush(void);
69     int getc();
70     bool skip(size_t length);
71     int percentRead();
72
73     virtual bool supportsOffsets() const = 0;
74     virtual File::Offset currentOffset() = 0;
75     virtual void setCurrentOffset(const File::Offset &offset);
76 protected:
77     virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0;
78     virtual bool rawWrite(const void *buffer, size_t length) = 0;
79     virtual bool rawRead(void *buffer, size_t length) = 0;
80     virtual int rawGetc() = 0;
81     virtual void rawClose() = 0;
82     virtual void rawFlush() = 0;
83     virtual bool rawSkip(size_t length) = 0;
84     virtual int rawPercentRead() = 0;
85
86 protected:
87     File::Mode m_mode;
88     bool m_isOpened;
89 };
90
91 inline bool File::isOpened() const
92 {
93     return m_isOpened;
94 }
95
96 inline File::Mode File::mode() const
97 {
98     return m_mode;
99 }
100
101 inline bool File::open(const std::string &filename, File::Mode mode)
102 {
103     if (m_isOpened) {
104         close();
105     }
106     m_isOpened = rawOpen(filename, mode);
107     m_mode = mode;
108
109     return m_isOpened;
110 }
111
112 inline bool File::write(const void *buffer, size_t length)
113 {
114     if (!m_isOpened || m_mode != File::Write) {
115         return false;
116     }
117     return rawWrite(buffer, length);
118 }
119
120 inline bool File::read(void *buffer, size_t length)
121 {
122     if (!m_isOpened || m_mode != File::Read) {
123         return false;
124     }
125     return rawRead(buffer, length);
126 }
127
128 inline int File::percentRead()
129 {
130     if (!m_isOpened || m_mode != File::Read) {
131         return 0;
132     }
133     return rawPercentRead();
134 }
135
136 inline void File::close()
137 {
138     if (m_isOpened) {
139         rawClose();
140         m_isOpened = false;
141     }
142 }
143
144 inline void File::flush(void)
145 {
146     if (m_mode == File::Write) {
147         rawFlush();
148     }
149 }
150
151 inline int File::getc()
152 {
153     if (!m_isOpened || m_mode != File::Read) {
154         return -1;
155     }
156     return rawGetc();
157 }
158
159 inline bool File::skip(size_t length)
160 {
161     if (!m_isOpened || m_mode != File::Read) {
162         return false;
163     }
164     return rawSkip(length);
165 }
166
167
168 inline bool
169 operator<(const File::Offset &one, const File::Offset &two)
170 {
171     return one.chunk < two.chunk ||
172             (one.chunk == two.chunk && one.offsetInChunk < two.offsetInChunk);
173 }
174
175 inline bool
176 operator==(const File::Offset &one, const File::Offset &two)
177 {
178     return one.chunk == two.chunk &&
179             one.offsetInChunk == two.offsetInChunk;
180 }
181
182 inline bool
183 operator>=(const File::Offset &one, const File::Offset &two)
184 {
185     return one.chunk > two.chunk ||
186             (one.chunk == two.chunk && one.offsetInChunk >= two.offsetInChunk);
187 }
188
189 inline bool
190 operator>(const File::Offset &one, const File::Offset &two)
191 {
192     return two < one;
193 }
194
195 inline bool
196 operator<=(const File::Offset &one, const File::Offset &two)
197 {
198     return two >= one;
199 }
200
201
202 }
203
204 #endif