pinebuds/services/bt_profiles_enhanced/inc/bt_co_list.h

104 lines
3.8 KiB
C
Raw Normal View History

2022-08-15 04:20:27 -05:00
/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __BT_CO_LIST_H__
#define __BT_CO_LIST_H__
#include "btlib_more.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ITER_WARN "list too much loop=%d!!!!"
#if !defined(ITER_ASSERT)
#if defined(ASSERT_SHOW_FILE_FUNC)
#define ITER_ASSERT(head) hal_trace_assert_dump(__FILE__, __FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
#elif defined(ASSERT_SHOW_FILE)
#define ITER_ASSERT(head) hal_trace_assert_dump(__FILE__, __FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
#elif defined(ASSERT_SHOW_FUNC)
#define ITER_ASSERT(head) hal_trace_assert_dump(__FUNCTION__, __LINE__, ITER_WARN, (head)->__iter__cnt)
#else
#define ITER_ASSERT(head) hal_trace_assert_dump(ITER_WARN, (head)->__iter__cnt)
#endif
#endif /* ITER_ASSERT */
#if 1
#define ITER_INIT(head) ,(head)->__iter__cnt = 0
#define ITER_CHK(head) ,((head)->__iter__cnt>100?ITER_ASSERT((head)):(void)((head)->__iter__cnt++))
#else
#define ITER_INIT(head)
#define ITER_CHK(head)
#endif
#ifndef OFFSETOF
#define OFFSETOF(type, member) ((unsigned int) &((type *)0)->member)
#endif
#ifndef CONTAINER_OF
#define CONTAINER_OF(ptr, type, member) ((type *)( (char *)ptr - OFFSETOF(type,member) ))
#endif
struct list_node {
struct list_node *next;
struct list_node *prev;
unsigned int __iter__cnt;
};
#define DEF_LIST_HEAD(head) \
struct list_node head = { &(head), &(head) }
#define INIT_LIST_HEAD(head) do { \
(head)->next = (head); (head)->prev = (head); \
} while (0)
void colist_addto_head(struct list_node *n, struct list_node *head);
void colist_addto_tail(struct list_node *n, struct list_node *head);
void colist_delete(struct list_node *entry);
void colist_moveto_head(struct list_node *list, struct list_node *head);
int colist_is_node_on_list(struct list_node *list, struct list_node *node);
struct list_node *colist_get_head(struct list_node *head);
int colist_is_list_empty(struct list_node *head);
#define colist_structure(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
#define colist_iterate(pos, head) \
for (pos = (head)->next ITER_INIT((head)); pos != (head); \
pos = pos->next ITER_CHK((head)))
#define colist_iterate_prev(pos, head) \
for (pos = (head)->prev ITER_INIT((head)); pos != (head); \
pos = pos->prev ITER_CHK((head))
#define colist_iterate_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next ITER_INIT((head)); pos != (head); \
pos = n, n = pos->next ITER_CHK((head)))
#define colist_iterate_entry(pos, type, head, member) \
for (pos = colist_structure((head)->next, type, member) ITER_INIT((head)); \
&pos->member != (head); \
pos = colist_structure(pos->member.next, type, member) ITER_CHK((head)))
#define colist_iterate_entry_safe(pos, n, type, head, member) \
for (pos = colist_structure((head)->next, type, member), \
n = colist_structure(pos->member.next, type, member) ITER_INIT((head)); \
&pos->member != (head); \
pos = n, n = colist_structure(n->member.next, type, member) ITER_CHK((head)))
#ifdef __cplusplus
}
#endif
#endif /* __BT_CO_LIST_H__ */