CInputStream.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #pragma once
  2. /*
  3. * CInputStream.h, part of VCMI engine
  4. *
  5. * Authors: listed in file AUTHORS in main folder
  6. *
  7. * License: GNU General Public License v2.0 or later
  8. * Full text of license available in license.txt file, in main folder
  9. *
  10. */
  11. /**
  12. * Abstract class which provides method definitions for reading from a stream.
  13. */
  14. class DLL_LINKAGE CInputStream : private boost::noncopyable
  15. {
  16. public:
  17. /**
  18. * D-tor.
  19. */
  20. virtual ~CInputStream() {}
  21. /**
  22. * Reads n bytes from the stream into the data buffer.
  23. *
  24. * @param data A pointer to the destination data array.
  25. * @param size The number of bytes to read.
  26. * @return the number of bytes read actually.
  27. */
  28. virtual si64 read(ui8 * data, si64 size) = 0;
  29. /**
  30. * Seeks the internal read pointer to the specified position.
  31. *
  32. * @param position The read position from the beginning.
  33. * @return the position actually moved to, -1 on error.
  34. */
  35. virtual si64 seek(si64 position) = 0;
  36. /**
  37. * Gets the current read position in the stream.
  38. *
  39. * @return the read position.
  40. */
  41. virtual si64 tell() = 0;
  42. /**
  43. * Skips delta numbers of bytes.
  44. *
  45. * @param delta The count of bytes to skip.
  46. * @return the count of bytes skipped actually.
  47. */
  48. virtual si64 skip(si64 delta) = 0;
  49. /**
  50. * Gets the length in bytes of the stream.
  51. *
  52. * @return the length in bytes of the stream.
  53. */
  54. virtual si64 getSize() = 0;
  55. /**
  56. * @brief for convenience, reads whole stream at once
  57. *
  58. * @return pair, first = raw data, second = size of data
  59. */
  60. std::pair<std::unique_ptr<ui8[]>, size_t> readAll()
  61. {
  62. std::unique_ptr<ui8[]> data(new ui8[getSize()]);
  63. size_t readSize = read(data.get(), getSize());
  64. assert(readSize == getSize());
  65. return std::make_pair(std::move(data), getSize());
  66. }
  67. };