Changeset 55487 in vbox
- Timestamp:
- Apr 28, 2015 3:39:07 PM (9 years ago)
- File:
-
- 1 copied
-
trunk/include/iprt/list-off32.h (copied) (copied from trunk/include/iprt/list.h ) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/list-off32.h
r55474 r55487 1 1 /** @file 2 * IPRT - Generic Doubly Linked List .2 * IPRT - Generic Doubly Linked List, using 32-bit offset instead of pointers. 3 3 */ 4 4 5 5 /* 6 * Copyright (C) 2010-201 1Oracle Corporation6 * Copyright (C) 2010-2015 Oracle Corporation 7 7 * 8 8 * This file is part of VirtualBox Open Source Edition (OSE), as … … 24 24 */ 25 25 26 #ifndef ___iprt_list_ h27 #define ___iprt_list_ h26 #ifndef ___iprt_list_off32_h 27 #define ___iprt_list_off32_h 28 28 29 29 #include <iprt/types.h> 30 30 31 /* * @defgroup grp_rt_list RTList - Generic Doubly Linked List31 /* @defgroup grp_rt_list_off32 RTListOff32 - Generic Doubly Linked List based on 32-bit offset. 32 32 * @ingroup grp_rt 33 33 * 34 * The list implementation is circular without any type wise distintion between 35 * the list and its nodes. This can be confusing since the list head usually 36 * resides in a different structure than the nodes, so care must be taken when 37 * walking the list. 34 * This is the same as @link grp_rt_list, except that instead of pointers we 35 * use 32-bit offsets. The list implementation is circular, with a dummy node 36 * as anchor. Be careful with the dummy node when walking the list. 38 37 * 39 38 * @{ … … 45 44 * A list node of a doubly linked list. 46 45 */ 47 typedef struct RTLIST NODE48 { 49 /** Pointer to the next list node. */50 struct RTLISTNODE *pNext;51 /** Pointer to the previous list node. */52 struct RTLISTNODE *pPrev;53 } RTLIST NODE;46 typedef struct RTLISTOFF32NODE 47 { 48 /** Offset to the next list node, relative to this structure. */ 49 int32_t offNext; 50 /** Offset to the previous list node, relative to this structure. */ 51 int32_t offPrev; 52 } RTLISTOFF32NODE; 54 53 /** Pointer to a list node. */ 55 typedef RTLIST NODE *PRTLISTNODE;54 typedef RTLISTOFF32NODE *PRTLISTOFF32NODE; 56 55 /** Pointer to a const list node. */ 57 typedef RTLIST NODE const *PCRTLISTNODE;56 typedef RTLISTOFF32NODE const *PCRTLISTOFF32NODE; 58 57 /** Pointer to a list node pointer. */ 59 typedef PRTLIST NODE *PPRTLISTNODE;58 typedef PRTLISTOFF32NODE *PPRTLISTOFF32NODE; 60 59 61 60 /** The anchor (head/tail) of a doubly linked list. 62 61 * 63 * @remarks Please use this instead of RTLISTNODE to indicate a list62 * @remarks Please always use this instead of RTLISTOFF32NODE to indicate a list 64 63 * head/tail. It makes the code so much easier to read. Also, 65 * always mention the actual list node type(s) in the comment. */ 66 typedef RTLISTNODE RTLISTANCHOR; 64 * always mention the actual list node type(s) in the comment. 65 * @remarks Must be allocated in a similar manner as the nodes, so as to 66 * keep it within a 32-bit distance from them. 67 */ 68 typedef RTLISTOFF32NODE RTLISTOFF32ANCHOR; 67 69 /** Pointer to a doubly linked list anchor. */ 68 typedef RTLIST ANCHOR *PRTLISTANCHOR;70 typedef RTLISTOFF32ANCHOR *PRTLISTOFF32ANCHOR; 69 71 /** Pointer to a const doubly linked list anchor. */ 70 typedef RTLIST ANCHOR const *PCRTLISTANCHOR;72 typedef RTLISTOFF32ANCHOR const *PCRTLISTOFF32ANCHOR; 71 73 72 74 … … 76 78 * @param pList Pointer to an unitialised list. 77 79 */ 78 DECLINLINE(void) RTListInit(PRTLISTNODE pList) 79 { 80 pList->pNext = pList; 81 pList->pPrev = pList; 82 } 80 DECLINLINE(void) RTListOff32Init(PRTLISTOFF32NODE pList) 81 { 82 pList->offNext = 0; 83 pList->offPrev = 0; 84 } 85 86 /** 87 * Internal macro for converting an offset to a pointer. 88 * @returns PRTLISTOFF32NODE 89 * @param a_pNode The node the offset is relative to. 90 * @param a_off The offset. 91 */ 92 #define RTLISTOFF32_TO_PTR(a_pNode, a_off) ((PRTLISTOFF32NODE)((intptr_t)(a_pNode) + (a_off))) 93 94 /** 95 * Internal macro for getting the pointer to the next node. 96 * @returns PRTLISTOFF32NODE 97 * @param a_pNode The node the offset is relative to. 98 */ 99 #define RTLISTOFF32_NEXT_PTR(a_pNode) RTLISTOFF32_TO_PTR(a_pNode, (a_pNode)->offNext) 100 101 /** 102 * Internal macro for getting the pointer to the previous node. 103 * @returns PRTLISTOFF32NODE 104 * @param a_pNode The node the offset is relative to. 105 */ 106 #define RTLISTOFF32_PREV_PTR(a_pNode) RTLISTOFF32_TO_PTR(a_pNode, (a_pNode)->offPrev) 107 108 /** 109 * Internal macro for converting an a pointer to an offset. 110 * @returns offset 111 * @param a_pNode The node the offset is relative to. 112 * @param a_pOtherNode The pointer to convert. 113 */ 114 #define RTLISTOFF32_TO_OFF(a_pNode, a_pOtherNode) ((int32_t)((intptr_t)(a_pOtherNode) - (intptr_t)(a_pNode))) 115 116 /** 117 * Internal macro for getting the pointer to the next node. 118 * @returns PRTLISTOFF32NODE 119 * @param a_pNode The node which offNext member should be set. 120 * @param a_pNewNext Pointer to the new next node. 121 */ 122 #define RTLISTOFF32_SET_NEXT_PTR(a_pNode, a_pNewNext) \ 123 do { (a_pNode)->offNext = RTLISTOFF32_TO_OFF(a_pNode, a_pNewNext); } while (0) 124 125 /** 126 * Internal macro for getting the pointer to the previous node. 127 * @returns PRTLISTOFF32NODE 128 * @param a_pNode The node which offPrev member should be set. 129 * @param a_pNewPrev Pointer to the new previous node. 130 */ 131 #define RTLISTOFF32_SET_PREV_PTR(a_pNode, a_pNewPrev) \ 132 do { (a_pNode)->offPrev = RTLISTOFF32_TO_OFF(a_pNode, a_pNewPrev); } while (0) 133 134 83 135 84 136 /** … … 88 140 * @param pNode The node to append. 89 141 */ 90 DECLINLINE(void) RTListAppend(PRTLISTNODE pList, PRTLISTNODE pNode) 91 { 92 pList->pPrev->pNext = pNode; 93 pNode->pPrev = pList->pPrev; 94 pNode->pNext = pList; 95 pList->pPrev = pNode; 142 DECLINLINE(void) RTListOff32Append(PRTLISTOFF32NODE pList, PRTLISTOFF32NODE pNode) 143 { 144 PRTLISTOFF32NODE pLast = RTLISTOFF32_PREV_PTR(pList); 145 RTLISTOFF32_SET_NEXT_PTR(pLast, pNode); 146 RTLISTOFF32_SET_PREV_PTR(pNode, pLast); 147 RTLISTOFF32_SET_NEXT_PTR(pNode, pList); 148 RTLISTOFF32_SET_PREV_PTR(pList, pNode); 96 149 } 97 150 … … 102 155 * @param pNode The node to prepend. 103 156 */ 104 DECLINLINE(void) RTListPrepend(PRTLISTNODE pList, PRTLISTNODE pNode) 105 { 106 pList->pNext->pPrev = pNode; 107 pNode->pNext = pList->pNext; 108 pNode->pPrev = pList; 109 pList->pNext = pNode; 157 DECLINLINE(void) RTListOff32Prepend(PRTLISTOFF32NODE pList, PRTLISTOFF32NODE pNode) 158 { 159 PRTLISTOFF32NODE pFirst = RTLISTOFF32_NEXT_PTR(pList); 160 RTLISTOFF32_SET_PREV_PTR(pFirst, pNode); 161 RTLISTOFF32_SET_NEXT_PTR(pNode, pFirst); 162 RTLISTOFF32_SET_PREV_PTR(pNode, pList); 163 RTLISTOFF32_SET_NEXT_PTR(pList, pNode); 110 164 } 111 165 … … 116 170 * @param pNewNode The node to insert. 117 171 */ 118 DECLINLINE(void) RTList NodeInsertAfter(PRTLISTNODE pCurNode, PRTLISTNODE pNewNode)119 { 120 RTList Prepend(pCurNode, pNewNode);172 DECLINLINE(void) RTListOff32NodeInsertAfter(PRTLISTOFF32NODE pCurNode, PRTLISTOFF32NODE pNewNode) 173 { 174 RTListOff32Prepend(pCurNode, pNewNode); 121 175 } 122 176 … … 127 181 * @param pNewNode The node to insert. 128 182 */ 129 DECLINLINE(void) RTList NodeInsertBefore(PRTLISTNODE pCurNode, PRTLISTNODE pNewNode)130 { 131 RTList Append(pCurNode, pNewNode);183 DECLINLINE(void) RTListOff32NodeInsertBefore(PRTLISTOFF32NODE pCurNode, PRTLISTOFF32NODE pNewNode) 184 { 185 RTListOff32Append(pCurNode, pNewNode); 132 186 } 133 187 … … 137 191 * @param pNode The node to remove. 138 192 */ 139 DECLINLINE(void) RTList NodeRemove(PRTLISTNODE pNode)140 { 141 PRTLIST NODE pPrev = pNode->pPrev;142 PRTLIST NODE pNext = pNode->pNext;143 144 pPrev->pNext = pNext;145 pNext->pPrev = pPrev;193 DECLINLINE(void) RTListOff32NodeRemove(PRTLISTOFF32NODE pNode) 194 { 195 PRTLISTOFF32NODE pPrev = RTLISTOFF32_PREV_PTR(pNode); 196 PRTLISTOFF32NODE pNext = RTLISTOFF32_NEXT_PTR(pNode); 197 198 RTLISTOFF32_SET_NEXT_PTR(pPrev, pNext); 199 RTLISTOFF32_SET_PREV_PTR(pNext, pPrev); 146 200 147 201 /* poison */ 148 pNode-> pNext = NULL;149 pNode-> pPrev = NULL;202 pNode->offNext = INT32_MAX / 2; 203 pNode->offPrev = INT32_MAX / 2; 150 204 } 151 205 … … 159 213 * @param pNode The node to check. 160 214 */ 161 #define RTList NodeIsLast(pList, pNode) ((pNode)->pNext== (pList))215 #define RTListOff32NodeIsLast(pList, pNode) (RTLISTOFF32_NEXT_PTR(pNode) == (pList)) 162 216 163 217 /** … … 170 224 * @param pNode The node to check. 171 225 */ 172 #define RTList NodeIsFirst(pList, pNode) ((pNode)->pPrev== (pList))226 #define RTListOff32NodeIsFirst(pList, pNode) (RTLISTOFF32_PREV_PTR(pNode) == (pList)) 173 227 174 228 /** … … 180 234 * @param pList The list. 181 235 * @param pNodeStruct The node structure to check. Typically 182 * something obtained from RTListNodeGetNext() or 183 * RTListNodeGetPrev(). This is NOT a PRTLISTNODE 184 * but something that contains a RTLISTNODE member! 185 * @param Type Structure the list node is a member of. 186 * @param Member The list node member. 187 */ 188 #define RTListNodeIsDummy(pList, pNode, Type, Member) \ 236 * something obtained from RTListOff32NodeGetNext() 237 * or RTListOff32NodeGetPrev(). This is NOT a 238 * PRTLISTOFF32NODE but something that contains a 239 * RTLISTOFF32NODE member! 240 * @param Type Structure the list node is a member of. 241 * @param Member The list node member. 242 */ 243 #define RTListOff32NodeIsDummy(pList, pNode, Type, Member) \ 189 244 ( (pNode) == RT_FROM_MEMBER((pList), Type, Member) ) 190 /** @copydoc RTList NodeIsDummy */191 #define RTList NodeIsDummyCpp(pList, pNode, Type, Member) \245 /** @copydoc RTListOff32NodeIsDummy */ 246 #define RTListOff32NodeIsDummyCpp(pList, pNode, Type, Member) \ 192 247 ( (pNode) == RT_FROM_CPP_MEMBER((pList), Type, Member) ) 193 248 … … 200 255 * @param pList The list to check. 201 256 */ 202 #define RTList IsEmpty(pList) ((pList)->pPrev == (pList))257 #define RTListOff32IsEmpty(pList) ((pList)->offNext == 0) 203 258 204 259 /** … … 211 266 * @param Member The list node member. 212 267 */ 213 #define RTList NodeGetNext(pCurNode, Type, Member) \214 RT_FROM_MEMBER( (pCurNode)->pNext, Type, Member)215 /** @copydoc RTList NodeGetNext */216 #define RTList NodeGetNextCpp(pCurNode, Type, Member) \217 RT_FROM_CPP_MEMBER( (pCurNode)->pNext, Type, Member)268 #define RTListOff32NodeGetNext(pCurNode, Type, Member) \ 269 RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(pCurNode), Type, Member) 270 /** @copydoc RTListOff32NodeGetNext */ 271 #define RTListOff32NodeGetNextCpp(pCurNode, Type, Member) \ 272 RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(pCurNode), Type, Member) 218 273 219 274 /** … … 226 281 * @param Member The list node member. 227 282 */ 228 #define RTList NodeGetPrev(pCurNode, Type, Member) \229 RT_FROM_MEMBER( (pCurNode)->pPrev, Type, Member)230 /** @copydoc RTList NodeGetPrev */231 #define RTList NodeGetPrevCpp(pCurNode, Type, Member) \232 RT_FROM_CPP_MEMBER( (pCurNode)->pPrev, Type, Member)283 #define RTListOff32NodeGetPrev(pCurNode, Type, Member) \ 284 RT_FROM_MEMBER(RTLISTOFF32_PREV_PTR(pCurNode), Type, Member) 285 /** @copydoc RTListOff32NodeGetPrev */ 286 #define RTListOff32NodeGetPrevCpp(pCurNode, Type, Member) \ 287 RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(pCurNode), Type, Member) 233 288 234 289 /** … … 242 297 * @param Member The list node member. 243 298 */ 244 #define RTList GetFirst(pList, Type, Member) \245 ( !RTListIsEmpty(pList) ? RTListNodeGetNext(pList, Type, Member) : NULL)246 /** @copydoc RTList GetFirst */247 #define RTList GetFirstCpp(pList, Type, Member) \248 ( !RTListIsEmpty(pList) ? RTListNodeGetNextCpp(pList, Type, Member) : NULL)299 #define RTListOff32GetFirst(pList, Type, Member) \ 300 ((pList)->offNext != 0 ? RTListOff32NodeGetNext(pList, Type, Member) : NULL) 301 /** @copydoc RTListOff32GetFirst */ 302 #define RTListOff32GetFirstCpp(pList, Type, Member) \ 303 ((pList)->offNext != 0 ? RTListOff32NodeGetNextCpp(pList, Type, Member) : NULL) 249 304 250 305 /** … … 258 313 * @param Member The list node member. 259 314 */ 260 #define RTList GetLast(pList, Type, Member) \261 ( !RTListIsEmpty(pList) ? RTListNodeGetPrev(pList, Type, Member) : NULL)262 /** @copydoc RTList GetLast */263 #define RTList GetLastCpp(pList, Type, Member) \264 ( !RTListIsEmpty(pList) ? RTListNodeGetPrevCpp(pList, Type, Member) : NULL)315 #define RTListOff32GetLast(pList, Type, Member) \ 316 ((pList)->offPrev != 0 ? RTListOff32NodeGetPrev(pList, Type, Member) : NULL) 317 /** @copydoc RTListOff32GetLast */ 318 #define RTListOff32GetLastCpp(pList, Type, Member) \ 319 ((pList)->offPrev != 0 ? RTListOff32NodeGetPrevCpp(pList, Type, Member) : NULL) 265 320 266 321 /** … … 274 329 * @param Member The list node member. 275 330 */ 276 #define RTListGetNext(pList, pCurNode, Type, Member) \ 277 ( (pCurNode)->Member.pNext != (pList) ? RT_FROM_MEMBER((pCurNode)->Member.pNext, Type, Member) : NULL ) 278 /** @copydoc RTListGetNext */ 279 #define RTListGetNextCpp(pList, pCurNode, Type, Member) \ 280 ( (pCurNode)->Member.pNext != (pList) ? RT_FROM_CPP_MEMBER((pCurNode)->Member.pNext, Type, Member) : NULL ) 331 #define RTListOff32GetNext(pList, pCurNode, Type, Member) \ 332 ( RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member) != (pList) \ 333 ? RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member), Type, Member) : NULL ) 334 /** @copydoc RTListOff32GetNext */ 335 #define RTListOff32GetNextCpp(pList, pCurNode, Type, Member) \ 336 ( RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member) != (pList) \ 337 ? RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member), Type, Member) : NULL ) 281 338 282 339 /** … … 290 347 * @param Member The list node member. 291 348 */ 292 #define RTListGetPrev(pList, pCurNode, Type, Member) \ 293 ( (pCurNode)->Member.pPrev != (pList) ? RT_FROM_MEMBER((pCurNode)->Member.pPrev, Type, Member) : NULL ) 294 /** @copydoc RTListGetPrev */ 295 #define RTListGetPrevCpp(pList, pCurNode, Type, Member) \ 296 ( (pCurNode)->Member.pPrev != (pList) ? RT_FROM_CPP_MEMBER((pCurNode)->Member.pPrev, Type, Member) : NULL ) 349 #define RTListOff32GetPrev(pList, pCurNode, Type, Member) \ 350 ( RTLISTOFF32_PREV_PTR(&(pCurNode)->Member) != (pList) \ 351 ? RT_FROM_MEMBER(RTLISTOFF32_PREV_PTR(&(pCurNode)->Member), Type, Member) : NULL ) 352 /** @copydoc RTListOff32GetPrev */ 353 #define RTListOff32GetPrevCpp(pList, pCurNode, Type, Member) \ 354 ( RTLISTOFF32_PREV_PTR(&(pCurNode)->Member) != (pList) \ 355 ? RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(&(pCurNode)->Member), Type, Member) : NULL ) 297 356 298 357 /** … … 304 363 * @param Member The list node member name. 305 364 */ 306 #define RTList ForEach(pList, pIterator, Type, Member) \307 for (pIterator = RTList NodeGetNext(pList, Type, Member); \308 !RTList NodeIsDummy(pList, pIterator, Type, Member); \309 pIterator = RT_FROM_MEMBER( (pIterator)->Member.pNext, Type, Member) )310 /** @copydoc RTList ForEach */311 #define RTList ForEachCpp(pList, pIterator, Type, Member) \312 for (pIterator = RTList NodeGetNextCpp(pList, Type, Member); \313 !RTList NodeIsDummyCpp(pList, pIterator, Type, Member); \314 pIterator = RT_FROM_CPP_MEMBER( (pIterator)->Member.pNext, Type, Member) )365 #define RTListOff32ForEach(pList, pIterator, Type, Member) \ 366 for (pIterator = RTListOff32NodeGetNext(pList, Type, Member); \ 367 !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \ 368 pIterator = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 369 /** @copydoc RTListOff32ForEach */ 370 #define RTListOff32ForEachCpp(pList, pIterator, Type, Member) \ 371 for (pIterator = RTListOff32NodeGetNextCpp(pList, Type, Member); \ 372 !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \ 373 pIterator = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 315 374 316 375 … … 326 385 * @param Member The list node member name. 327 386 */ 328 #define RTList ForEachSafe(pList, pIterator, pIterNext, Type, Member) \329 for (pIterator = RTList NodeGetNext(pList, Type, Member), \330 pIterNext = RT_FROM_MEMBER( (pIterator)->Member.pNext, Type, Member); \331 !RTList NodeIsDummy(pList, pIterator, Type, Member); \387 #define RTListOff32ForEachSafe(pList, pIterator, pIterNext, Type, Member) \ 388 for (pIterator = RTListOff32NodeGetNext(pList, Type, Member), \ 389 pIterNext = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \ 390 !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \ 332 391 pIterator = pIterNext, \ 333 pIterNext = RT_FROM_MEMBER( (pIterator)->Member.pNext, Type, Member) )334 /** @copydoc RTList ForEachSafe */335 #define RTList ForEachSafeCpp(pList, pIterator, pIterNext, Type, Member) \336 for (pIterator = RTList NodeGetNextCpp(pList, Type, Member), \337 pIterNext = RT_FROM_CPP_MEMBER( (pIterator)->Member.pNext, Type, Member); \338 !RTList NodeIsDummyCpp(pList, pIterator, Type, Member); \392 pIterNext = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 393 /** @copydoc RTListOff32ForEachSafe */ 394 #define RTListOff32ForEachSafeCpp(pList, pIterator, pIterNext, Type, Member) \ 395 for (pIterator = RTListOff32NodeGetNextCpp(pList, Type, Member), \ 396 pIterNext = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \ 397 !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \ 339 398 pIterator = pIterNext, \ 340 pIterNext = RT_FROM_CPP_MEMBER( (pIterator)->Member.pNext, Type, Member) )399 pIterNext = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 341 400 342 401 … … 349 408 * @param Member The list node member name. 350 409 */ 351 #define RTList ForEachReverse(pList, pIterator, Type, Member) \352 for (pIterator = RTList NodeGetPrev(pList, Type, Member); \353 !RTList NodeIsDummy(pList, pIterator, Type, Member); \354 pIterator = RT_FROM_MEMBER( (pIterator)->Member.pPrev, Type, Member) )355 /** @copydoc RTList ForEachReverse */356 #define RTList ForEachReverseCpp(pList, pIterator, Type, Member) \357 for (pIterator = RTList NodeGetPrevCpp(pList, Type, Member); \358 !RTList NodeIsDummyCpp(pList, pIterator, Type, Member); \359 pIterator = RT_FROM_CPP_MEMBER( (pIterator)->Member.pPrev, Type, Member) )410 #define RTListOff32ForEachReverse(pList, pIterator, Type, Member) \ 411 for (pIterator = RTListOff32NodeGetPrev(pList, Type, Member); \ 412 !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \ 413 pIterator = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 414 /** @copydoc RTListOff32ForEachReverse */ 415 #define RTListOff32ForEachReverseCpp(pList, pIterator, Type, Member) \ 416 for (pIterator = RTListOff32NodeGetPrevCpp(pList, Type, Member); \ 417 !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \ 418 pIterator = RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(&(pIterator)->Member), Type, Member) ) 360 419 361 420 … … 370 429 * @param Member The list node member name. 371 430 */ 372 #define RTList ForEachReverseSafe(pList, pIterator, pIterPrev, Type, Member) \373 for (pIterator = RTList NodeGetPrev(pList, Type, Member), \374 pIterPrev = RT_FROM_MEMBER( (pIterator)->Member.pPrev, Type, Member); \375 !RTList NodeIsDummy(pList, pIterator, Type, Member); \431 #define RTListOff32ForEachReverseSafe(pList, pIterator, pIterPrev, Type, Member) \ 432 for (pIterator = RTListOff32NodeGetPrev(pList, Type, Member), \ 433 pIterPrev = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \ 434 !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \ 376 435 pIterator = pIterPrev, \ 377 pIterPrev = RT_FROM_MEMBER( (pIterator)->Member.pPrev, Type, Member) )378 /** @copydoc RTList ForEachReverseSafe */379 #define RTList ForEachReverseSafeCpp(pList, pIterator, pIterPrev, Type, Member) \380 for (pIterator = RTList NodeGetPrevCpp(pList, Type, Member), \381 pIterPrev = RT_FROM_CPP_MEMBER( (pIterator)->Member.pPrev, Type, Member); \382 !RTList NodeIsDummyCpp(pList, pIterator, Type, Member); \436 pIterPrev = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 437 /** @copydoc RTListOff32ForEachReverseSafe */ 438 #define RTListOff32ForEachReverseSafeCpp(pList, pIterator, pIterPrev, Type, Member) \ 439 for (pIterator = RTListOff32NodeGetPrevCpp(pList, Type, Member), \ 440 pIterPrev = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \ 441 !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \ 383 442 pIterator = pIterPrev, \ 384 pIterPrev = RT_FROM_CPP_MEMBER( (pIterator)->Member.pPrev, Type, Member) )443 pIterPrev = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) ) 385 444 386 445 … … 391 450 * @param pListSrc The list to move. 392 451 */ 393 DECLINLINE(void) RTList Move(PRTLISTNODE pListDst, PRTLISTNODE pListSrc)394 { 395 if (!RTList IsEmpty(pListSrc))452 DECLINLINE(void) RTListOff32Move(PRTLISTOFF32NODE pListDst, PRTLISTOFF32NODE pListSrc) 453 { 454 if (!RTListOff32IsEmpty(pListSrc)) 396 455 { 397 pListDst->pNext = pListSrc->pNext; 398 pListDst->pPrev = pListSrc->pPrev; 456 PRTLISTOFF32NODE pFirst = RTLISTOFF32_NEXT_PTR(pListSrc); 457 PRTLISTOFF32NODE pLast = RTLISTOFF32_PREV_PTR(pListSrc); 458 459 RTLISTOFF32_SET_NEXT_PTR(pListDst, pFirst); 460 RTLISTOFF32_SET_PREV_PTR(pListDst, pLast); 399 461 400 462 /* Adjust the first and last element links */ 401 pListDst->pNext->pPrev = pListDst;402 pListDst->pPrev->pNext = pListDst;463 RTLISTOFF32_SET_NEXT_PTR(pLast, pListDst); 464 RTLISTOFF32_SET_PREV_PTR(pFirst, pListDst); 403 465 404 466 /* Finally remove the elements from the source list */ 405 RTList Init(pListSrc);467 RTListOff32Init(pListSrc); 406 468 } 407 469 } … … 414 476 * @param pListSrc The source list to concatenate. 415 477 */ 416 DECLINLINE(void) RTList Concatenate(PRTLISTANCHOR pListDst, PRTLISTANCHOR pListSrc)417 { 418 if (!RTList IsEmpty(pListSrc))478 DECLINLINE(void) RTListOff32Concatenate(PRTLISTOFF32ANCHOR pListDst, PRTLISTOFF32ANCHOR pListSrc) 479 { 480 if (!RTListOff32IsEmpty(pListSrc)) 419 481 { 420 PRTLISTNODE pFirst = pListSrc->pNext; 421 PRTLISTNODE pLast = pListSrc->pPrev; 422 423 pListDst->pPrev->pNext = pFirst; 424 pFirst->pPrev = pListDst->pPrev; 425 pLast->pNext = pListDst; 426 pListDst->pPrev = pLast; 482 PRTLISTOFF32NODE pFirstSrc = RTLISTOFF32_NEXT_PTR(pListSrc); 483 PRTLISTOFF32NODE pLastSrc = RTLISTOFF32_PREV_PTR(pListSrc); 484 PRTLISTOFF32NODE pLastDst = RTLISTOFF32_PREV_PTR(pListDst); 485 486 RTLISTOFF32_SET_NEXT_PTR(pLastDst, pFirstSrc); 487 RTLISTOFF32_SET_PREV_PTR(pFirstSrc, pLastDst); 488 489 RTLISTOFF32_SET_NEXT_PTR(pLastSrc, pListDst); 490 RTLISTOFF32_SET_PREV_PTR(pListDst, pLastSrc); 427 491 428 492 /* Finally remove the elements from the source list */ 429 RTList Init(pListSrc);493 RTListOff32Init(pListSrc); 430 494 } 431 495 } … … 436 500 437 501 #endif 502
Note:
See TracChangeset
for help on using the changeset viewer.

