import std.bitmanip;
abstract class Stream
{
abstract ubyte[] readBytes(size_t byteCount);
abstract void writeBytes(const ubyte[] data);
abstract void flush();
bool readBool()
{
return readBytes(1)[0] != 0;
}
int readInt()
{
return littleEndianToNative!(int)(readBytes(int.sizeof)[0 .. int.sizeof]);
}
long readLong()
{
return littleEndianToNative!(long)(readBytes(long.sizeof)[0 .. long.sizeof]);
}
float readFloat()
{
return littleEndianToNative!(float)(readBytes(float.sizeof)[0 .. float.sizeof]);
}
double readDouble()
{
return littleEndianToNative!(double)(readBytes(double.sizeof)[0 .. double.sizeof]);
}
string readString()
{
int length = readInt();
ubyte[] data = readBytes(cast(size_t)(length));
return cast(string)(data);
}
void write(bool value)
{
writeBytes(nativeToLittleEndian(value));
}
void write(int value)
{
writeBytes(nativeToLittleEndian(value));
}
void write(long value)
{
writeBytes(nativeToLittleEndian(value));
}
void write(float value)
{
writeBytes(nativeToLittleEndian(value));
}
void write(double value)
{
writeBytes(nativeToLittleEndian(value));
}
void write(string value)
{
ubyte[] data = cast(ubyte[])(value);
write(cast(int) data.length);
writeBytes(data);
}
}