LCOV - code coverage report
Current view: top level - runtime_compact/c_base/inc - single_list.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 32 0
Test Date: 2026-08-06 15:29:52 Functions: 0.0 % 6 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 2.0-1