// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
#pragma once
#include "Engine/Core/Collections/Array.h"
#include "Stream.h"
struct CommonValue;
struct Variant;
struct VariantType;
///
/// Base class for all data read streams
///
class FLAXENGINE_API ReadStream : public Stream
{
public:
///
/// Virtual destructor
///
virtual ~ReadStream()
{
}
public:
///
/// Reads bytes from the stream
///
/// Data to read
/// Amount of bytes to read
virtual void ReadBytes(void* data, uint32 bytes) = 0;
public:
template
FORCE_INLINE void Read(T* data)
{
ReadBytes((void*)data, sizeof(T));
}
template
FORCE_INLINE void Read(T* data, int32 count)
{
ReadBytes((void*)data, sizeof(T) * count);
}
public:
// Reads byte from the stream
// @returns Single byte
byte ReadByte()
{
byte data;
ReadBytes(&data, 1);
return data;
}
// Reads bool from the stream
bool ReadBool()
{
byte data;
ReadBytes(&data, 1);
return data != 0;
}
// Reads char from the stream
// @param data Data to read
char ReadChar()
{
char data;
ReadBytes(&data, 1);
return data;
}
FORCE_INLINE void ReadByte(byte* data)
{
Read(data);
}
// Reads Char from the stream
// @param data Data to read
FORCE_INLINE void ReadChar(Char* data)
{
Read(data);
}
// Reads uint8 from the stream
// @param data Data to read
FORCE_INLINE void ReadUint8(uint8* data)
{
Read(data);
}
// Reads int8 from the stream
// @param data Data to read
FORCE_INLINE void ReadInt8(int8* data)
{
Read(data);
}
// Reads uint16 from the stream
// @param data Data to read
FORCE_INLINE void ReadUint16(uint16* data)
{
Read(data);
}
// Reads int16 from the stream
// @param data Data to read
FORCE_INLINE void ReadInt16(int16* data)
{
Read(data);
}
// Reads uint32 from the stream
// @param data Data to read
FORCE_INLINE void ReadUint32(uint32* data)
{
Read(data);
}
// Reads int32 from the stream
// @param data Data to read
FORCE_INLINE void ReadInt32(int32* data)
{
Read(data);
}
// Reads uint64 from the stream
// @param data Data to read
FORCE_INLINE void ReadUint64(uint64* data)
{
Read(data);
}
// Reads int64 from the stream
// @param data Data to read
FORCE_INLINE void ReadInt64(int64* data)
{
Read(data);
}
// Reads float from the stream
// @param data Data to read
FORCE_INLINE void ReadFloat(float* data)
{
Read(data);
}
// Reads double from the stream
// @param data Data to read
FORCE_INLINE void ReadDouble(double* data)
{
Read(data);
}
public:
// Reads StringAnsi from the stream
// @param data Data to read
void ReadStringAnsi(StringAnsi* data);
// Reads StringAnsi from the stream with a key
// @param data Data to read
void ReadStringAnsi(StringAnsi* data, int8 lock);
// Reads String from the stream
// @param data Data to read
void ReadString(String* data);
// Reads String from the stream
// @param data Data to read
// @param lock Characters pass in the stream
void ReadString(String* data, int16 lock);
public:
// Reads CommonValue from the stream
// @param data Data to read
void ReadCommonValue(CommonValue* data);
// Reads VariantType from the stream
// @param data Data to read
void ReadVariantType(VariantType* data);
// Reads Variant from the stream
// @param data Data to read
void ReadVariant(Variant* data);
///
/// Read data array
///
/// Array to read
template
void ReadArray(Array* data)
{
int32 size;
ReadInt32(&size);
data->Resize(size, false);
if (size > 0)
ReadBytes(data->Get(), size * sizeof(T));
}
public:
// [Stream]
bool CanRead() override
{
return GetPosition() != GetLength();
}
};