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