|
1 // |
|
2 // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. |
|
3 // Use of this source code is governed by a BSD-style license that can be |
|
4 // found in the LICENSE file. |
|
5 // |
|
6 |
|
7 // BinaryStream.h: Provides binary serialization of simple types. |
|
8 |
|
9 #ifndef LIBGLESV2_BINARYSTREAM_H_ |
|
10 #define LIBGLESV2_BINARYSTREAM_H_ |
|
11 |
|
12 #include "common/angleutils.h" |
|
13 |
|
14 namespace gl |
|
15 { |
|
16 |
|
17 class BinaryInputStream |
|
18 { |
|
19 public: |
|
20 BinaryInputStream(const void *data, size_t length) |
|
21 { |
|
22 mError = false; |
|
23 mOffset = 0; |
|
24 mData = static_cast<const char*>(data); |
|
25 mLength = length; |
|
26 } |
|
27 |
|
28 template <typename T> |
|
29 void read(T *v, size_t num) |
|
30 { |
|
31 union |
|
32 { |
|
33 T dummy; // Compilation error for non-trivial types |
|
34 } dummy; |
|
35 (void) dummy; |
|
36 |
|
37 if (mError) |
|
38 { |
|
39 return; |
|
40 } |
|
41 |
|
42 size_t length = num * sizeof(T); |
|
43 |
|
44 if (mOffset + length > mLength) |
|
45 { |
|
46 mError = true; |
|
47 return; |
|
48 } |
|
49 |
|
50 memcpy(v, mData + mOffset, length); |
|
51 mOffset += length; |
|
52 } |
|
53 |
|
54 template <typename T> |
|
55 void read(T * v) |
|
56 { |
|
57 read(v, 1); |
|
58 } |
|
59 |
|
60 void read(std::string *v) |
|
61 { |
|
62 size_t length; |
|
63 read(&length); |
|
64 |
|
65 if (mError) |
|
66 { |
|
67 return; |
|
68 } |
|
69 |
|
70 if (mOffset + length > mLength) |
|
71 { |
|
72 mError = true; |
|
73 return; |
|
74 } |
|
75 |
|
76 v->assign(mData + mOffset, length); |
|
77 mOffset += length; |
|
78 } |
|
79 |
|
80 void skip(size_t length) |
|
81 { |
|
82 if (mOffset + length > mLength) |
|
83 { |
|
84 mError = true; |
|
85 return; |
|
86 } |
|
87 |
|
88 mOffset += length; |
|
89 } |
|
90 |
|
91 size_t offset() const |
|
92 { |
|
93 return mOffset; |
|
94 } |
|
95 |
|
96 bool error() const |
|
97 { |
|
98 return mError; |
|
99 } |
|
100 |
|
101 bool endOfStream() const |
|
102 { |
|
103 return mOffset == mLength; |
|
104 } |
|
105 |
|
106 private: |
|
107 DISALLOW_COPY_AND_ASSIGN(BinaryInputStream); |
|
108 bool mError; |
|
109 size_t mOffset; |
|
110 const char *mData; |
|
111 size_t mLength; |
|
112 }; |
|
113 |
|
114 class BinaryOutputStream |
|
115 { |
|
116 public: |
|
117 BinaryOutputStream() |
|
118 { |
|
119 } |
|
120 |
|
121 template <typename T> |
|
122 void write(const T *v, size_t num) |
|
123 { |
|
124 union |
|
125 { |
|
126 T dummy; // Compilation error for non-trivial types |
|
127 } dummy; |
|
128 (void) dummy; |
|
129 |
|
130 const char *asBytes = reinterpret_cast<const char*>(v); |
|
131 mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T)); |
|
132 } |
|
133 |
|
134 template <typename T> |
|
135 void write(const T &v) |
|
136 { |
|
137 write(&v, 1); |
|
138 } |
|
139 |
|
140 void write(const std::string &v) |
|
141 { |
|
142 size_t length = v.length(); |
|
143 write(length); |
|
144 |
|
145 write(v.c_str(), length); |
|
146 } |
|
147 |
|
148 size_t length() const |
|
149 { |
|
150 return mData.size(); |
|
151 } |
|
152 |
|
153 const void* data() const |
|
154 { |
|
155 return mData.size() ? &mData[0] : NULL; |
|
156 } |
|
157 |
|
158 private: |
|
159 DISALLOW_COPY_AND_ASSIGN(BinaryOutputStream); |
|
160 std::vector<char> mData; |
|
161 }; |
|
162 } |
|
163 |
|
164 #endif // LIBGLESV2_BINARYSTREAM_H_ |