blob: 253c1ebc5aadd7673770b4824242e38973765b3f [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
15namespace gl
16{
17
18class BinaryInputStream
19{
20 public:
21 BinaryInputStream(const void *data, size_t length)
22 {
23 mError = false;
24 mOffset = 0;
25 mData = static_cast<const char*>(data);
26 mLength = length;
27 }
28
Jamie Madill1b2a8f92014-05-14 13:09:39 -040029 // readInt will generate an error for bool types
30 template <class IntT>
31 IntT readInt()
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000032 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -040033 int value;
34 read(&value);
35 return static_cast<IntT>(value);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000036 }
37
Jamie Madill1b2a8f92014-05-14 13:09:39 -040038 template <class IntT>
39 void readInt(IntT *outValue)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000040 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -040041 *outValue = readInt<IntT>();
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000042 }
43
Jamie Madill1b2a8f92014-05-14 13:09:39 -040044 bool readBool()
45 {
46 int value;
47 read(&value);
48 return (value > 0);
49 }
50
51 void readBool(bool *outValue)
52 {
53 *outValue = readBool();
54 }
55
56 void readBytes(unsigned char outArray[], size_t count)
57 {
58 read<unsigned char>(outArray, count);
59 }
60
61 std::string readString()
62 {
63 std::string outString;
64 readString(&outString);
65 return outString;
66 }
67
68 void readString(std::string *v)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000069 {
70 size_t length;
Jamie Madill1b2a8f92014-05-14 13:09:39 -040071 readInt(&length);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +000072
73 if (mError)
74 {
75 return;
76 }
77
78 if (mOffset + length > mLength)
79 {
80 mError = true;
81 return;
82 }
83
84 v->assign(mData + mOffset, length);
85 mOffset += length;
86 }
87
apatrick@chromium.org60dafe82012-09-05 22:26:10 +000088 void skip(size_t length)
89 {
90 if (mOffset + length > mLength)
91 {
92 mError = true;
93 return;
94 }
95
96 mOffset += length;
97 }
98
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +000099 size_t offset() const
100 {
101 return mOffset;
102 }
103
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000104 bool error() const
105 {
106 return mError;
107 }
108
109 bool endOfStream() const
110 {
111 return mOffset == mLength;
112 }
113
114 private:
115 DISALLOW_COPY_AND_ASSIGN(BinaryInputStream);
116 bool mError;
117 size_t mOffset;
118 const char *mData;
119 size_t mLength;
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400120
121 template <typename T>
122 void read(T *v, size_t num)
123 {
124 META_ASSERT(std::is_fundamental<T>::value);
125
126 size_t length = num * sizeof(T);
127
128 if (mOffset + length > mLength)
129 {
130 mError = true;
131 return;
132 }
133
134 memcpy(v, mData + mOffset, length);
135 mOffset += length;
136 }
137
138 template <typename T>
139 void read(T *v)
140 {
141 read(v, 1);
142 }
143
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000144};
145
146class BinaryOutputStream
147{
148 public:
149 BinaryOutputStream()
150 {
151 }
152
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400153 // writeInt also handles bool types
154 template <class IntT>
155 void writeInt(IntT param)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000156 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400157 ASSERT(rx::IsIntegerCastSafe<int>(param));
158 int intValue = static_cast<int>(param);
159 write(&intValue, 1);
Geoff Lang11c3b302014-05-13 22:33:31 +0000160 }
161
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400162 void writeString(const std::string &v)
Geoff Lang11c3b302014-05-13 22:33:31 +0000163 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400164 writeInt(v.length());
165 write(v.c_str(), v.length());
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000166 }
167
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400168 void writeBytes(unsigned char *bytes, size_t count)
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000169 {
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400170 write(bytes, count);
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000171 }
172
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000173 size_t length() const
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000174 {
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000175 return mData.size();
176 }
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000177
apatrick@chromium.org6f1796f2012-07-12 01:40:11 +0000178 const void* data() const
179 {
180 return mData.size() ? &mData[0] : NULL;
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000181 }
182
183 private:
184 DISALLOW_COPY_AND_ASSIGN(BinaryOutputStream);
185 std::vector<char> mData;
Jamie Madill1b2a8f92014-05-14 13:09:39 -0400186
187 template <typename T>
188 void write(const T *v, size_t num)
189 {
190 META_ASSERT(std::is_fundamental<T>::value);
191 const char *asBytes = reinterpret_cast<const char*>(v);
192 mData.insert(mData.end(), asBytes, asBytes + num * sizeof(T));
193 }
194
apatrick@chromium.org8963ec22012-07-09 22:34:06 +0000195};
196}
197
198#endif // LIBGLESV2_BINARYSTREAM_H_