readerwriter.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /*
  2. * Copyright 2010-2018 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_READERWRITER_H_HEADER_GUARD
  6. #define BX_READERWRITER_H_HEADER_GUARD
  7. #include "allocator.h"
  8. #include "endian.h"
  9. #include "error.h"
  10. #include "filepath.h"
  11. #include "string.h"
  12. #include "uint32_t.h"
  13. BX_ERROR_RESULT(BX_ERROR_READERWRITER_OPEN, BX_MAKEFOURCC('R', 'W', 0, 1) );
  14. BX_ERROR_RESULT(BX_ERROR_READERWRITER_READ, BX_MAKEFOURCC('R', 'W', 0, 2) );
  15. BX_ERROR_RESULT(BX_ERROR_READERWRITER_WRITE, BX_MAKEFOURCC('R', 'W', 0, 3) );
  16. BX_ERROR_RESULT(BX_ERROR_READERWRITER_EOF, BX_MAKEFOURCC('R', 'W', 0, 4) );
  17. BX_ERROR_RESULT(BX_ERROR_READERWRITER_ALREADY_OPEN, BX_MAKEFOURCC('R', 'W', 0, 5) );
  18. namespace bx
  19. {
  20. ///
  21. struct Whence
  22. {
  23. enum Enum
  24. {
  25. Begin,
  26. Current,
  27. End,
  28. };
  29. };
  30. ///
  31. struct BX_NO_VTABLE ReaderI
  32. {
  33. virtual ~ReaderI() = 0;
  34. virtual int32_t read(void* _data, int32_t _size, Error* _err) = 0;
  35. };
  36. ///
  37. struct BX_NO_VTABLE WriterI
  38. {
  39. virtual ~WriterI() = 0;
  40. virtual int32_t write(const void* _data, int32_t _size, Error* _err) = 0;
  41. };
  42. ///
  43. struct BX_NO_VTABLE SeekerI
  44. {
  45. virtual ~SeekerI() = 0;
  46. virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) = 0;
  47. };
  48. ///
  49. struct BX_NO_VTABLE ReaderSeekerI : public ReaderI, public SeekerI
  50. {
  51. };
  52. ///
  53. struct BX_NO_VTABLE WriterSeekerI : public WriterI, public SeekerI
  54. {
  55. };
  56. ///
  57. struct BX_NO_VTABLE ReaderOpenI
  58. {
  59. virtual ~ReaderOpenI() = 0;
  60. virtual bool open(const FilePath& _filePath, Error* _err) = 0;
  61. };
  62. ///
  63. struct BX_NO_VTABLE WriterOpenI
  64. {
  65. virtual ~WriterOpenI() = 0;
  66. virtual bool open(const FilePath& _filePath, bool _append, Error* _err) = 0;
  67. };
  68. ///
  69. struct BX_NO_VTABLE ProcessOpenI
  70. {
  71. virtual ~ProcessOpenI() = 0;
  72. virtual bool open(const FilePath& _filePath, const StringView& _args, Error* _err) = 0;
  73. };
  74. ///
  75. struct BX_NO_VTABLE CloserI
  76. {
  77. virtual ~CloserI() = 0;
  78. virtual void close() = 0;
  79. };
  80. ///
  81. struct BX_NO_VTABLE FileReaderI : public ReaderOpenI, public CloserI, public ReaderSeekerI
  82. {
  83. };
  84. ///
  85. struct BX_NO_VTABLE FileWriterI : public WriterOpenI, public CloserI, public WriterSeekerI
  86. {
  87. };
  88. ///
  89. struct BX_NO_VTABLE MemoryBlockI
  90. {
  91. virtual void* more(uint32_t _size = 0) = 0;
  92. virtual uint32_t getSize() = 0;
  93. };
  94. ///
  95. class StaticMemoryBlock : public MemoryBlockI
  96. {
  97. public:
  98. ///
  99. StaticMemoryBlock(void* _data, uint32_t _size);
  100. ///
  101. virtual ~StaticMemoryBlock();
  102. ///
  103. virtual void* more(uint32_t _size = 0) override;
  104. ///
  105. virtual uint32_t getSize() override;
  106. private:
  107. void* m_data;
  108. uint32_t m_size;
  109. };
  110. ///
  111. class MemoryBlock : public MemoryBlockI
  112. {
  113. public:
  114. ///
  115. MemoryBlock(AllocatorI* _allocator);
  116. ///
  117. virtual ~MemoryBlock();
  118. ///
  119. virtual void* more(uint32_t _size = 0) override;
  120. ///
  121. virtual uint32_t getSize() override;
  122. private:
  123. AllocatorI* m_allocator;
  124. void* m_data;
  125. uint32_t m_size;
  126. };
  127. /// Sizer writer. Dummy writter that only counts number of bytes written into it.
  128. class SizerWriter : public WriterSeekerI
  129. {
  130. public:
  131. ///
  132. SizerWriter();
  133. ///
  134. virtual ~SizerWriter();
  135. ///
  136. virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) override;
  137. ///
  138. virtual int32_t write(const void* /*_data*/, int32_t _size, Error* _err) override;
  139. private:
  140. int64_t m_pos;
  141. int64_t m_top;
  142. };
  143. ///
  144. class MemoryReader : public ReaderSeekerI
  145. {
  146. public:
  147. ///
  148. MemoryReader(const void* _data, uint32_t _size);
  149. ///
  150. virtual ~MemoryReader();
  151. ///
  152. virtual int64_t seek(int64_t _offset, Whence::Enum _whence) override;
  153. ///
  154. virtual int32_t read(void* _data, int32_t _size, Error* _err) override;
  155. ///
  156. const uint8_t* getDataPtr() const;
  157. ///
  158. int64_t getPos() const;
  159. ///
  160. int64_t remaining() const;
  161. private:
  162. const uint8_t* m_data;
  163. int64_t m_pos;
  164. int64_t m_top;
  165. };
  166. ///
  167. class MemoryWriter : public WriterSeekerI
  168. {
  169. public:
  170. ///
  171. MemoryWriter(MemoryBlockI* _memBlock);
  172. ///
  173. virtual ~MemoryWriter();
  174. ///
  175. virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) override;
  176. ///
  177. virtual int32_t write(const void* _data, int32_t _size, Error* _err) override;
  178. private:
  179. MemoryBlockI* m_memBlock;
  180. uint8_t* m_data;
  181. int64_t m_pos;
  182. int64_t m_top;
  183. int64_t m_size;
  184. };
  185. /// Static (fixed size) memory block writer.
  186. class StaticMemoryBlockWriter : public MemoryWriter
  187. {
  188. public:
  189. ///
  190. StaticMemoryBlockWriter(void* _data, uint32_t _size);
  191. ///
  192. virtual ~StaticMemoryBlockWriter();
  193. private:
  194. StaticMemoryBlock m_smb;
  195. };
  196. /// Read data.
  197. int32_t read(ReaderI* _reader, void* _data, int32_t _size, Error* _err = NULL);
  198. /// Read value.
  199. template<typename Ty>
  200. int32_t read(ReaderI* _reader, Ty& _value, Error* _err = NULL);
  201. /// Read value and converts it to host endianess. _fromLittleEndian specifies
  202. /// underlying stream endianess.
  203. template<typename Ty>
  204. int32_t readHE(ReaderI* _reader, Ty& _value, bool _fromLittleEndian, Error* _err = NULL);
  205. /// Write data.
  206. int32_t write(WriterI* _writer, const void* _data, int32_t _size, Error* _err = NULL);
  207. /// Write C string.
  208. int32_t write(WriterI* _writer, const char* _str, Error* _err = NULL);
  209. /// Write string view.
  210. int32_t write(WriterI* _writer, const StringView& _str, Error* _err = NULL);
  211. ///
  212. int32_t write(WriterI* _writer, Error* _err, const char* _format, ...);
  213. /// Write repeat the same value.
  214. int32_t writeRep(WriterI* _writer, uint8_t _byte, int32_t _size, Error* _err = NULL);
  215. /// Write value.
  216. template<typename Ty>
  217. int32_t write(WriterI* _writer, const Ty& _value, Error* _err = NULL);
  218. /// Write value as little endian.
  219. template<typename Ty>
  220. int32_t writeLE(WriterI* _writer, const Ty& _value, Error* _err = NULL);
  221. /// Write value as big endian.
  222. template<typename Ty>
  223. int32_t writeBE(WriterI* _writer, const Ty& _value, Error* _err = NULL);
  224. /// Write formated string.
  225. int32_t writePrintf(WriterI* _writer, const char* _format, ...);
  226. /// Skip _offset bytes forward.
  227. int64_t skip(SeekerI* _seeker, int64_t _offset);
  228. /// Seek to any position in file.
  229. int64_t seek(SeekerI* _seeker, int64_t _offset = 0, Whence::Enum _whence = Whence::Current);
  230. /// Returns size of file.
  231. int64_t getSize(SeekerI* _seeker);
  232. /// Returns remaining size from current offset of file.
  233. int64_t getRemain(SeekerI* _seeker);
  234. /// Peek data.
  235. int32_t peek(ReaderSeekerI* _reader, void* _data, int32_t _size, Error* _err = NULL);
  236. /// Peek value.
  237. template<typename Ty>
  238. int32_t peek(ReaderSeekerI* _reader, Ty& _value, Error* _err = NULL);
  239. /// Align reader stream.
  240. int32_t align(ReaderSeekerI* _reader, uint32_t _alignment, Error* _err = NULL);
  241. /// Align writer stream (pads stream with zeros).
  242. int32_t align(WriterSeekerI* _writer, uint32_t _alignment, Error* _err = NULL);
  243. /// Open for read.
  244. bool open(ReaderOpenI* _reader, const FilePath& _filePath, Error* _err = NULL);
  245. /// Open fro write.
  246. bool open(WriterOpenI* _writer, const FilePath& _filePath, bool _append = false, Error* _err = NULL);
  247. /// Open process.
  248. bool open(ProcessOpenI* _process, const FilePath& _filePath, const StringView& _args, Error* _err = NULL);
  249. /// Close.
  250. void close(CloserI* _reader);
  251. } // namespace bx
  252. #include "inline/readerwriter.inl"
  253. #endif // BX_READERWRITER_H_HEADER_GUARD