TmplBlockBuffer.tli 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //
  2. #pragma once
  3. #include "TmplBlockBuffer.tlh"
  4. //-----------------------------------------------------------------------------
  5. // TmplBuffer_Base
  6. // 基本类
  7. //-----------------------------------------------------------------------------
  8. template <typename T, typename PTR>
  9. T * ECOM::Utility::TmplBuffer_Base <T, PTR>::_GetBufferSetCount (int count)
  10. {
  11. if (m_nCount >= count)
  12. return m_Data.get ();
  13. T * pOld = m_Data.get ();
  14. T * pNew = new T [count];
  15. memcpy (pNew, pOld, sizeof (T) * m_nCount);
  16. Attach (pNew, count);
  17. return m_Data.get ();
  18. }
  19. template <typename T, typename PTR>
  20. void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyFrom (const T * from, int count)
  21. {
  22. Release ();
  23. if (count <= 0) return;
  24. if (! from) return;
  25. T * toData = new T [count];
  26. ASSERT (toData);
  27. memcpy (toData, from, sizeof (T) * count);
  28. Attach (toData, count);
  29. }
  30. template <typename T, typename PTR>
  31. void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyTo (T * to, int count) const
  32. {
  33. if (count <= 0) return;
  34. if (! to) return;
  35. if (IsEmpty ()) return;
  36. memcpy (to, As (), sizeof (T) * min (count, m_nCount));
  37. }
  38. // make a real copy
  39. template <typename T, typename PTR>
  40. void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyTo (TmplBuffer_Base & To) const
  41. {
  42. if (IsEmpty ()) return;
  43. if (m_nCount <= 0) return;
  44. T * toData = new T [m_nCount];
  45. ASSERT (toData);
  46. memcpy (toData, m_Data.get (), sizeof (T) * m_nCount);
  47. To.Attach (toData, m_nCount);
  48. }
  49. template <typename T, typename PTR>
  50. void ECOM::Utility::TmplBuffer_Base <T, PTR>::ResizeTo (int count, TmplBuffer_Base & To) const
  51. {
  52. // 如果啥都不想要
  53. if (count <= 0) return;
  54. // 如果我自己本来就是 null
  55. if (IsEmpty ())
  56. {
  57. To._GetBufferSetCount (count);
  58. return;
  59. }
  60. // 如果要的很少, 只需要修改 m_nCount
  61. if (count <= m_nCount)
  62. {
  63. To.m_nCount = count;
  64. To.m_Data = this->m_Data;
  65. }
  66. // 如果要的太多了, 重新分配, 然后 memcpy
  67. {
  68. auto pDst = To._GetBufferSetCount (count);
  69. auto pSrc = As ();
  70. memcpy (pDst, pSrc, sizeof (T) * m_nCount);
  71. }
  72. }