]> git.cworth.org Git - apitrace/blob - common/trace_file.hpp
os: Fix thread copy constructor.
[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     static File *createForRead(const char *filename);
57     static File *createForWrite(const char *filename);
58 public:
59     File(const std::string &filename = std::string(),
60          File::Mode mode = File::Read);
61     virtual ~File();
62
63     bool isOpened() const;
64     File::Mode mode() const;
65
66     bool open(const std::string &filename, File::Mode mode);
67     bool write(const void *buffer, size_t length);
68     size_t read(void *buffer, size_t length);
69     void close();
70     void flush(void);
71     int getc();
72     bool skip(size_t length);
73     int percentRead();
74
75     virtual bool supportsOffsets() const = 0;
76     virtual File::Offset currentOffset() = 0;
77     virtual void setCurrentOffset(const File::Offset &offset);
78 protected:
79     virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0;
80     virtual bool rawWrite(const void *buffer, size_t length) = 0;
81     virtual size_t rawRead(void *buffer, size_t length) = 0;
82     virtual int rawGetc() = 0;
83     virtual void rawClose() = 0;
84     virtual void rawFlush() = 0;
85     virtual bool rawSkip(size_t length) = 0;
86     virtual int rawPercentRead() = 0;
87
88 protected:
89     File::Mode m_mode;
90     bool m_isOpened;
91 };
92
93 inline bool File::isOpened() const
94 {
95     return m_isOpened;
96 }
97
98 inline File::Mode File::mode() const
99 {
100     return m_mode;
101 }
102
103 inline bool File::open(const std::string &filename, File::Mode mode)
104 {
105     if (m_isOpened) {
106         close();
107     }
108     m_isOpened = rawOpen(filename, mode);
109     m_mode = mode;
110
111     return m_isOpened;
112 }
113
114 inline bool File::write(const void *buffer, size_t length)
115 {
116     if (!m_isOpened || m_mode != File::Write) {
117         return false;
118     }
119     return rawWrite(buffer, length);
120 }
121
122 inline size_t File::read(void *buffer, size_t length)
123 {
124     if (!m_isOpened || m_mode != File::Read) {
125         return 0;
126     }
127     return rawRead(buffer, length);
128 }
129
130 inline int File::percentRead()
131 {
132     if (!m_isOpened || m_mode != File::Read) {
133         return 0;
134     }
135     return rawPercentRead();
136 }
137
138 inline void File::close()
139 {
140     if (m_isOpened) {
141         rawClose();
142         m_isOpened = false;
143     }
144 }
145
146 inline void File::flush(void)
147 {
148     if (m_mode == File::Write) {
149         rawFlush();
150     }
151 }
152
153 inline int File::getc()
154 {
155     if (!m_isOpened || m_mode != File::Read) {
156         return -1;
157     }
158     return rawGetc();
159 }
160
161 inline bool File::skip(size_t length)
162 {
163     if (!m_isOpened || m_mode != File::Read) {
164         return false;
165     }
166     return rawSkip(length);
167 }
168
169
170 inline bool
171 operator<(const File::Offset &one, const File::Offset &two)
172 {
173     return one.chunk < two.chunk ||
174             (one.chunk == two.chunk && one.offsetInChunk < two.offsetInChunk);
175 }
176
177 inline bool
178 operator==(const File::Offset &one, const File::Offset &two)
179 {
180     return one.chunk == two.chunk &&
181             one.offsetInChunk == two.offsetInChunk;
182 }
183
184 inline bool
185 operator>=(const File::Offset &one, const File::Offset &two)
186 {
187     return one.chunk > two.chunk ||
188             (one.chunk == two.chunk && one.offsetInChunk >= two.offsetInChunk);
189 }
190
191 inline bool
192 operator>(const File::Offset &one, const File::Offset &two)
193 {
194     return two < one;
195 }
196
197 inline bool
198 operator<=(const File::Offset &one, const File::Offset &two)
199 {
200     return two >= one;
201 }
202
203
204 }
205
206 #endif