IO.Stream.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. #pragma once
  2. #include <memory>
  3. #include "String.DString.hpp"
  4. #include "TmplBlockBuffer.tlh"
  5. #include "TmplBlockBuffer.tli"
  6. #include "Utility.Either+Error.hpp"
  7. #ifndef _IOBUFFER_EXPORTS
  8. #define _IOBuffer_API _declspec(dllimport)
  9. #else
  10. #define _IOBuffer_API _declspec(dllexport)
  11. #endif
  12. #ifndef _IOBUFFER_EXPORTS
  13. #ifdef _WIN64
  14. #ifdef _DEBUG
  15. #pragma comment (lib, "ECOM.Utility.IOBuffer64D.lib")
  16. #else
  17. #pragma comment (lib, "ECOM.Utility.IOBuffer64.lib")
  18. #endif
  19. #else // X86
  20. #ifdef _DEBUG
  21. #pragma comment (lib, "ECOM.Utility.IOBufferD.lib")
  22. #else
  23. #pragma comment (lib, "ECOM.Utility.IOBuffer.lib")
  24. #endif
  25. #endif
  26. #endif // _IOBUFFER_EXPORTS
  27. namespace ECOM::Utility::IOBuffer
  28. {
  29. class InBuffer;
  30. class OutBuffer;
  31. }
  32. namespace ECOM::IO::Stream
  33. {
  34. class BaseStream;
  35. class IStream;
  36. class OStream;
  37. //-----------------------------------------------------------------------------
  38. // IStream
  39. //-----------------------------------------------------------------------------
  40. class _IOBuffer_API BaseStream
  41. {
  42. template <typename> static constexpr bool dependent_false = false;
  43. public:
  44. BaseStream () = default;
  45. virtual ~BaseStream () = default;
  46. virtual eiResult Open () = 0;
  47. virtual void Close () = 0;
  48. virtual bool IsClosed () const { return false; } // 当流被关闭后, 返回 true
  49. // read data from disk, then save it to InBuffer/OutBuffer
  50. // int TransferTo (OStream & OB, int cbNumBytes);
  51. virtual void TransferTo (IBlockBuffer & BLOB) = 0;
  52. virtual eSTR::DString ToString () const { return eSTR::DString (); } // 用于日志,跟踪等
  53. };
  54. //-----------------------------------------------------------------------------
  55. // IStream
  56. //-----------------------------------------------------------------------------
  57. class _IOBuffer_API IStream : public virtual BaseStream
  58. {
  59. friend class OStream;
  60. friend class OMemoryStream;
  61. protected:
  62. ECOM::Utility::IOBuffer::InBuffer * m_NIB;
  63. protected:
  64. IStream (ECOM::Utility::IOBuffer::InBuffer * IB);
  65. IStream (IStream && from) { m_NIB = from.m_NIB; from.m_NIB = nullptr; }
  66. IStream & operator = (IStream && from) { m_NIB = from.m_NIB; from.m_NIB = nullptr; return (*this); }
  67. IStream (const IStream & from) = delete;
  68. IStream & operator = (const IStream & from) = delete;
  69. public:
  70. virtual ~IStream ();
  71. public:
  72. virtual IStream & operator >> (BYTE & x) { Read (&x, sizeof (x)); return (*this); }
  73. virtual IStream & operator >> (UINT16 & x) { Read (&x, sizeof (x)); return (*this); }
  74. virtual IStream & operator >> (UINT32 & x) { Read (&x, sizeof (x)); return (*this); }
  75. virtual IStream & operator >> (unsigned long & x) { Read (&x, sizeof (x)); return (*this); }
  76. virtual IStream & operator >> (unsigned long long & x) { Read (&x, sizeof (x)); return (*this); }
  77. IStream & operator >> (char & x) { return (*this) >> (BYTE &) x; };
  78. IStream & operator >> (INT16 & x) { return (*this) >> (UINT16 &) x; };
  79. IStream & operator >> (INT32 & x) { return (*this) >> (UINT32 &) x; };
  80. IStream & operator >> (long & x) { return (*this) >> (unsigned long &) x; };
  81. IStream & operator >> (long long & x) { return (*this) >> (unsigned long long &) x; };
  82. virtual bool Fill (int Bytes);
  83. virtual bool Kill (int Bytes);
  84. virtual int Read (void * vPtr, int cbNumBytes);
  85. BYTE Peek ();
  86. int Peek (void * toData, UINT Bytes);
  87. template <typename T> T Peek () { static_assert (dependent_false <T>); }
  88. template <> inline BYTE Peek () { BYTE v = 0; Peek (& v, sizeof (v)); return v; }
  89. template <> inline UINT16 Peek () { UINT16 v = 0; Peek (& v, sizeof (v)); return v; }
  90. template <> inline UINT32 Peek () { UINT32 v = 0; Peek (& v, sizeof (v)); return v; }
  91. template <> inline unsigned long Peek () { unsigned long v = 0; Peek (& v, sizeof (v)); return v; }
  92. void TransferTo (IBlockBuffer & BLOB) override;
  93. void CopyTo (IStream & IS);
  94. public:
  95. virtual eiResult Open () override;// { assert (m_NIB); m_NIB->Open (); }
  96. virtual void Close () override;// { assert (m_NIB); m_NIB->Close (); }
  97. // 当流被关闭后, 返回 true
  98. virtual bool IsClosed () const override;// { assert (m_NIB); return m_NIB->IsClosed (); }
  99. public:
  100. // 快速读
  101. template <typename T> T Read () { static_assert (dependent_false <T>); }
  102. template <> inline BYTE Read () { BYTE v = 0; operator >> (v); return v; }
  103. template <> inline UINT16 Read () { UINT16 v = 0; operator >> (v); return v; }
  104. template <> inline UINT32 Read () { UINT32 v = 0; operator >> (v); return v; }
  105. template <> inline unsigned long Read () { unsigned long v = 0; operator >> (v); return v; }
  106. template <> inline unsigned long long Read () { unsigned long long v = 0; operator >> (v); return v; }
  107. public: // 由 DICOM 模块使用的一些杂项辅助函数
  108. UINT GetBreakSize () const;
  109. bool SetBreakSize (UINT ToSize);
  110. int TransferTo (OStream & OB, int cbNumBytes);
  111. bool PutBack (UINT8 u8);
  112. bool PutBack (UINT16 u16);
  113. bool PutBack (UINT32 u32);
  114. bool PutBack (const void * Data, UINT Bytes);
  115. int GetSizeInBuffer () const; // 缓冲区里面还剩多少个字节 ?
  116. int GetNbOfRead () const; // 我总共读了多少个字节 ?
  117. public:
  118. class _IOBuffer_API _BigEndian
  119. {
  120. private:
  121. IStream & IB;
  122. public:
  123. _BigEndian (IStream & _IB) : IB (_IB) { }
  124. _BigEndian (_BigEndian &&) = delete;
  125. _BigEndian (const _BigEndian &) = delete;
  126. _BigEndian & operator = (const _BigEndian &) = delete;
  127. _BigEndian & operator = (_BigEndian &&) = delete;
  128. public:
  129. void operator >> (BYTE & x);
  130. void operator >> (UINT16 & x);
  131. void operator >> (UINT32 & x);
  132. void operator >> (unsigned long & x);
  133. void operator >> (char & x) { (*this) >> (BYTE &) x; };
  134. void operator >> (INT16 & x) { (*this) >> (UINT16 &) x; };
  135. void operator >> (INT32 & x) { (*this) >> (UINT32 &) x; };
  136. void operator >> (long & x) { (*this) >> (unsigned long &) x; };
  137. // 快速读
  138. template <typename T> T Read () { static_assert (dependent_false <T>); }
  139. template <> inline BYTE Read () { BYTE v = 0; operator >> (v); return v; }
  140. template <> inline UINT16 Read () { UINT16 v = 0; operator >> (v); return v; }
  141. template <> inline UINT32 Read () { UINT32 v = 0; operator >> (v); return v; }
  142. template <> inline unsigned long Read () { unsigned long v = 0; operator >> (v); return v; }
  143. } BE () { return _BigEndian (*this); }
  144. public:
  145. class _IOBuffer_API _LittleEndian
  146. {
  147. private:
  148. IStream & IB;
  149. public:
  150. _LittleEndian (IStream & _IB) : IB (_IB) { }
  151. _LittleEndian (_LittleEndian &&) = delete;
  152. _LittleEndian (const _LittleEndian &) = delete;
  153. _LittleEndian & operator = (const _LittleEndian &) = delete;
  154. _LittleEndian & operator = (_LittleEndian &&) = delete;
  155. public:
  156. void operator >> (BYTE & x) { IB >> x; }
  157. void operator >> (UINT16 & x) { IB >> x; }
  158. void operator >> (UINT32 & x) { IB >> x; }
  159. void operator >> (unsigned long & x) { IB >> x; }
  160. void operator >> (unsigned long long & x) { IB >> x; }
  161. void operator >> (char & x) { (*this) >> (BYTE &) x; };
  162. void operator >> (INT16 & x) { (*this) >> (UINT16 &) x; };
  163. void operator >> (INT32 & x) { (*this) >> (UINT32 &) x; };
  164. void operator >> (long & x) { (*this) >> (unsigned long &) x; };
  165. void operator >> (long long & x) { (*this) >> (unsigned long long &) x; };
  166. // 快速读
  167. template <typename T> T Read () { static_assert (dependent_false <T>); }
  168. template <> inline BYTE Read () { BYTE v = 0; operator >> (v); return v; }
  169. template <> inline UINT16 Read () { UINT16 v = 0; operator >> (v); return v; }
  170. template <> inline UINT32 Read () { UINT32 v = 0; operator >> (v); return v; }
  171. template <> inline unsigned long Read () { unsigned long v = 0; operator >> (v); return v; }
  172. template <> inline unsigned long long Read () { unsigned long long v = 0; operator >> (v); return v; }
  173. } LE () { return _LittleEndian (*this); }
  174. };
  175. //-----------------------------------------------------------------------------
  176. // OStream
  177. //-----------------------------------------------------------------------------
  178. class _IOBuffer_API OStream : public virtual BaseStream
  179. {
  180. friend class IStream;
  181. friend class IMemoryStream;
  182. protected:
  183. ECOM::Utility::IOBuffer::OutBuffer * m_NOB;
  184. protected:
  185. OStream (ECOM::Utility::IOBuffer::OutBuffer * OB);
  186. OStream (OStream && from) { m_NOB = from.m_NOB; from.m_NOB = nullptr; }
  187. OStream & operator = (OStream && from) { m_NOB = from.m_NOB; from.m_NOB = nullptr; return (*this); }
  188. OStream (const OStream & from) = delete;
  189. OStream & operator = (const OStream & from) = delete;
  190. public:
  191. virtual ~OStream ();
  192. public:
  193. virtual OStream & operator << (BYTE x) { Write (&x, sizeof (x)); return (*this); }
  194. virtual OStream & operator << (UINT16 x) { Write (&x, sizeof (x)); return (*this); }
  195. virtual OStream & operator << (UINT32 x) { Write (&x, sizeof (x)); return (*this); }
  196. virtual OStream & operator << (unsigned long x) { Write (&x, sizeof (x)); return (*this); }
  197. virtual OStream & operator << (unsigned long long x) { Write (&x, sizeof (x)); return (*this); }
  198. OStream & operator << (char x) { return (*this) << (BYTE ) x; };
  199. OStream & operator << (INT16 x) { return (*this) << (UINT16) x; };
  200. OStream & operator << (INT32 x) { return (*this) << (UINT32) x; };
  201. OStream & operator << (long x) { return (*this) << (unsigned long) x; };
  202. OStream & operator << (long long x) { return (*this) << (unsigned long long) x; };
  203. virtual int Write (const void * Data, int cbNumBytes);
  204. virtual void WriteThrough (const void * Data, int cbBytes); // same as SendRaw ();
  205. virtual bool Flush ();
  206. void TransferTo (IBlockBuffer & BLOB) override;
  207. public:
  208. virtual eiResult Open () override;// { assert (m_NIB); m_NIB->Open (); }
  209. virtual void Close () override;// { assert (m_NIB); m_NIB->Close (); }
  210. // 当流被关闭后, 返回 true
  211. virtual bool IsClosed () const override;// { assert (m_NIB); return m_NIB->IsClosed (); }
  212. public: // 由 DICOM 模块使用的一些杂项辅助函数
  213. UINT GetBreakSize () const;
  214. bool SetBreakSize (UINT ToSize);
  215. int GetSizeInBuffer () const; // 缓冲区里面还剩多少个字节 ?
  216. int GetNbOfSend () const; // 我总共读了多少个字节 ?
  217. public:
  218. class _IOBuffer_API _BigEndian
  219. {
  220. private:
  221. OStream & OB;
  222. public:
  223. _BigEndian (OStream & _OB) : OB (_OB) { }
  224. _BigEndian (_BigEndian &&) = delete;
  225. _BigEndian (const _BigEndian &) = delete;
  226. _BigEndian & operator = (const _BigEndian &) = delete;
  227. _BigEndian & operator = (_BigEndian &&) = delete;
  228. public:
  229. void operator << (BYTE x);
  230. void operator << (UINT16 x);
  231. void operator << (UINT32 x);
  232. void operator << (unsigned long x);
  233. void operator << (char x) { (*this) << (BYTE) x; };
  234. void operator << (INT16 x) { (*this) << (UINT16) x; };
  235. void operator << (INT32 x) { (*this) << (UINT32) x; };
  236. void operator << (long x) { (*this) << (unsigned long) x; };
  237. } BE () { return _BigEndian (*this); }
  238. public:
  239. class _IOBuffer_API _LittleEndian
  240. {
  241. private:
  242. OStream & OB;
  243. public:
  244. _LittleEndian (OStream & _OB) : OB (_OB) { }
  245. _LittleEndian (_LittleEndian &&) = delete;
  246. _LittleEndian (const _LittleEndian &) = delete;
  247. _LittleEndian & operator = (const _LittleEndian &) = delete;
  248. _LittleEndian & operator = (_LittleEndian &&) = delete;
  249. public:
  250. void operator << (BYTE x) { OB << x; }
  251. void operator << (UINT16 x) { OB << x; }
  252. void operator << (UINT32 x) { OB << x; }
  253. void operator << (unsigned long x) { OB << x; }
  254. void operator << (char x) { (*this) << (BYTE) x; };
  255. void operator << (INT16 x) { (*this) << (UINT16) x; };
  256. void operator << (INT32 x) { (*this) << (UINT32) x; };
  257. void operator << (long x) { (*this) << (unsigned long) x; };
  258. } LE () { return _LittleEndian (*this); }
  259. };
  260. #if 0
  261. class _IOBuffer_API IOStream : public IStream, public OStream
  262. {
  263. public:
  264. IOStream () = default;
  265. virtual ~IOStream () = default;
  266. };
  267. #endif
  268. //-----------------------------------------------------------------------------
  269. // IMemoryStream
  270. // 一次分配
  271. //-----------------------------------------------------------------------------
  272. class _IOBuffer_API IMemoryStream : public IStream
  273. {
  274. using base = IStream;
  275. public:
  276. IMemoryStream ();
  277. IMemoryStream (int nbAlloc);// { Alloc (nbAlloc); }
  278. virtual ~IMemoryStream ();
  279. IMemoryStream (const IMemoryStream & OB) = delete;
  280. IMemoryStream & operator = (const IMemoryStream & OB) = delete;
  281. IMemoryStream & operator = (IMemoryStream && OB) = delete;
  282. public:
  283. void BorrowFrom (const void * pBuffer, int BufferSize);
  284. void * Alloc (int nbAlloc);
  285. void * GetBufferSetLength (int nbAlloc) { return Alloc (nbAlloc); }
  286. void AppendFrom (OStream && OB);
  287. };
  288. //-----------------------------------------------------------------------------
  289. // OMemoryBuffer
  290. // 一次分配
  291. //-----------------------------------------------------------------------------
  292. class _IOBuffer_API OMemoryStream : public OStream
  293. {
  294. using base = OStream;
  295. public:
  296. OMemoryStream ();
  297. OMemoryStream (int nbAlloc);// { Alloc (nbAlloc); }
  298. virtual ~OMemoryStream ();
  299. OMemoryStream (const OMemoryStream & OB) = delete;
  300. OMemoryStream & operator = (const OMemoryStream & OB) = delete;
  301. OMemoryStream & operator = (OMemoryStream && OB) = delete;
  302. public:
  303. void BorrowFrom (const void * pBuffer, int BufferSize);
  304. void * Alloc (int nbAlloc);
  305. void * GetBufferSetLength (int nbAlloc) { return Alloc (nbAlloc); }
  306. };
  307. }