zfstream.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef __ZFSTREAM_H
  2. #define __ZFSTREAM_H
  3. #include <zlib.h>
  4. #include <ostream>
  5. #include <istream>
  6. #include <fstream>
  7. class vostream
  8. {
  9. public:
  10. virtual ~vostream() {}
  11. virtual void write(const char* s, std::streamsize n) = 0;
  12. virtual void flush() = 0;
  13. virtual bool is_open() = 0;
  14. };
  15. class vofstream : public vostream
  16. {
  17. private:
  18. std::ofstream *stream;
  19. public:
  20. vofstream(const char * filename, std::ios_base::openmode mode = std::ios_base::out)
  21. : stream(new std::ofstream(filename, mode)) {}
  22. vofstream(std::ofstream *stream)
  23. : stream(stream) {}
  24. virtual ~vofstream() { delete stream; }
  25. virtual void write(const char* s, std::streamsize n)
  26. { stream->write(s, n); }
  27. virtual void flush()
  28. { stream->flush(); }
  29. virtual void fail()
  30. { stream->fail(); }
  31. virtual bool is_open()
  32. { return stream->is_open(); }
  33. };
  34. class ozstream : public vostream
  35. {
  36. private:
  37. vostream *output;
  38. z_stream zstream;
  39. static const size_t chunksize = 64*1024;
  40. static const int level = 9;
  41. char buffer[chunksize];
  42. void doCompress(bool finish);
  43. public:
  44. ozstream(vostream *output);
  45. virtual ~ozstream();
  46. virtual void write(const char* s, std::streamsize n);
  47. virtual void flush()
  48. { output->flush(); }
  49. virtual bool is_open()
  50. { return output->is_open(); }
  51. };
  52. class vistream
  53. {
  54. public:
  55. virtual ~vistream() {}
  56. virtual void read(char* s, std::streamsize n) = 0;
  57. virtual int peek() = 0;
  58. virtual bool fail() const = 0;
  59. };
  60. class vifstream : public vistream
  61. {
  62. private:
  63. std::ifstream *stream;
  64. public:
  65. vifstream(const char * filename, std::ios_base::openmode mode = std::ios_base::in)
  66. : stream(new std::ifstream(filename, mode)) {}
  67. vifstream(std::ifstream *stream)
  68. : stream(stream) {}
  69. virtual ~vifstream() { delete stream; }
  70. virtual void read(char* s, std::streamsize n)
  71. { stream->read(s, n); }
  72. virtual int peek()
  73. { return stream->peek(); }
  74. virtual bool fail() const { return stream->fail(); }
  75. };
  76. class izstream : public vistream
  77. {
  78. private:
  79. vistream *input;
  80. bool m_eof;
  81. bool m_fail;
  82. z_stream zstream;
  83. static const size_t chunksize = 64*1024;
  84. char buffer[chunksize];
  85. char peek_value;
  86. bool peek_valid;
  87. public:
  88. izstream(vistream *input);
  89. virtual ~izstream();
  90. virtual void read(char* s, std::streamsize n);
  91. virtual int peek();
  92. virtual bool eof() const { return m_eof; }
  93. virtual bool fail() const { return m_fail; }
  94. };
  95. #endif // __ZFSTREAM_H