1/*
2 * Copyright 2013, Gerasim Troeglazov, 3dEyes@gmail.com. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6#include "DataArray.h"
7
8
9BDataArray::BDataArray(int32 blockSize)
10{
11	fBlockSize = blockSize;
12	fData = (uint8*)malloc(blockSize);
13	fAllocatedDataSize = blockSize;
14	fDataSize = 0;
15}
16
17
18BDataArray::~BDataArray()
19{
20	free(fData);
21}
22
23
24status_t
25BDataArray::_ReallocArrayFor(int32 size)
26{
27	if (fDataSize + size > fAllocatedDataSize) {
28		int32 blocks = ((fDataSize + size) / fBlockSize) + 1;
29		uint8 *newData = (uint8*)realloc(fData, blocks * fBlockSize);
30		if (newData != NULL) {
31			fData = newData;
32			fAllocatedDataSize = blocks * fBlockSize;
33		}
34	}
35	return fData == NULL ? B_NO_MEMORY : B_OK;
36}
37
38
39uint8*
40BDataArray::Buffer(void)
41{
42	return fData;
43}
44
45
46int32
47BDataArray::Length(void)
48{
49	return fDataSize;
50}
51
52
53ssize_t
54BDataArray::WriteToStream(BPositionIO *stream)
55{
56	return stream->Write(fData, fDataSize);
57}
58
59
60BDataArray&
61BDataArray::Append(uint8 val)
62{
63	status_t status = _ReallocArrayFor(sizeof(val));
64	if (status == B_OK) {
65		fData[fDataSize] = val;
66		fDataSize++;
67	}
68	return *this;
69}
70
71
72BDataArray&
73BDataArray::Append(int8 val)
74{
75	return Append((uint8)val);
76}
77
78
79BDataArray&
80BDataArray::Append(uint16 val)
81{
82	status_t status = _ReallocArrayFor(sizeof(val));
83	if (status == B_OK) {
84		val = B_HOST_TO_BENDIAN_INT16(val);
85		memcpy(fData + fDataSize, &val, sizeof(val));
86		fDataSize += sizeof(val);
87	}
88	return *this;
89}
90
91
92BDataArray&
93BDataArray::Append(int16 val)
94{
95	return Append((uint16)val);
96}
97
98
99BDataArray&
100BDataArray::Append(uint32 val)
101{
102	status_t status = _ReallocArrayFor(sizeof(val));
103	if (status == B_OK) {
104		val = B_HOST_TO_BENDIAN_INT32(val);
105		memcpy(fData + fDataSize, &val, sizeof(val));
106		fDataSize += sizeof(val);
107	}
108	return *this;
109}
110
111
112BDataArray&
113BDataArray::Append(int64 val)
114{
115	return Append((uint64)val);
116}
117
118
119BDataArray&
120BDataArray::Append(uint64 val)
121{
122	status_t status = _ReallocArrayFor(sizeof(val));
123	if (status == B_OK) {
124		val = B_HOST_TO_BENDIAN_INT64(val);
125		memcpy(fData + fDataSize, &val, sizeof(val));
126		fDataSize += sizeof(val);
127	}
128	return *this;
129}
130
131
132BDataArray&
133BDataArray::Append(int32 val)
134{
135	return Append((uint32)val);
136}
137
138BDataArray&
139BDataArray::Append(const char *str)
140{
141	int32 len = strlen(str);
142	status_t status = _ReallocArrayFor(len);
143	if (status == B_OK) {
144		memcpy(fData + fDataSize, str, len);
145		fDataSize += len;
146	}
147	return *this;
148}
149
150
151BDataArray&
152BDataArray::Append(BString& str)
153{
154	return Append(str.String());
155}
156
157
158BDataArray&
159BDataArray::Append(BDataArray& array)
160{
161	return Append(array.Buffer(), array.Length());
162}
163
164
165BDataArray&
166BDataArray::Append(uint8 *ptr, int32 len)
167{
168	status_t status = _ReallocArrayFor(len);
169	if (status == B_OK) {
170		memcpy(fData + fDataSize, ptr, len);
171		fDataSize += len;
172	}
173	return *this;
174}
175
176
177BDataArray&
178BDataArray::Repeat(uint8 byte, int32 count)
179{
180	status_t status = _ReallocArrayFor(count);
181	if (status == B_OK) {
182		memset(fData + fDataSize, byte, count);
183		fDataSize += count;
184	}
185	return *this;
186}
187
188
189BDataArray&
190BDataArray::operator<<(int8 val)
191{
192	Append(val);
193	return *this;
194}
195
196
197BDataArray&
198BDataArray::operator<<(uint8 val)
199{
200	Append(val);
201	return *this;
202}
203
204
205BDataArray&
206BDataArray::operator<<(int16 val)
207{
208	Append(val);
209	return *this;
210}
211
212
213BDataArray&
214BDataArray::operator<<(uint16 val)
215{
216	Append(val);
217	return *this;
218}
219
220
221BDataArray&
222BDataArray::operator<<(int32 val)
223{
224	Append(val);
225	return *this;
226}
227
228
229BDataArray&
230BDataArray::operator<<(uint32 val)
231{
232	Append(val);
233	return *this;
234}
235
236
237BDataArray&
238BDataArray::operator<<(int64 val)
239{
240	Append(val);
241	return *this;
242}
243
244
245BDataArray&
246BDataArray::operator<<(uint64 val)
247{
248	Append(val);
249	return *this;
250}
251
252
253BDataArray&
254BDataArray::operator<<(const char* str)
255{
256	Append(str);
257	return *this;
258}
259
260
261BDataArray&
262BDataArray::operator<<(BDataArray& array)
263{
264	Append(array);
265	return *this;
266}
267