IStreamWrapper.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:8k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_IStreamWrapper_h__
  3. #define __febird_io_IStreamWrapper_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <boost/preprocessor/iteration/local.hpp>
  8. #include <boost/preprocessor/enum.hpp>
  9. #include <boost/preprocessor/enum_params.hpp>
  10. #include <boost/type_traits.hpp>
  11. #include "IStreamWrapper.h"
  12. #if defined(_WIN32) || defined(WIN32) || defined(_WIN64) || defined(WIN64)
  13. #if _MSC_VER < 1500
  14. #  define _POSIX_
  15. #endif
  16. #  include <io.h>
  17. #  include <fcntl.h>
  18. #else
  19. #endif
  20. namespace febird {
  21. #define CONS_LIMITS (1, 10)
  22. #define CONS_ARG(z, n, _) const Arg##n& a##n
  23. #define TEMPLATE_CONS(WrapperClass, n) template<BOOST_PP_ENUM_PARAMS(n, class Arg)> 
  24. explicit WrapperClass(BOOST_PP_ENUM(n, CONS_ARG, ~)) : m_stream(BOOST_PP_ENUM_PARAMS(n, a)) {}
  25. template<class SeekableClass>
  26. class SeekableWrapper : public ISeekable
  27. {
  28. DECLARE_NONE_COPYABLE_CLASS(SeekableWrapper)
  29. protected:
  30. SeekableClass m_stream;
  31. public:
  32. SeekableWrapper() {}
  33. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  34. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(SeekableWrapper, n)
  35. #include BOOST_PP_LOCAL_ITERATE()
  36. virtual void seek(stream_position_t pos) { m_stream.seek(pos); }
  37. virtual void seek(stream_offset_t offset, int origin) { m_stream.seek(offset, origin); }
  38. virtual stream_position_t tell() { return m_stream.tell(); }
  39. virtual stream_position_t size() { return m_stream.size(); }
  40. };
  41. template<class SeekableClass>
  42. class SeekableWrapper<SeekableClass*> : public ISeekable
  43. {
  44. protected:
  45. SeekableClass* m_stream;
  46. public:
  47. SeekableWrapper(SeekableClass* stream) : m_stream(stream) {}
  48. virtual void seek(stream_position_t pos) { m_stream->seek(pos); }
  49. virtual void seek(stream_offset_t offset, int origin) { m_stream->seek(offset, origin); }
  50. virtual stream_position_t tell() { return m_stream->tell(); }
  51. virtual stream_position_t size() { return m_stream->size(); }
  52. };
  53. template<class InputStream>
  54. class InputStreamWrapper : public IInputStream
  55. {
  56. DECLARE_NONE_COPYABLE_CLASS(InputStreamWrapper)
  57. protected:
  58. InputStream m_stream;
  59. public:
  60. InputStreamWrapper() {}
  61. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  62. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(InputStreamWrapper, n)
  63. #include BOOST_PP_LOCAL_ITERATE()
  64. virtual bool eof() const { return m_stream.eof(); }
  65. virtual size_t read(void* vbuf, size_t length) { return m_stream.read(vbuf, length); }
  66. };
  67. template<class InputStream>
  68. class InputStreamWrapper<InputStream*> : public IInputStream
  69. {
  70. protected:
  71. InputStream* m_stream;
  72. public:
  73. InputStreamWrapper(InputStream* stream) : m_stream(stream) {}
  74. virtual bool eof() const { return m_stream->eof(); }
  75. virtual size_t read(void* vbuf, size_t length) { return m_stream->read(vbuf, length); }
  76. };
  77. template<class OutputStream>
  78. class OutputStreamWrapper : public IOutputStream
  79. {
  80. DECLARE_NONE_COPYABLE_CLASS(OutputStreamWrapper)
  81. protected:
  82. OutputStream m_stream;
  83. public:
  84. OutputStreamWrapper() {}
  85. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  86. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(OutputStreamWrapper, n)
  87. #include BOOST_PP_LOCAL_ITERATE()
  88. virtual size_t write(const void* vbuf, size_t length) { return m_stream.write(vbuf, length); }
  89. virtual void flush() { m_stream.flush(); }
  90. };
  91. template<class OutputStream>
  92. class OutputStreamWrapper<OutputStream*> : public IOutputStream
  93. {
  94. protected:
  95. OutputStream* m_stream;
  96. public:
  97. OutputStreamWrapper(OutputStream* stream) : m_stream(stream) {}
  98. virtual size_t write(const void* vbuf, size_t length) { return m_stream->write(vbuf, length); }
  99. virtual void flush() { m_stream->flush(); }
  100. };
  101. //////////////////////////////////////////////////////////////////////////
  102. template<class InputStream>
  103. class SeekableInputStreamWrapper : public ISeekableInputStream
  104. {
  105. DECLARE_NONE_COPYABLE_CLASS(SeekableInputStreamWrapper)
  106. protected:
  107. InputStream m_stream;
  108. public:
  109. SeekableInputStreamWrapper() {}
  110. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  111. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(SeekableInputStreamWrapper, n)
  112. #include BOOST_PP_LOCAL_ITERATE()
  113. virtual bool eof() const { return m_stream.eof(); }
  114. virtual void seek(stream_position_t pos) { m_stream.seek(pos); }
  115. virtual void seek(stream_offset_t offset, int origin) { m_stream.seek(offset, origin); }
  116. virtual stream_position_t tell() { return m_stream.tell(); }
  117. virtual stream_position_t size() { return m_stream.size(); }
  118. virtual size_t read(void* vbuf, size_t length) { return m_stream.read(vbuf, length); }
  119. };
  120. template<class InputStream>
  121. class SeekableInputStreamWrapper<InputStream*> : public ISeekableInputStream
  122. {
  123. protected:
  124. InputStream* m_stream;
  125. public:
  126. SeekableInputStreamWrapper(IInputStream* stream) : m_stream(stream) {}
  127. virtual bool eof() const { return m_stream.eof(); }
  128. virtual void seek(stream_position_t pos) { m_stream->seek(pos); }
  129. virtual void seek(stream_offset_t offset, int origin) { m_stream->seek(offset, origin); }
  130. virtual stream_position_t tell() { return m_stream->tell(); }
  131. virtual stream_position_t size() { return m_stream->size(); }
  132. virtual size_t read(void* vbuf, size_t length) { return m_stream->read(vbuf, length); }
  133. };
  134. template<class OutputStream>
  135. class SeekableOutputStreamWrapper : public ISeekableOutputStream
  136. {
  137. DECLARE_NONE_COPYABLE_CLASS(SeekableOutputStreamWrapper)
  138. protected:
  139. OutputStream m_stream;
  140. public:
  141. SeekableOutputStreamWrapper() {}
  142. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  143. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(SeekableOutputStreamWrapper, n)
  144. #include BOOST_PP_LOCAL_ITERATE()
  145. virtual void seek(stream_position_t pos) { m_stream.seek(pos); }
  146. virtual void seek(stream_offset_t offset, int origin) { m_stream.seek(offset, origin); }
  147. virtual stream_position_t tell() { return m_stream.tell(); }
  148. virtual stream_position_t size() { return m_stream.size(); }
  149. virtual size_t write(const void* vbuf, size_t length) { return m_stream.write(vbuf, length); }
  150. virtual void flush() { m_stream.flush(); }
  151. };
  152. template<class OutputStream>
  153. class SeekableOutputStreamWrapper<OutputStream*> : public ISeekableOutputStream
  154. {
  155. protected:
  156. OutputStream* m_stream;
  157. public:
  158. SeekableOutputStreamWrapper(OutputStream* stream) : m_stream(stream) {}
  159. virtual void seek(stream_position_t pos) { m_stream->seek(pos); }
  160. virtual void seek(stream_offset_t offset, int origin) { m_stream->seek(offset, origin); }
  161. virtual stream_position_t tell() { return m_stream->tell(); }
  162. virtual stream_position_t size() { return m_stream->size(); }
  163. virtual size_t write(const void* vbuf, size_t length) { return m_stream->write(vbuf, length); }
  164. virtual void flush() { m_stream->flush(); }
  165. };
  166. template<class Stream>
  167. class SeekableStreamWrapper : public ISeekableStream
  168. {
  169. DECLARE_NONE_COPYABLE_CLASS(SeekableStreamWrapper)
  170. protected:
  171. Stream m_stream;
  172. public:
  173. SeekableStreamWrapper() {}
  174. #define BOOST_PP_LOCAL_LIMITS CONS_LIMITS
  175. #define BOOST_PP_LOCAL_MACRO(n)  TEMPLATE_CONS(SeekableStreamWrapper, n)
  176. #include BOOST_PP_LOCAL_ITERATE()
  177. virtual bool eof() const { return m_stream.eof(); }
  178. virtual void seek(stream_position_t pos) { m_stream.seek(pos); }
  179. virtual void seek(stream_offset_t offset, int origin) { m_stream.seek(offset, origin); }
  180. virtual stream_position_t tell() { return m_stream.tell(); }
  181. virtual stream_position_t size() { return m_stream.size(); }
  182. virtual size_t read(void* vbuf, size_t length) { return m_stream.read(vbuf, length); }
  183. virtual size_t write(const void* vbuf, size_t length) { return m_stream.write(vbuf, length); }
  184. virtual void flush() { m_stream.flush(); }
  185. };
  186. template<class Stream>
  187. class SeekableStreamWrapper<Stream*> : public ISeekableStream
  188. {
  189. protected:
  190. Stream* m_stream;
  191. public:
  192. SeekableStreamWrapper(Stream* stream) : m_stream(stream) {}
  193. virtual bool eof() const { return m_stream.eof(); }
  194. virtual void seek(stream_position_t pos) { m_stream->seek(pos); }
  195. virtual void seek(stream_offset_t offset, int origin) { m_stream->seek(offset, origin); }
  196. virtual stream_position_t tell() { return m_stream->tell(); }
  197. virtual stream_position_t size() { return m_stream->size(); }
  198. virtual size_t read(void* vbuf, size_t length) { return m_stream->read(vbuf, length); }
  199. virtual size_t write(const void* vbuf, size_t length) { return m_stream->write(vbuf, length); }
  200. virtual void flush() { m_stream->flush(); }
  201. };
  202. #undef CONS_LIMITS
  203. #undef CONS_ARG
  204. #undef TEMPLATE_CONS
  205. } // namespace febird
  206. #endif