ByteStream.h
-
#pragma once
-
#include "Define.h"
-
class ByteStream
-
{
-
public:
-
ByteStream(uint32_t reserveSize);
-
~ByteStream();
-
void writeUInt32(uint32_t value);
-
void writeInt32(int32_t value);
-
void writeUInt16(uint16_t value);
-
void writeInt16(int16_t value);
-
void writeUInt8(uint8_t value);
-
void writeInt8(int8_t value);
-
void writeBytes(const char* value, uint32_t size);
-
uint32_t readUInt32(uint32_t pos) const;
-
int32_t readInt32(int32_t pos) const;
-
uint16_t readUInt16(uint32_t pos) const;
-
int16_t readInt16(int32_t pos) const;
-
uint8_t readUInt8(uint32_t pos) const;
-
int8_t readInt8(int32_t pos) const;
-
char* getBuffer(uint32_t pos = 0);
-
void readBytes(char* dest, uint32_t destSize, uint32_t pos) const;
-
void useSize(uint32_t size);
-
uint32_t size() const;
-
uint32_t reserveSize() const;
-
void remove(uint32_t size);
-
void clear();
-
private:
-
template<typename T>
-
void writeValue(T value);
-
template<typename T>
-
T readValue(uint32_t pos) const;
-
void extend(uint32_t newSize);
-
bool bufferEnough(uint32_t size) const;
-
private:
-
char* buffer;
-
uint32_t bufferSize;
-
uint32_t usedSize;
-
};
ByteStream.cpp
-
#include "ByteStream.h"
-
#include <memory>
-
#include <algorithm>
-
#include <assert.h>
-
ByteStream::ByteStream(uint32_t reserveSize)
-
{
-
usedSize = 0;
-
bufferSize = reserveSize;
-
if (bufferSize != 0)
-
{
-
buffer = new char[reserveSize];
-
memset(buffer, 0, sizeof(buffer));
-
}
-
else
-
{
-
buffer = NULL;
-
}
-
}
-
ByteStream::~ByteStream()
-
{
-
delete[] buffer;
-
buffer = NULL;
-
}
-
void ByteStream::writeUInt32(uint32_t value)
-
{
-
writeValue<uint32_t>(value);
-
}
-
void ByteStream::writeInt32(int32_t value)
-
{
-
writeValue<int32_t>(value);
-
}
-
void ByteStream::writeUInt16(uint16_t value)
-
{
-
writeValue<uint16_t>(value);
-
}
-
void ByteStream::writeInt16(int16_t value)
-
{
-
writeValue<int16_t>(value);
-
}
-
void ByteStream::writeUInt8(uint8_t value)
-
{
-
writeValue<uint8_t>(value);
-
}
-
void ByteStream::writeInt8(int8_t value)
-
{
-
writeValue<int8_t>(value);
-
}
-
uint32_t ByteStream::readUInt32(uint32_t pos) const
-
{
-
return readValue<uint32_t>(pos);
-
}
-
int32_t ByteStream::readInt32(int32_t pos) const
-
{
-
return readValue<int32_t>(pos);
-
}
-
uint16_t ByteStream::readUInt16(uint32_t pos) const
-
{
-
return readValue<uint16_t>(pos);
-
}
-
int16_t ByteStream::readInt16(int32_t pos) const
-
{
-
return readValue<int16_t>(pos);
-
}
-
uint8_t ByteStream::readUInt8(uint32_t pos) const
-
{
-
return readValue<uint8_t>(pos);
-
}
-
int8_t ByteStream::readInt8(int32_t pos) const
-
{
-
return readValue<int8_t>(pos);
-
}
-
template<typename T>
-
void ByteStream::writeValue(T value)
-
{
-
if (!bufferEnough(sizeof(T)))
-
{
-
extend(bufferSize + sizeof(T) + bufferSize / 2);
-
}
-
T* buff = (T*)(buffer + usedSize);
-
*buff = value;
-
usedSize += sizeof(T);
-
}
-
template<typename T>
-
T ByteStream::readValue(uint32_t pos) const
-
{
-
ASSERT_T(usedSize > pos);
-
return *((T*)(buffer + pos));
-
}
-
void ByteStream::writeBytes(const char* value, uint32_t size)
-
{
-
if (!bufferEnough(size))
-
{
-
extend(bufferSize + size + bufferSize / 2);
-
}
-
memcpy_s(buffer + usedSize, size, value, size);
-
usedSize += size;
-
}
-
char* ByteStream::getBuffer(uint32_t pos/* = 0*/)
-
{
-
return buffer + pos;
-
}
-
void ByteStream::readBytes(char* dest, uint32_t destSize, uint32_t pos) const
-
{
-
memcpy_s(dest, destSize, buffer + pos, destSize);
-
}
-
void ByteStream::extend(uint32_t newSize)
-
{
-
if (newSize <= bufferSize)
-
return;
-
char* newBuffer = new char[newSize];
-
memcpy_s(newBuffer, newSize, buffer, usedSize);
-
delete[] buffer;
-
buffer = newBuffer;
-
bufferSize = newSize;
-
}
-
uint32_t ByteStream::size() const
-
{
-
return usedSize;
-
}
-
uint32_t ByteStream::reserveSize() const
-
{
-
return bufferSize;
-
}
-
void ByteStream::remove(uint32_t size)
-
{
-
if (usedSize < size)
-
return;
-
uint32_t remainSize = usedSize - size;
-
for (uint32_t i = 0; i < remainSize; ++i)
-
{
-
buffer[i] = buffer[i + size];
-
}
-
usedSize = remainSize;
-
}
-
bool ByteStream::bufferEnough(uint32_t size) const
-
{
-
return usedSize + size <= bufferSize;
-
}
-
void ByteStream::useSize(uint32_t size)
-
{
-
ASSERT_T(bufferEnough(size));
-
usedSize += size;
-
}
-
void ByteStream::clear()
-
{
-
usedSize = 0;
-
}
Define.h 有些不要的可以删除
-
#pragma once
-
#include <stdint.h>
-
#include <stdio.h>
-
#include <assert.h>
-
#include "uv.h"
-
#define FLAG 1010
-
#define VER 0
-
#define HEAD_SIZE 8
-
#define ASSERT_T(x) assert(x)
-
static const int KEEP_ALIVE_SEC = 10;