memstream.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:6k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // memstream.cpp: implementation of the Cmemstream class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testBT.h"
  6. #include "memstream.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. memstream::memstream()
  16. {
  17. ;
  18. }
  19. memstream::~memstream()
  20. {
  21. ;
  22. }
  23. memstream::operator char* const() const
  24. {
  25. ASSERT(m_lpBuffer && GetLength() > 0);
  26. return ( char* const)m_lpBuffer;
  27. }
  28. void memstream::clear()
  29. {
  30. delete Detach();
  31. }
  32. void memstream::write(const char* pBuf, long length)
  33. {
  34. if (length <= 0)
  35. return;
  36. Write(pBuf, length);
  37. }
  38. long memstream::size() const
  39. {
  40. return GetLength();
  41. }
  42. void memstream::operator = (const memstream& other)
  43. {
  44. clear();
  45. if (other.size() <= 0)
  46. return;
  47. write(other, other.GetLength());
  48. }
  49. bool memstream::operator ==(memstream& other)
  50. {
  51. if (GetLength () != other.GetLength())
  52. return false;
  53. for (int i=0; i<other.GetLength(); i++)
  54. {
  55. if ( (*(m_lpBuffer+i)) != other[i] )
  56. return false;
  57. }
  58. return true;
  59. }
  60. memstream& memstream::operator +=(string& str)
  61. {
  62. write(str.data(), str.length());
  63. return *this;
  64. }
  65. memstream& memstream::operator +=(const char* pstr)
  66. {
  67. write(pstr, strlen(pstr));
  68. return *this;
  69. }
  70. void memstream::TrimLeft(long length)
  71. {
  72. //*
  73. assert(size() > 0);
  74. assert(length <= size() && length >= 0);
  75. if (size() == length)
  76. {
  77. clear();
  78. return;
  79. }
  80. long len = size() - length;
  81. char* pnewBuf = (char*)Detach();
  82. auto_ptr<char> pp(pnewBuf);
  83. write(pnewBuf + length, len);
  84. }
  85. /*
  86. memstream::memstream()
  87. {
  88. m_pBuf = new strstream();
  89. }
  90. memstream::~memstream()
  91. {
  92. delete m_pBuf;
  93. }
  94. void memstream::clear()
  95. {
  96. delete m_pBuf;
  97. m_pBuf = new strstream();
  98. }
  99. void memstream::write(const char* pBuf, long length)
  100. {
  101. if (length <= 0)
  102. return;
  103. // m_pBuf->seekp(0, ios::end);
  104. m_pBuf->write(pBuf, length);
  105. assert(m_pBuf->good());
  106. }
  107. /*
  108. int memstream::read(char* pBuf, long length)
  109. {
  110. assert(length > 0);
  111. m_pBuf->seekg(0, ios::beg);
  112. m_pBuf->read(pBuf, length);
  113. assert(m_pBuf->good());
  114. return length;
  115. }
  116. memstream::operator char* const() const
  117. {
  118. if (size() <= 0)
  119. assert(false);
  120. char* pRet = m_pBuf->str();
  121. m_pBuf->freeze(0);
  122. assert(m_pBuf->good());
  123. return pRet;
  124. }
  125. long memstream::size() const
  126. {
  127. m_pBuf->seekg(0, ios::end);
  128. long len = m_pBuf->tellg();
  129. m_pBuf->seekg(0, ios::beg);
  130. assert(m_pBuf->good());
  131. return len < 0 ? 0 : len;
  132. }
  133. //*
  134. void memstream::operator = (const memstream& other)
  135. {
  136. long len = other.size(); 
  137. char* pszBuf = new char[len];
  138. other.m_pBuf->read(pszBuf, len);
  139. assert(other.m_pBuf->good());
  140. delete m_pBuf;
  141. m_pBuf = new strstream();
  142. m_pBuf->write(pszBuf, len);
  143. delete pszBuf;
  144. assert(m_pBuf->good());
  145. }
  146. bool memstream::operator ==(memstream& other)
  147. {
  148. if (size() != other.size())
  149. return false;
  150. if (size() <= 0)
  151. return true;
  152. char* pBuf = new char[size()];
  153. char* pBuf2 = new char[size()];
  154. auto_ptr<char> a1(pBuf);
  155. auto_ptr<char> a2(pBuf2);
  156. m_pBuf->seekg(0, ios::beg);
  157. other.m_pBuf->seekg(0, ios::beg);
  158. m_pBuf->read(pBuf, size());
  159. other.m_pBuf->read(pBuf2, size());
  160. for (int i=0; i<size(); i++)
  161. {
  162. if ( (*(pBuf+i)) != (*(pBuf2+i)))
  163. return false;
  164. }
  165. return true;
  166. }
  167. memstream& memstream::operator +=(string& str)
  168. {
  169. write(str.data(), str.length());
  170. return *this;
  171. }
  172. memstream& memstream::operator +=(const char* pstr)
  173. {
  174. write(pstr, strlen(pstr));
  175. return *this;
  176. }
  177. void memstream::TrimLeft(long length)
  178. {
  179. //*
  180. assert(size() > 0);
  181. assert(length <= size() && length >= 0);
  182. if (size() == length)
  183. {
  184. delete m_pBuf;
  185. m_pBuf = new strstream();
  186. assert(m_pBuf->good());
  187. return;
  188. }
  189. long len = size() - length;
  190. char* pnewBuf = new char[len];
  191. auto_ptr<char> pp(pnewBuf);
  192. m_pBuf->seekg(length, ios::beg);
  193. m_pBuf->read(pnewBuf, len);
  194. assert(m_pBuf->good());
  195. delete m_pBuf;
  196. m_pBuf = new strstream();
  197. write(pnewBuf, len);
  198. assert(m_pBuf->good());
  199. }
  200. //*/
  201. /*
  202. memstream::memstream()
  203. {
  204. m_pBuf = 0;
  205. m_lLength = 0;
  206. }
  207. memstream::~memstream()
  208. {
  209. clear();
  210. }
  211. void memstream::clear()
  212. {
  213. if (m_lLength)
  214. {
  215. ASSERT(m_pBuf);
  216. delete m_pBuf;
  217. }
  218. m_lLength = 0;
  219. m_pBuf = 0;
  220. }
  221. void memstream::write(const char* pBuf, long length)
  222. {
  223. if (length == 0)
  224. return;
  225. if (!m_lLength)
  226. {
  227. ASSERT(!m_pBuf);
  228. m_pBuf = new char[1024];
  229. }
  230. else if ((m_lLength % 1024 + length ) > 1024)
  231. {
  232. long lnewsize = ((m_lLength + length) / 1024 + 2) * 1024;
  233. char* pnewBuf = new char[lnewsize];
  234. ASSERT(m_pBuf !=0 );
  235. memmove(pnewBuf, m_pBuf, m_lLength);
  236. delete m_pBuf;
  237. m_pBuf = pnewBuf;
  238. }
  239. memcpy(m_pBuf, pBuf, length);
  240. m_lLength+= length;
  241. /*
  242. char* pnewBuf = new char[m_lLength+length];
  243. if (m_lLength)
  244. {
  245. assert(m_pBuf !=0 );
  246. memcpy(pnewBuf, m_pBuf, m_lLength);
  247. delete m_pBuf;
  248. }
  249. memcpy(pnewBuf+m_lLength, pBuf, length);
  250. m_lLength+= length;
  251. m_pBuf = pnewBuf;
  252. }
  253. void memstream::operator =(const memstream& other)
  254. {
  255. if (other.m_lLength == 0) 
  256. {
  257. m_lLength = 0;
  258. m_pBuf = 0;
  259. }
  260. else
  261. {
  262. write(other, other.size());
  263. }
  264. }
  265. bool memstream::operator ==(memstream& other)
  266. {
  267. if (m_lLength != other.m_lLength)
  268. return false;
  269. for (int i=0; i<m_lLength; i++)
  270. {
  271. if ( (*(m_pBuf+i)) != (*(other.m_pBuf+i)))
  272. return false;
  273. }
  274. return true;
  275. }
  276. memstream& memstream::operator +=(string& str)
  277. {
  278. write(str.data(), str.length());
  279. return *this;
  280. }
  281. memstream& memstream::operator +=(const char* pstr)
  282. {
  283. write(pstr, strlen(pstr));
  284. return *this;
  285. }
  286. memstream::operator char* const() const
  287. {
  288. if (m_lLength <= 0)
  289. assert(false);
  290. return m_pBuf;
  291. }
  292. long memstream::size() const
  293. {
  294. return m_lLength;
  295. }
  296. void memstream::TrimLeft(long length)
  297. {
  298. assert(m_lLength > 0);
  299. assert(length <= m_lLength);
  300. if (m_lLength == length)
  301. {
  302. delete m_pBuf;
  303. m_lLength = 0;
  304. m_pBuf = 0;
  305. return;
  306. }
  307. char* pnewBuf = new char[m_lLength-length];
  308. memcpy(pnewBuf, m_pBuf+length, m_lLength-length);
  309. delete m_pBuf;
  310. m_pBuf = pnewBuf;
  311. m_lLength = m_lLength-length;
  312. }
  313. //*/