blob: 4d7dde04e1e8ce5aab2fd7a390fd1d5ec01c66d2 [file] [log] [blame]
apatrick@chromium.org8963ec22012-07-09 22:34:06 +00001//
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
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000012#include "common/angleutils.h"
Jamie Madill1b2a8f92014-05-14 13:09:39 -040013#include "common/mathutil.h"
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000014
Geoff Lang0b7eef72014-06-12 14:10:47 -040015#include <cstddef>
16#include <string>
17#include <vector>
18
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000019namespace gl
20{
21
22class BinaryInputStream
23{
24 public:
25 BinaryInputStream(const void *data, size_t length)
26 {
27 mError = false;
28 mOffset = 0;
29 mData = static_cast<const char*>(data);
30 mLength = length;
31 }
32
Jamie Madill1b2a8f92014-05-14 13:09:39 -040033 // readInt will generate an error for bool types
34 template <class IntT>
35 IntT readInt()
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000036 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -040037 int value;
38 read(&value);
39 return static_cast<IntT>(value);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000040 }
41
Jamie Madill1b2a8f92014-05-14 13:09:39 -040042 template <class IntT>
43 void readInt(IntT *outValue)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000044 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -040045 *outValue = readInt<IntT>();
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000046 }
47
Jamie Madill1b2a8f92014-05-14 13:09:39 -040048 bool readBool()
49 {
50 int value;
51 read(&value);
52 return (value > 0);
53 }
54
55 void readBool(bool *outValue)
56 {
57 *outValue = readBool();
58 }
59
60 void readBytes(unsigned char outArray[], size_t count)
61 {
62 read<unsigned char>(outArray, count);
63 }
64
65 std::string readString()
66 {
67 std::string outString;
68 readString(&outString);
69 return outString;
70 }
71
72 void readString(std::string *v)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000073 {
74 size_t length;
Jamie Madill1b2a8f92014-05-14 13:09:39 -040075 readInt(&length);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000076
77 if (mError)
78 {
79 return;
80 }
81
82 if (mOffset + length > mLength)
83 {
84 mError = true;
85 return;
86 }
87
88 v->assign(mData + mOffset, length);
89 mOffset += length;
90 }
91
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000092 void skip(size_t length)
93 {
94 if (mOffset + length > mLength)
95 {
96 mError = true;
97 return;
98 }
99
100 mOffset += length;
101 }
102
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000103 size_t offset() const
104 {
105 return mOffset;
106 }
107
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000108 bool error() const
109 {
110 return mError;
111 }
112
113 bool endOfStream() const
114 {
115 return mOffset == mLength;
116 }
117
118 private:
119 DISALLOW_COPY_AND_ASSIGN(BinaryInputStream);
120 bool mError;
121 size_t mOffset;
122 const char *mData;
123 size_t mLength;
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400124
125 template <typename T>
126 void read(T *v, size_t num)
127 {
128 META_ASSERT(std::is_fundamental<T>::value);
129
130 size_t length = num * sizeof(T);
131
132 if (mOffset + length > mLength)
133 {
134 mError = true;
135 return;
136 }
137
138 memcpy(v, mData + mOffset, length);
139 mOffset += length;
140 }
141
142 template <typename T>
143 void read(T *v)
144 {
145 read(v, 1);
146 }
147
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000148};
149
150class BinaryOutputStream
151{
152 public:
153 BinaryOutputStream()
154 {
155 }
156
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400157 // writeInt also handles bool types
158 template <class IntT>
159 void writeInt(IntT param)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000160 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400161 ASSERT(rx::IsIntegerCastSafe<int>(param));
162 int intValue = static_cast<int>(param);
163 write(&intValue, 1);
Geoff Lang11c3b302014-05-13 22:33:31 +0000164 }
165
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400166 void writeString(const std::string &v)
Geoff Lang11c3b302014-05-13 22:33:31 +0000167 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400168 writeInt(v.length());
169 write(v.c_str(), v.length());
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000170 }
171
Ehsan Akhgariaa7e1662014-07-05 21:13:11 -0400172 void writeBytes(const unsigned char *bytes, size_t count)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000173 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400174 write(bytes, count);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000175 }
176
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000177 size_t length() const
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000178 {
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000179 return mData.size();
180 }
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000181
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000182 const void* data() const
183 {
184 return mData.size() ? &mData[0] : NULL;
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000185 }
186
187 private:
188 DISALLOW_COPY_AND_ASSIGN(BinaryOutputStream);
189 std::vector<char> mData;
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400190
191 template <typename T>
192 void write(const T *v, size_t num)
193 {
194 META_ASSERT(std::is_fundamental<T>::value);
195 const char *asBytes = reinterpret_cast<const char*>(v);
196 mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T));
197 }
198
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000199};
200}
201
202#endif // LIBGLESV2_BINARYSTREAM_H_