1 // Copyright 2008 Dolphin Emulator Project 2 // Licensed under GPLv2+ 3 // Refer to the license.txt file included. 4 5 #pragma once 6 7 #include <cstring> 8 9 #include "Common/CommonTypes.h" 10 #include "Common/Inline.h" 11 #include "Common/Swap.h" 12 13 class DataReader 14 { 15 public: 16 DataReader() = default; DataReader(u8 * src,u8 * end_)17 DataReader(u8* src, u8* end_) : buffer(src), end(end_) {} GetPointer()18 u8* GetPointer() { return buffer; } GetPointer()19 const u8* GetPointer() const { return buffer; } 20 DataReader& operator=(u8* src) 21 { 22 buffer = src; 23 return *this; 24 } 25 size()26 size_t size() const { return end - buffer; } 27 template <typename T, bool swapped = true> 28 DOLPHIN_FORCE_INLINE T Peek(int offset = 0) const 29 { 30 T data; 31 std::memcpy(&data, &buffer[offset], sizeof(T)); 32 33 if (swapped) 34 data = Common::FromBigEndian(data); 35 36 return data; 37 } 38 39 template <typename T, bool swapped = true> Read()40 DOLPHIN_FORCE_INLINE T Read() 41 { 42 const T result = Peek<T, swapped>(); 43 buffer += sizeof(T); 44 return result; 45 } 46 47 template <typename T, bool swapped = false> Write(T data)48 DOLPHIN_FORCE_INLINE void Write(T data) 49 { 50 if (swapped) 51 data = Common::FromBigEndian(data); 52 53 std::memcpy(buffer, &data, sizeof(T)); 54 buffer += sizeof(T); 55 } 56 57 template <typename T = u8> 58 void Skip(size_t data = 1) 59 { 60 buffer += sizeof(T) * data; 61 } 62 63 private: 64 u8* __restrict buffer = nullptr; 65 u8* end = nullptr; 66 }; 67