148 lines
3.1 KiB
C
148 lines
3.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
regstate.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains declarations for data structures
|
||
|
needed for maintaining state for registry key objects
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Adam Edwards (adamed) 14-Nov-1997
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This file contains declarations for an object which
|
||
|
can be stored in a collection. The collection is a linked
|
||
|
list, whose most frequently accessed members are at the
|
||
|
front of the list. Thus it is optimized for situations
|
||
|
in which the same object may be asked for repeatedly.
|
||
|
|
||
|
To use this list, you should create structures which
|
||
|
inherit from the base object (StateObject). Each object
|
||
|
has a key which must be specified when you create a new
|
||
|
object. The key is used in searches and removes. The objects
|
||
|
must all have disinct keys, but this is not enforced by the list --
|
||
|
the caller should be sure to avoid duplicates.
|
||
|
|
||
|
Note that the list does not allocate or free objects --
|
||
|
it simply allows them to be added, removed, and searched
|
||
|
for in the list. You will need to initialize any object
|
||
|
before putting it into the list with the StateObjectInit
|
||
|
function.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifdef LOCAL
|
||
|
|
||
|
#if !defined(_REGSTATE_H_)
|
||
|
#define _REGSTATE_H_
|
||
|
|
||
|
|
||
|
//
|
||
|
// Data types
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// StateObject
|
||
|
//
|
||
|
// This is the base type -- any object used with the list must
|
||
|
// inherit from this object
|
||
|
//
|
||
|
typedef struct _StateObject
|
||
|
{
|
||
|
LIST_ENTRY Links;
|
||
|
PVOID pvKey;
|
||
|
} StateObject;
|
||
|
|
||
|
//
|
||
|
// Pointer type for a caller supplied function used to
|
||
|
// destroy objects (de-allocate memory, free resources, etc)
|
||
|
//
|
||
|
typedef VOID (*PFNDestroyObject) (StateObject* pObject);
|
||
|
|
||
|
|
||
|
//
|
||
|
// StateObjectList
|
||
|
//
|
||
|
// This is a linked list of StateObjects, with the most frequently accessed
|
||
|
// elements at the front of the list. If the same item is
|
||
|
// accessed repeatedly, it is found immediately in search
|
||
|
// operations. Note that the list is itself a StateObject, so
|
||
|
// the list type can be composed with itself.
|
||
|
//
|
||
|
typedef struct _StateObjectList
|
||
|
{
|
||
|
StateObject Object;
|
||
|
StateObject* pHead;
|
||
|
} StateObjectList;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Exported prototypes
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Initializes a StateObject -- must be called before
|
||
|
// the object is used
|
||
|
//
|
||
|
VOID StateObjectInit(
|
||
|
StateObject* pObject,
|
||
|
PVOID pvKey);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Initializes a StateObjectList -- must be called before
|
||
|
// the list is used
|
||
|
//
|
||
|
VOID StateObjectListInit(
|
||
|
StateObjectList* pList,
|
||
|
PVOID pvKey);
|
||
|
|
||
|
//
|
||
|
// Tells whether or not a list is empty
|
||
|
//
|
||
|
BOOL StateObjectListIsEmpty(StateObjectList* pList);
|
||
|
|
||
|
//
|
||
|
// Removes an object from the list
|
||
|
//
|
||
|
StateObject* StateObjectListRemove(
|
||
|
StateObjectList* pList,
|
||
|
PVOID pvKey);
|
||
|
|
||
|
//
|
||
|
// Finds an object in the list
|
||
|
//
|
||
|
StateObject* StateObjectListFind(
|
||
|
StateObjectList* pList,
|
||
|
PVOID pvKey);
|
||
|
|
||
|
//
|
||
|
// Adds an object to the list
|
||
|
//
|
||
|
VOID StateObjectListAdd(
|
||
|
StateObjectList* pList,
|
||
|
StateObject* pObject);
|
||
|
|
||
|
//
|
||
|
// Removes all objects from the list and
|
||
|
// destroys them.
|
||
|
//
|
||
|
VOID StateObjectListClear(
|
||
|
StateObjectList* pList,
|
||
|
PFNDestroyObject pfnDestroy);
|
||
|
|
||
|
|
||
|
#endif // _REGSTATE_H_
|
||
|
|
||
|
#endif // LOCAL
|
||
|
|
||
|
|
||
|
|