Windows-Server-2003/base/bcl/bcl_ntunicodefixedstringbuffer.h

98 lines
3.7 KiB
C++

#if !defined(_BCL_W32UNICODEFIXEDSTRINGBUFFER_H_INCLUDED_)
#define _BCL_W32UNICODEFIXEDSTRINGBUFFER_H_INCLUDED_
#pragma once
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
bcl_w32unicodefixedstringbuffer.h
Abstract:
Author:
Michael Grier (MGrier) 2/6/2002
Revision History:
--*/
#include <windows.h>
#include <bcl_inlinestring.h>
#include <bcl_unicodechartraits.h>
#include <bcl_w32common.h>
#include <bcl_w32baseunicodestringbuffer.h>
namespace BCL
{
template <SIZE_T nInlineChars> class CWin32BaseUnicodeFixedStringBuffer;
template <SIZE_T nInlineChars>
class CWin32BaseUnicodeFixedStringBufferTraits : public CWin32BaseUnicodeStringBufferTraits<CWin32BaseUnicodeFixedStringBuffer<nInlineChars>, CWin32CallDisposition, BOOL>
{
typedef CWin32BaseUnicodeFixedStringBufferTraits<nInlineChars> TThis;
typedef CWin32BaseUnicodeFixedStringBuffer<nInlineChars> TBuffer;
typedef void TAccessor;
friend BCL::CPureString<TThis>;
friend BCL::CInlineString<TThis>;
friend BCL::CUnicodeCharTraits<TBuffer, TCallDisposition>;
friend CWin32BaseUnicodeStringBufferTraits<CWin32BaseUnicodeFixedStringBuffer<nInlineChars>, CWin32CallDisposition, BOOL>;
typedef BCL::CInlineString<TThis> TInlineString;
typedef CWin32BaseUnicodeFixedStringBuffer<nInlineChars> TBuffer;
static inline PWSTR __fastcall GetInlineBufferPtr(const BCL::CBaseString *p) { return static_cast<const TBuffer *>(p)->GetInlineBufferPtr(); }
static inline SIZE_T __fastcall GetInlineBufferCch(const BCL::CBaseString *p) { return nInlineChars; }
static inline TConstantPair __fastcall InlineBufferPair(const BCL::CBaseString *p) { return TConstantPair(TThis::GetInlineBufferPtr(p), TThis::GetInlineBufferCch(p)); }
static inline TMutablePair __fastcall InlineMutableBufferPair(const BCL::CBaseString *p) { return TMutablePair(TThis::GetInlineBufferPtr(p), TThis::GetInlineBufferCch(p)); }
static inline CWin32CallDisposition RoundBufferSize(SIZE_T cch, SIZE_T &rcchGranted) { BCL_MAYFAIL_PROLOG BCL_PARAMETER_CHECK(cch > nInlineChars); rcchGranted = 0; return CWin32CallDisposition::BufferOverflow(); BCL_MAYFAIL_EPILOG_INTERNAL }
// We never have a non-inline buffer, so these shouldn't ever get called.
static inline CWin32CallDisposition __fastcall ReallocateBuffer(BCL::CBaseString *p, SIZE_T cch)
{
BCL_ASSERT(false);
return CWin32CallDisposition::InternalError_RuntimeCheck();
}
static inline void __fastcall DeallocateBuffer(PCWSTR psz)
{
BCL_ASSERT(false);
}
}; // class CWin32BaseUnicodeFixedStringBufferTraits
template <SIZE_T nInlineChars>
class CWin32BaseUnicodeFixedStringBuffer : private BCL::CInlineString<CWin32BaseUnicodeFixedStringBufferTraits<nInlineChars> >, private CWin32BaseUnicodeStringBufferAddIn
{
public:
typedef CWin32BaseUnicodeFixedStringBuffer<nInlineChars> TThis;
typedef CWin32BaseUnicodeFixedStringBufferTraits<nInlineChars> TTraits;
inline CWin32BaseUnicodeFixedStringBuffer() : CWin32BaseUnicodeStringBufferAddIn(m_rgchInlineBuffer, nInlineChars) { }
inline ~CWin32BaseUnicodeFixedStringBuffer() { } // no dynamic buffer; nothing to do.
operator PCWSTR() const { return this->GetStringPtr(); }
#include <bcl_stringapi.h>
private:
inline PWSTR GetInlineBufferPtr() const { return const_cast<PWSTR>(m_rgchInlineBuffer); }
WCHAR m_rgchInlineBuffer[nInlineChars]; // Plus one to make instantiation with nInlineChars=0 work
friend CWin32BaseUnicodeStringBufferTraits<TThis, CWin32CallDisposition, BOOL>;
friend CWin32BaseUnicodeFixedStringBufferTraits<nInlineChars>;
friend BCL::CUnicodeCharTraits<TThis, TCallDisposition>;
}; // class CWin32BaseUnicodeFixedStringBuffer
}; // namespace BCL
#endif // !defined(_BCL_W32UNICODEFIXEDSTRINGBUFFER_H_INCLUDED_)