LCOV - code coverage report
Current view: top level - runtime/c/c_base/inc - single_list.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 32 0.0 %
Date: 2026-08-27 13:24:42 Functions: 0 6 0.0 %

          Line data    Source code
       1             : /**
       2             :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3             :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4             :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5             :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6             :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7             :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8             :  * See LICENSE in the root of the software repository for the full text of the License.
       9             :  */
      10             : #ifndef C_BASE_SINGLE_LIST_H
      11             : #define C_BASE_SINGLE_LIST_H
      12             : #include "c_base.h"
      13             : #ifdef __cplusplus
      14             : extern "C" {
      15             : #endif
      16             : typedef struct CSingleListNode {
      17             :     struct CSingleListNode *next;
      18             : } CSingleListNode;
      19             : 
      20             : typedef struct {
      21             :     CSingleListNode *head;
      22             :     CSingleListNode *tail;
      23             : } CSingleList;
      24             : 
      25             : /**
      26             :  * You can use this macro to initialize the linked list while defining it,
      27             :  *  or use the function InitCSingleList to initialize it before use
      28             :  */
      29             : #define CSINGLE_LIST_INIT {NULL, NULL}
      30             : #define CSingleListNext(curNode) ((curNode) != NULL) ? (curNode)->next : NULL
      31             : 
      32             : /**
      33             :  * Through this macro, the traversal of the linked list can be realized.
      34             :  *  The user needs to define the loop variables curNode, nextNode,
      35             :  *  and the loop variable does not need to be initialized.
      36             :  */
      37             : #define CSingleListForEach(list, curNode, nextNode)                                          \
      38             :     for ((curNode) = (list)->head, (nextNode) = CSingleListNext(curNode); (curNode) != NULL; \
      39             :          (curNode) = (nextNode), (nextNode) = CSingleListNext(nextNode))
      40             : 
      41           0 : static inline void InitCSingleList(CSingleList *list)
      42             : {
      43           0 :     list->head = NULL;
      44           0 :     list->tail = NULL;
      45           0 : }
      46             : 
      47           0 : static inline bool IsSingleListEmpty(CSingleList *list)
      48             : {
      49           0 :     return list->head == NULL;
      50             : }
      51             : 
      52           0 : static inline CSingleListNode* GetSingleListHead(CSingleList *list)
      53             : {
      54           0 :     return list->head;
      55             : }
      56             : 
      57             : static inline void InsertCSingleListHead(CSingleList *list, CSingleListNode *insertNode)
      58             : {
      59             :     insertNode->next = list->head;
      60             :     list->head = insertNode;
      61             :     if (list->tail == NULL) {
      62             :         list->tail = insertNode;
      63             :     }
      64             : }
      65             : 
      66           0 : static inline void InsertCSingleListTail(CSingleList *list, CSingleListNode *insertNode)
      67             : {
      68           0 :     insertNode->next = NULL;
      69           0 :     if (list->tail == NULL) {
      70           0 :         list->head = insertNode;
      71             :     } else {
      72           0 :         list->tail->next = insertNode;
      73             :     }
      74           0 :     list->tail = insertNode;
      75           0 : }
      76             : 
      77             : static inline void InsertCSingleList(CSingleList *list, CSingleListNode *listNode, CSingleListNode *insertNode)
      78             : {
      79             :     insertNode->next = listNode->next;
      80             :     listNode->next = insertNode;
      81             :     if (list->tail == listNode) {
      82             :         list->tail = insertNode;
      83             :     }
      84             : }
      85             : 
      86           0 : static inline void RemoveCSingleListNode(CSingleList *list, CSingleListNode *listNode)
      87             : {
      88             :     CSingleListNode *curNode;
      89             :     CSingleListNode *nextNode;
      90           0 :     CSingleListNode *preNode = NULL;
      91           0 :     CSingleListForEach(list, curNode, nextNode) {
      92           0 :         if (curNode != listNode) {
      93           0 :             preNode = curNode;
      94           0 :             continue;
      95             :         }
      96             : 
      97           0 :         if (preNode == NULL) {
      98           0 :             list->head = nextNode;
      99           0 :             if (list->head == NULL) {
     100           0 :                 list->tail = NULL;
     101             :             }
     102             :         } else {
     103           0 :             preNode->next = curNode->next;
     104           0 :             if (nextNode == NULL) {
     105           0 :                 list->tail = preNode;
     106             :             }
     107             :         }
     108             :     }
     109           0 : }
     110             : 
     111           0 : static inline void RemoveCSingleListHead(CSingleList *list)
     112             : {
     113           0 :     RemoveCSingleListNode(list, list->head);
     114           0 : }
     115             : 
     116             : static inline void RemoveCSingleListTail(CSingleList *list)
     117             : {
     118             :     RemoveCSingleListNode(list, list->tail);
     119             : }
     120             : #ifdef __cplusplus
     121             : }
     122             : #endif
     123             : #endif // C_BASE_SINGLE_LIST_H

Generated by: LCOV version 1.14