Files
kaizen/lib/source/gainput/dev/GainputStream.h
Simone 4e42229bdd Squashed 'external/gainput/' content from commit 2be0a50
git-subtree-dir: external/gainput
git-subtree-split: 2be0a50089eafcc6fccb66142180082e48f27f4c
2024-01-22 08:51:55 +01:00

146 lines
2.5 KiB
C++

#ifndef GAINPUTSTREAM_H_
#define GAINPUTSTREAM_H_
#if defined(GAINPUT_PLATFORM_LINUX) || defined(GAINPUT_PLATFORM_ANDROID)
#include <arpa/inet.h>
#include <stdint.h>
#elif defined(GAINPUT_PLATFORM_WIN)
#include <Winsock2.h>
typedef unsigned __int16 uint16_t;
typedef __int16 int16_t;
typedef unsigned __int32 uint32_t;
typedef __int32 int32_t;
#endif
namespace gainput {
class Stream
{
public:
virtual ~Stream() { }
virtual size_t Read(void* dest, size_t length) = 0;
virtual size_t Write(const void* src, size_t length) = 0;
virtual size_t GetSize() const = 0;
virtual size_t GetLeft() const = 0;
virtual bool SeekBegin(int offset) = 0;
virtual bool SeekCurrent(int offset) = 0;
virtual bool SeekEnd(int offset) = 0;
virtual void Reset() = 0;
virtual bool IsEof() const = 0;
template<class T> size_t Read(T& dest) { return Read(&dest, sizeof(T)); }
template<class T> size_t Write(const T& src) { return Write(&src, sizeof(T)); }
};
template<>
inline
size_t
Stream::Read(uint16_t& dest)
{
const size_t result = Read(&dest, sizeof(dest));
dest = ntohs(dest);
return result;
}
template<>
inline
size_t
Stream::Read(int16_t& dest)
{
const size_t result = Read(&dest, sizeof(dest));
dest = ntohs((uint16_t)dest);
return result;
}
template<>
inline
size_t
Stream::Read(uint32_t& dest)
{
const size_t result = Read(&dest, sizeof(dest));
dest = ntohl(dest);
return result;
}
template<>
inline
size_t
Stream::Read(int32_t& dest)
{
const size_t result = Read(&dest, sizeof(dest));
dest = ntohl((uint32_t)dest);
return result;
}
template<>
inline
size_t
Stream::Read(float& dest)
{
const size_t result = Read(&dest, sizeof(dest));
const uint32_t tmpInt = ntohl(*(uint32_t*)&dest);
const float* tmpFloatP = (float*)&tmpInt;
dest = *tmpFloatP;
return result;
}
template<>
inline
size_t
Stream::Write(const uint16_t& src)
{
const uint16_t tmp = htons(src);
return Write(&tmp, sizeof(tmp));
}
template<>
inline
size_t
Stream::Write(const int16_t& src)
{
const int16_t tmp = htons((uint16_t)src);
return Write(&tmp, sizeof(tmp));
}
template<>
inline
size_t
Stream::Write(const uint32_t& src)
{
const uint32_t tmp = htonl(src);
return Write(&tmp, sizeof(tmp));
}
template<>
inline
size_t
Stream::Write(const int32_t& src)
{
const int32_t tmp = htonl((uint32_t)src);
return Write(&tmp, sizeof(tmp));
}
template<>
inline
size_t
Stream::Write(const float& src)
{
const uint32_t tmpInt = htonl(*(uint32_t*)&src);
const float* tmpFloatP = (float*)&tmpInt;
const float tmp = *tmpFloatP;
return Write(&tmp, sizeof(tmp));
}
}
#endif