corda/src/stream.h

87 lines
1.4 KiB
C
Raw Normal View History

2007-06-16 01:02:24 +00:00
#ifndef STREAM_H
#define STREAM_H
#include "common.h"
namespace vm {
2007-06-16 01:02:24 +00:00
class Stream {
public:
class Client {
public:
virtual ~Client() { }
virtual void NO_RETURN handleError() = 0;
2007-06-16 01:02:24 +00:00
};
Stream(Client* client, const uint8_t* data, unsigned size):
client(client), data(data), size(size), position_(0)
2007-06-16 01:02:24 +00:00
{ }
unsigned position() {
return position_;
}
void setPosition(unsigned p) {
position_ = p;
}
2007-06-16 01:02:24 +00:00
void skip(unsigned size) {
if (size > this->size - position_) {
client->handleError();
2007-06-16 01:02:24 +00:00
} else {
position_ += size;
2007-06-16 01:02:24 +00:00
}
}
void read(uint8_t* data, unsigned size) {
if (size > this->size - position_) {
client->handleError();
2007-06-16 01:02:24 +00:00
} else {
memcpy(data, this->data + position_, size);
position_ += size;
2007-06-16 01:02:24 +00:00
}
}
uint8_t read1() {
uint8_t v;
read(&v, 1);
return v;
}
uint16_t read2() {
uint16_t a = read1();
uint16_t b = read1();
return (a << 8) | b;
}
uint32_t read4() {
uint32_t a = read2();
uint32_t b = read2();
return (a << 16) | b;
}
uint64_t read8() {
uint64_t a = read4();
uint64_t b = read4();
return (a << 32) | b;
}
uint32_t readFloat() {
2007-08-13 14:06:31 +00:00
return read4();
2007-06-16 01:02:24 +00:00
}
uint64_t readDouble() {
2007-08-13 14:06:31 +00:00
return read8();
2007-06-16 01:02:24 +00:00
}
private:
Client* client;
const uint8_t* data;
unsigned size;
unsigned position_;
2007-06-16 01:02:24 +00:00
};
} // namespace vm
2007-06-16 01:02:24 +00:00
#endif//STREAM_H