[DAPL2] sync with WinOF 2.1 branch
[mirror/winof/.git] / inc / kernel / index_list.h
1 /*\r
2  * Copyright (c) 2008 Intel Corporation. All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  */\r
29 \r
30 #pragma once\r
31 \r
32 #ifndef _INDEX_LIST_H_\r
33 #define _INDEX_LIST_H_\r
34 \r
35 #include <ntddk.h>\r
36 \r
37 typedef struct _INDEX_ENTRY\r
38 {\r
39         SIZE_T                          Next;\r
40         SIZE_T                          Prev;\r
41         void                            *pItem;\r
42 \r
43 }       INDEX_ENTRY;\r
44 \r
45 extern INDEX_ENTRY EmptyList;\r
46 \r
47 // Synchronization must be provided by the caller.\r
48 typedef struct _INDEX_LIST\r
49 {\r
50         INDEX_ENTRY                     *pArray;  // pArray[0] is list head of used entries\r
51         SIZE_T                          FreeList; // singly-linked list of free INDEX_ENTRY's\r
52         SIZE_T                          Size;\r
53 \r
54 }       INDEX_LIST;\r
55 \r
56 static void IndexListInit(INDEX_LIST *pIndexList)\r
57 {\r
58         pIndexList->pArray = &EmptyList;\r
59         pIndexList->FreeList = 0;\r
60         pIndexList->Size = 0;\r
61 }\r
62 \r
63 static void IndexListDestroy(INDEX_LIST *pIndexList)\r
64 {\r
65         if (pIndexList->pArray != &EmptyList) {\r
66                 ExFreePool(pIndexList->pArray);\r
67         }\r
68 }\r
69 \r
70 SIZE_T IndexListInsertHead(INDEX_LIST *pIndexList, void *pItem);\r
71 \r
72 static void *IndexListAt(INDEX_LIST *pIndexList, SIZE_T Index)\r
73 {\r
74         return (Index < pIndexList->Size) ? pIndexList->pArray[Index].pItem : NULL;\r
75 }\r
76 \r
77 void *IndexListRemove(INDEX_LIST *pIndexList, SIZE_T Index);\r
78 \r
79 static void *IndexListRemoveHead(INDEX_LIST *pIndexList)\r
80 {\r
81         return IndexListRemove(pIndexList, pIndexList->pArray[0].Next);\r
82 }\r
83 \r
84 #define IndexListForEach(pIndexList, Index)                                             \\r
85         for (Index = (pIndexList)->pArray[0].Next; Index != 0;  \\r
86                  Index = (pIndexList)->pArray[Index].Next)\r
87 \r
88 #endif // _INDEX_LIST_H_\r