NT4/private/windows/win4help/ftsrch/dataring.h
2020-09-30 17:12:29 +02:00

182 lines
4.3 KiB
C++

// DataRing.h Class definition and implementation for CDataRing
#ifndef __DATARING_H__
#define __DATARING_H__
class CDataRing
{
public:
// Constructor --
CDataRing();
// Destructor --
virtual ~CDataRing();
void ExceptionDestructor();
// Query Routines --
BOOL Empty();
BOOL Writable();
#ifdef _DEBUG
inline BOOL Initialed() { return m_fInitialed; }
#endif // _DEBUG
// Access Functions --
const UINT *NextDWordsIn (PUINT pcdw);
UINT *NextDWordsOut(PUINT pcdw);
UINT GetDWordIn();
void PutDWordOut(UINT dw);
void FlushOutput(BOOL fForceAll= FALSE);
UINT CDWordsRead();
UINT CDWordsWritten();
void ClearCounts();
protected:
void Enable(BOOL fWritable= FALSE);
void Disable();
// Protected Data Member
BOOL m_fExceptionCleanup;
private:
BOOL m_fWritable;
UINT m_cdwRead;
UINT m_cdwWritten;
#ifdef _DEBUG
BOOL m_fInitialed;
#endif //_DEBUG
virtual const UINT *RawNextDWordsIn (PUINT pcdw) = 0;
virtual UINT *RawNextDWordsOut(PUINT pcdw) = 0;
virtual void RawFlushOutput (BOOL fForceAll) = 0;
virtual BOOL RawEmptyRing () = 0;
};
inline UINT CDataRing::CDWordsRead()
{
return m_cdwRead;
}
inline UINT CDataRing::CDWordsWritten()
{
return m_cdwWritten;
}
inline void CDataRing::ClearCounts()
{
m_cdwRead= m_cdwWritten= 0;
}
inline CDataRing::CDataRing() {
#ifdef _DEBUG
m_fInitialed = FALSE;
#endif // _DEBUG
m_fWritable = FALSE;
m_fExceptionCleanup = FALSE;
}
inline const UINT *CDataRing::NextDWordsIn (PUINT pcdw) { ASSERT(Initialed());
ASSERT(!m_fWritable);
const UINT *pdw= RawNextDWordsIn(pcdw);
if (pdw) m_cdwRead += *pcdw;
return pdw;
}
inline UINT *CDataRing::NextDWordsOut(PUINT pcdw) { ASSERT(Initialed());
ASSERT( m_fWritable);
PUINT pdw= RawNextDWordsOut(pcdw);
if (pdw) m_cdwWritten += *pcdw;
return pdw;
}
inline void CDataRing::Enable(BOOL fWritable) { ASSERT(!Initialed());
#ifdef _DEBUG
m_fInitialed= TRUE;
#endif // _DEBUG
m_fWritable= fWritable;
}
inline void CDataRing::Disable() { ASSERT(Initialed());
if (m_fWritable) FlushOutput(TRUE);
ClearCounts();
#ifdef _DEBUG
m_fInitialed= FALSE;
#endif // _DEBUG
m_fWritable= FALSE;
}
inline BOOL CDataRing::Writable() { return m_fWritable; }
inline BOOL CDataRing::Empty() { return RawEmptyRing(); }
inline UINT CDataRing::GetDWordIn()
{
ASSERT(Initialed());
UINT cdw= 1;
const UINT *pdw= NextDWordsIn(&cdw);
ASSERT(cdw == 1);
return *pdw;
}
inline void CDataRing::PutDWordOut(UINT dw)
{
ASSERT(Initialed());
UINT cdw= 1;
PUINT pdw= NextDWordsOut(&cdw);
ASSERT(cdw == 1);
*pdw= dw;
}
inline void CDataRing::FlushOutput(BOOL fForceAll)
{
if (!m_fExceptionCleanup)
RawFlushOutput(fForceAll);
}
inline void CDataRing::ExceptionDestructor()
{
m_fExceptionCleanup= TRUE; delete this;
}
inline UINT BlocksFor(UINT amount, UINT cbBlock)
{
return (amount + cbBlock - 1) / cbBlock;
}
inline UINT RoundUp(UINT amount, UINT cbBlock)
{
return cbBlock * BlocksFor(amount, cbBlock);
}
#endif // __DATARING_H__