windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/cmp/asp/linkhash.h
2020-09-26 16:20:57 +08:00

90 lines
2.1 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: Hash table for Script Manager
File: LinkHash.h
Owner: DGottner
This is the Link list and Hash table for use by any classes which
also need LRU access to items. (This includes cache manager,
script manager, and session deletion code)
===================================================================*/
#ifndef LINKHASH_H
#define LINKHASH_H
#include "hashing.h"
#include "DblLink.h"
/* C L r u L i n k E l e m
*
* CLruLink is a CLinkElem with extra links to maintain a circular LRU queue
*
* NOTE: Both the CLinkElem list and the CDblLink lists are intrusive.
* therefore, we need to use multiple inheritance to make sure that
* downcasts from CLruLinkElem will work on both CLinkElem pointers
* and CDblLink pointers. See the ARM, p. 221
*/
class CLruLinkElem : public CLinkElem, public CDblLink
{
};
/*
* C L i n k H a s h
*
* CLinkHash differs from CHashTable in that it maintains some extra pointers to
* maintain a threaded lru queue.
*/
class CLinkHash : public CHashTable
{
public:
CLinkHash(HashFunction = DefaultHash);
CLruLinkElem *AddElem(CLruLinkElem *pElem, BOOL fTestDups = TRUE);
CLruLinkElem *FindElem(const void *pvKey, int cbKeyLen);
CLruLinkElem *DeleteElem(const void *pvKey, int cbKeyLen);
CLruLinkElem *RemoveElem(CLruLinkElem *pElem);
// you CANNOT compare LRU nodes to NULL to know if you are at the end
// of the list! Instead use this member.
//
BOOL FLruElemIsEmpty(CLruLinkElem *pElem)
{
pElem->AssertValid();
return pElem == &m_lruHead;
}
CLruLinkElem *Begin() // return pointer to last referenced item
{
return static_cast<CLruLinkElem *>(m_lruHead.PNext());
}
CLruLinkElem *End() // return pointer to least recently accessed item
{
return static_cast<CLruLinkElem *>(m_lruHead.PPrev());
}
void AssertValid() const;
protected:
CDblLink m_lruHead;
};
#ifndef DBG
inline void CLinkHash::AssertValid() const {}
#endif
#endif // LINKHASH_H