#if !defined(_BCL_W32UNICODEINILINESTRINGBUFFER_H_INCLUDED_) #define _BCL_W32UNICODEINILINESTRINGBUFFER_H_INCLUDED_ #pragma once #include #include #include #include #include namespace BCL { template class CWin32BaseUnicodeInlineStringBuffer; template class CWin32BaseUnicodeInlineStringBufferTraits : public CWin32BaseUnicodeStringBufferTraits, CWin32CallDisposition, BOOL> { typedef CWin32BaseUnicodeInlineStringBufferTraits TThis; typedef CWin32BaseUnicodeInlineStringBuffer TBuffer; typedef void TAccessor; friend BCL::CPureString; friend BCL::CInlineString; friend BCL::CUnicodeCharTraits; friend CWin32BaseUnicodeStringBufferTraits, CWin32CallDisposition, BOOL >; typedef BCL::CInlineString TInlineString; typedef CWin32BaseUnicodeInlineStringBuffer TBuffer; static inline PWSTR __fastcall GetInlineBufferPtr(const BCL::CBaseString *p); static inline SIZE_T __fastcall GetInlineBufferCch(const BCL::CBaseString *p); static inline TConstantPair __fastcall InlineBufferPair(const BCL::CBaseString *p); static inline TMutablePair __fastcall InlineMutableBufferPair(const BCL::CBaseString *p); static inline CWin32CallDisposition ReallocateBuffer(BCL::CBaseString *p, SIZE_T cch); }; template inline PWSTR __fastcall CWin32BaseUnicodeInlineStringBufferTraits::GetInlineBufferPtr( const BCL::CBaseString *p ) { return static_cast(p)->GetInlineBufferPtr(); } template inline SIZE_T __fastcall CWin32BaseUnicodeInlineStringBufferTraits::GetInlineBufferCch( const BCL::CBaseString *p ) { return nInlineChars; } template inline typename CWin32BaseUnicodeInlineStringBufferTraits::TConstantPair __fastcall CWin32BaseUnicodeInlineStringBufferTraits::InlineBufferPair( const BCL::CBaseString *p ) { return TConstantPair(TThis::GetInlineBufferPtr(p), TThis::GetInlineBufferCch(p)); } template inline typename CWin32BaseUnicodeInlineStringBufferTraits::TMutablePair __fastcall CWin32BaseUnicodeInlineStringBufferTraits::InlineMutableBufferPair( const BCL::CBaseString *p ) { return TMutablePair(TThis::GetInlineBufferPtr(p), TThis::GetInlineBufferCch(p)); } template inline CWin32CallDisposition CWin32BaseUnicodeInlineStringBufferTraits::ReallocateBuffer( BCL::CBaseString *p, SIZE_T cch ) { TBuffer * const pBuffer = static_cast(p); const PWSTR pBufferPtr = pBuffer->GetMutableBufferPtr(); if (cch < TThis::GetInlineBufferCch(p)) { if (pBufferPtr != TBuffer::TTraits::GetInlineBufferPtr(p)) { if (pBufferPtr != NULL) TThis::DeallocateBuffer(pBufferPtr); TThis::SetBufferPointerAndCount(p, TThis::GetInlineBufferPtr(p), TThis::GetInlineBufferCch(p)); } } else { const TSizeT cb = cch * sizeof(WCHAR); PWSTR psz = NULL; if (cch != (cb / sizeof(WCHAR))) return CWin32CallDisposition::FromWin32Error(ERROR_ARITHMETIC_OVERFLOW); if ((pBuffer != NULL) && (pBufferPtr != TThis::GetInlineBufferPtr(p))) { ::SetLastError(ERROR_SUCCESS); psz = reinterpret_cast( ::HeapReAlloc( ::GetProcessHeap(), 0, const_cast(pBufferPtr), cb)); if (psz == NULL) { const DWORD dwLastError = ::GetLastError(); if (dwLastError == ERROR_SUCCESS) return CWin32CallDisposition::FromWin32Error(ERROR_OUTOFMEMORY); return CWin32CallDisposition::FromWin32Error(dwLastError); } } else { psz = reinterpret_cast( ::HeapAlloc( ::GetProcessHeap(), 0, cb)); } if (psz == NULL) return CWin32CallDisposition::FromWin32Error(ERROR_OUTOFMEMORY); pBuffer->SetBufferPointerAndCount(psz, cch); } return CWin32CallDisposition::FromWin32Error(ERROR_SUCCESS); } template class CWin32BaseUnicodeInlineStringBuffer : protected BCL::CInlineString >, private BCL::CWin32BaseUnicodeStringBufferAddIn { public: typedef CWin32BaseUnicodeInlineStringBuffer TThis; typedef CWin32BaseUnicodeInlineStringBufferTraits TTraits; public: inline CWin32BaseUnicodeInlineStringBuffer() : CWin32BaseUnicodeStringBufferAddIn(m_rgchInlineBuffer, nInlineChars) { m_rgchInlineBuffer[0] = L'\0'; } inline ~CWin32BaseUnicodeInlineStringBuffer() { TTraits::DeallocateDynamicBuffer(this); } operator PCWSTR() const { return this->GetStringPtr(); } #include private: inline PWSTR GetInlineBufferPtr() const { return const_cast(m_rgchInlineBuffer); } WCHAR m_rgchInlineBuffer[nInlineChars]; friend CWin32BaseUnicodeStringBufferTraits; friend CWin32BaseUnicodeInlineStringBufferTraits; friend BCL::CUnicodeCharTraits; }; // class CWin32BaseUnicodeInlineStringBuffer<> }; // namespace BCL #endif // !defined(_BCL_W32UNICODEINILINESTRINGBUFFER_H_INCLUDED_)