123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- //
- #pragma once
- #include <algorithm>
- #include "TmplBlockBuffer.tlh"
- //-----------------------------------------------------------------------------
- // TmplBuffer_Base
- // 基本类
- //-----------------------------------------------------------------------------
- template <typename T, typename PTR>
- T * ECOM::Utility::TmplBuffer_Base <T, PTR>::_GetBufferSetCount (int count)
- {
- if (m_nCount >= count)
- return m_Data.get ();
- T * pOld = m_Data.get ();
- T * pNew = new T [count];
- memcpy (pNew, pOld, sizeof (T) * m_nCount);
- Attach (pNew, count);
- return m_Data.get ();
- }
- template <typename T, typename PTR>
- void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyFrom (const T * from, int count)
- {
- Release ();
- if (count <= 0) return;
- if (! from) return;
- T * toData = new T [count];
- ASSERT (toData);
- memcpy (toData, from, sizeof (T) * count);
- Attach (toData, count);
- }
- template <typename T, typename PTR>
- void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyTo (T * to, int count) const
- {
- if (count <= 0) return;
- if (! to) return;
- if (IsEmpty ()) return;
- memcpy (to, As (), sizeof (T) * (std::min) (count, m_nCount));
- }
- // make a real copy
- template <typename T, typename PTR>
- void ECOM::Utility::TmplBuffer_Base <T, PTR>::MemCopyTo (TmplBuffer_Base & To) const
- {
- if (IsEmpty ()) return;
- if (m_nCount <= 0) return;
- T * toData = new T [m_nCount];
- ASSERT (toData);
- memcpy (toData, m_Data.get (), sizeof (T) * m_nCount);
- To.Attach (toData, m_nCount);
- }
- template <typename T, typename PTR>
- void ECOM::Utility::TmplBuffer_Base <T, PTR>::ResizeTo (int count, TmplBuffer_Base & To) const
- {
- // 如果啥都不想要
- if (count <= 0) return;
- // 如果我自己本来就是 null
- if (IsEmpty ())
- {
- To._GetBufferSetCount (count);
- return;
- }
- // 如果要的很少, 只需要修改 m_nCount
- if (count <= m_nCount)
- {
- To.m_nCount = count;
- To.m_Data = this->m_Data;
- }
- else
- // 如果要的太多了, 重新分配, 然后 memcpy
- {
- auto pDst = To._GetBufferSetCount (count);
- auto pSrc = As ();
- memcpy (pDst, pSrc, sizeof (T) * m_nCount);
- }
- }
- template <typename T>
- ECOM::Utility::TmplSharedBuffer <T>::TmplSharedBuffer (TmplUniqueBuffer <T> && from)
- {
- this->Release ();
- if (from)
- {
- auto count = from.GetCount ();
- auto pc = from.Detach ();
- this->Attach (pc, count);
- }
- }
- template <typename T>
- ECOM::Utility::TmplSharedBuffer <T> & ECOM::Utility::TmplSharedBuffer <T>::operator = (ECOM::Utility::TmplUniqueBuffer <T> && from)
- {
- this->Release ();
- if (from)
- {
- auto count = from.GetCount ();
- auto pc = from.Detach ();
- this->Attach (pc, count);
- }
- return (*this);
- }
|