Stream.hpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #pragma once
  2. #ifndef _SerialPortServer_DLL
  3. #define SERIALPORTSERVER_API _declspec(dllimport)
  4. #else
  5. #define SERIALPORTSERVER_API _declspec(dllexport)
  6. #endif
  7. struct StreamData
  8. {
  9. long nRefs; // reference count
  10. int nDataLength; // length of data (including terminator)
  11. int nAllocLength; // length of allocation
  12. // char data[nAllocLength]
  13. char * data () // char* to managed data
  14. { return (char*) (this+1); }
  15. };
  16. class SERIALPORTSERVER_API Stream
  17. {
  18. public:
  19. Stream ();
  20. // copy constructor
  21. Stream (const Stream & stream);
  22. // from characters
  23. Stream (const char * lpsz, int length);
  24. // from characters
  25. Stream (const char * lpsz);
  26. // from unsigned characters
  27. Stream (const unsigned char * lpsz) { Init(); *this = (const char *) lpsz; }
  28. // alloc
  29. Stream (int length);
  30. // Attributes & Operations
  31. // get data length
  32. int GetLength () const { return GetData ()->nDataLength; }
  33. // TRUE if zero length
  34. BOOL IsEmpty () const { return (GetData ()->nDataLength == 0); }
  35. // clear contents to empty
  36. void Empty ();
  37. // return single character at zero-based index
  38. char GetAt (int nIndex) const
  39. {
  40. return m_pchData[nIndex];
  41. }
  42. // return single character at zero-based index
  43. char operator [] (int nIndex) const { return GetAt (nIndex); }
  44. // set a single character at zero-based index
  45. void SetAt (int nIndex, char ch);
  46. // return pointer to const string
  47. operator const char * () const { return m_pchData; }
  48. const char * constBuffer (void) const { return m_pchData; }
  49. // overloaded assignment
  50. // ref-counted copy from another Stream
  51. Stream & operator = (const Stream & stringSrc);
  52. // copy string content from ANSI string (converts to char)
  53. Stream & operator = (const char * lpsz);
  54. // copy string content from unsigned chars
  55. Stream & operator = (const unsigned char * lpsz) { *this = (const char *) lpsz; return *this; }
  56. // get pointer to modifiable buffer at least as long as nMinBufLength
  57. char * GetBuffer (int nMinBufLength);
  58. // get pointer to modifiable buffer exactly as long as nNewLength
  59. char * GetBufferSetLength (int nNewLength);
  60. // Use LockBuffer/UnlockBuffer to turn refcounting off
  61. // turn refcounting back on
  62. char * LockBuffer ();
  63. // turn refcounting off
  64. void UnlockBuffer ();
  65. // Implementation
  66. public:
  67. ~Stream ();
  68. int GetAllocLength () const { return GetData ()->nAllocLength; }
  69. protected:
  70. char * m_pchData; // pointer to ref counted string data
  71. protected:
  72. // implementation helpers
  73. StreamData * Stream::GetData() const
  74. {
  75. return ((StreamData *) m_pchData)-1;
  76. }
  77. void Init ();
  78. void AllocCopy (Stream & dest, int nCopyLen, int nCopyIndex, int nExtraLen) const;
  79. void AllocBuffer (int nLen);
  80. void AssignCopy (int nSrcLen, const char * lpszSrcData);
  81. void ConcatCopy (int nSrc1Len, const char * lpszSrc1Data, int nSrc2Len, const char * lpszSrc2Data);
  82. void ConcatInPlace (int nSrcLen, const char * lpszSrcData);
  83. void CopyBeforeWrite ();
  84. void AllocBeforeWrite (int nLen);
  85. void Release ();
  86. static void Release (StreamData * pData);
  87. static void FreeData (StreamData * pData);
  88. };