MdePkg/BaseLib: Add linked list iteration macros

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1959

The macros EFI_LIST_FOR_EACH and EFI_LIST_FOR_EACH_SAFE have been
duplicated across several drivers. These macros have proven useful and
established a commonly used pattern for linked list iteration.

This change defines the macros in BaseLib.h alongside other generic linked
list macros and functions.

Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Guomin Jiang <guomin.jiang@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
Reviewed-by: Bret Barkelew <bret.barkelew@microsoft.com>
This commit is contained in:
Michael Kubacki 2020-04-11 04:02:12 +08:00 committed by mergify[bot]
parent 0f127f3187
commit 3b5a58c5f0
1 changed files with 27 additions and 0 deletions

View File

@ -4,6 +4,7 @@
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@ -2972,6 +2973,32 @@ PathCleanUpDirectories(
**/
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&(ListHead), &(ListHead)}
/**
Iterates over each node in a doubly linked list using each node's forward link.
@param Entry A pointer to a list node used as a loop cursor during iteration
@param ListHead The head node of the doubly linked list
**/
#define BASE_LIST_FOR_EACH(Entry, ListHead) \
for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
/**
Iterates over each node in a doubly linked list using each node's forward link
with safety against node removal.
This macro uses NextEntry to temporarily store the next list node so the node
pointed to by Entry may be deleted in the current loop iteration step and
iteration can continue from the node pointed to by NextEntry.
@param Entry A pointer to a list node used as a loop cursor during iteration
@param NextEntry A pointer to a list node used to temporarily store the next node
@param ListHead The head node of the doubly linked list
**/
#define BASE_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\
Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)
/**
Checks whether FirstEntry and SecondEntry are part of the same doubly-linked