TmplBlockBuffer.tli 2.5 KB

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