mirror of
https://github.com/PrimeDecomp/prime.git
synced 2025-12-16 06:57:01 +00:00
71
include/Kyoto/Streams/CInputStream.hpp
Normal file
71
include/Kyoto/Streams/CInputStream.hpp
Normal file
@@ -0,0 +1,71 @@
|
||||
#ifndef _CINPUTSTREAM_HPP
|
||||
#define _CINPUTSTREAM_HPP
|
||||
|
||||
#include "types.h"
|
||||
|
||||
class CInputStream;
|
||||
template < typename T >
|
||||
struct TType {};
|
||||
template < typename T >
|
||||
inline T cinput_stream_helper(TType< T > type, CInputStream& in);
|
||||
|
||||
class CInputStream {
|
||||
public:
|
||||
CInputStream(size_t len);
|
||||
CInputStream(const void* ptr, size_t len, bool owned);
|
||||
virtual ~CInputStream();
|
||||
virtual u32 Read(void* dest, u32 len) = 0;
|
||||
|
||||
f32 ReadFloat();
|
||||
u64 ReadLongLong();
|
||||
u32 ReadLong();
|
||||
u16 ReadShort();
|
||||
bool ReadBool();
|
||||
u8 ReadChar();
|
||||
u32 ReadBits(u32 len);
|
||||
u32 ReadBytes(void* dest, unsigned long len);
|
||||
void Get(void* dest, unsigned long len);
|
||||
|
||||
template < typename T >
|
||||
inline T Get() {
|
||||
return cinput_stream_helper(TType< T >(), *this);
|
||||
}
|
||||
|
||||
private:
|
||||
bool GrabAnotherBlock();
|
||||
bool InternalReadNext();
|
||||
|
||||
u32 x4_blockOffset;
|
||||
u32 x8_blockLen;
|
||||
u32 xc_len;
|
||||
u8* x10_ptr;
|
||||
bool x14_owned;
|
||||
u32 x18_readPosition;
|
||||
u32 x1c_bitWord;
|
||||
u32 x20_bitOffset;
|
||||
};
|
||||
|
||||
template <>
|
||||
inline s32 cinput_stream_helper(TType< s32 > type, CInputStream& in) {
|
||||
return in.ReadLong();
|
||||
}
|
||||
template <>
|
||||
inline u32 cinput_stream_helper(TType< u32 > type, CInputStream& in) {
|
||||
return in.ReadLong();
|
||||
}
|
||||
template <>
|
||||
inline unsigned long cinput_stream_helper(TType< unsigned long > type, CInputStream& in) {
|
||||
return in.ReadLong();
|
||||
}
|
||||
|
||||
// rstl
|
||||
#include "rstl/pair.hpp"
|
||||
template < typename L, typename R >
|
||||
inline rstl::pair< L, R > cinput_stream_helper(TType< rstl::pair< L, R > > type, CInputStream& in) {
|
||||
rstl::pair< L, R > result;
|
||||
result.first = in.Get< L >();
|
||||
result.second = in.Get< R >();
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user