File: MemoryStream.cpp

package info (click to toggle)
storm-lang 0.7.4-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,004 kB
  • sloc: ansic: 261,462; cpp: 140,405; sh: 14,891; perl: 9,846; python: 2,525; lisp: 2,504; asm: 860; makefile: 678; pascal: 70; java: 52; xml: 37; awk: 12
file content (63 lines) | stat: -rw-r--r-- 1,137 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "stdafx.h"
#include "MemoryStream.h"

MemoryStream::MemoryStream() : data(null), size(0), capacity(0), p(0) {}

MemoryStream::MemoryStream(const byte *data, nat size) : size(size), capacity(size), p(0) {
	this->data = new byte[size];
	memcpy(this->data, data, size);
}

MemoryStream::~MemoryStream() {
	delete[] data;
}

Stream *MemoryStream::clone() const {
	return new MemoryStream(data, size);
}

void MemoryStream::write(nat count, const void *from) {
	ensure(p + count);

	memcpy(data + p, from, count);
	p += count;
	size = max(size, p);
}

nat MemoryStream::read(nat count, void *to) {
	count = min(count, size - p);

	memcpy(to, data + p, count);
	p += count;
	return count;
}

nat64 MemoryStream::pos() const {
	return p;
}

nat64 MemoryStream::length() const {
	return size;
}

void MemoryStream::seek(nat64 to) {
	p = nat(min(nat64(size), to));
}

bool MemoryStream::valid() const {
	return true;
}

void MemoryStream::ensure(nat n) {
	if (capacity >= n)
		return;

	capacity = max(128u, max(capacity*2, n));
	byte *old = data;
	data = new byte[capacity];

	if (old) {
		memcpy(data, old, size);
		delete []old;
	}
}