DataReader.h 1.2 KB

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