165 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * \file
 | |
|  *
 | |
|  * \brief List declaration.
 | |
|  *
 | |
|  * Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
 | |
|  *
 | |
|  * \asf_license_start
 | |
|  *
 | |
|  * \page License
 | |
|  *
 | |
|  * Subject to your compliance with these terms, you may use Microchip
 | |
|  * software and any derivatives exclusively with Microchip products.
 | |
|  * It is your responsibility to comply with third party license terms applicable
 | |
|  * to your use of third party software (including open source software) that
 | |
|  * may accompany Microchip software.
 | |
|  *
 | |
|  * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
 | |
|  * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
 | |
|  * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
 | |
|  * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
 | |
|  * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
 | |
|  * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
 | |
|  * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
 | |
|  * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT
 | |
|  * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
 | |
|  * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
 | |
|  * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
 | |
|  *
 | |
|  * \asf_license_stop
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef _UTILS_LIST_H_INCLUDED
 | |
| #define _UTILS_LIST_H_INCLUDED
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|  * \addtogroup doc_driver_hal_utils_list
 | |
|  *
 | |
|  * @{
 | |
|  */
 | |
| 
 | |
| #include <compiler.h>
 | |
| 
 | |
| /**
 | |
|  * \brief List element type
 | |
|  */
 | |
| struct list_element {
 | |
| 	struct list_element *next;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * \brief List head type
 | |
|  */
 | |
| struct list_descriptor {
 | |
| 	struct list_element *head;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * \brief Reset list
 | |
|  *
 | |
|  * \param[in] list The pointer to a list descriptor
 | |
|  */
 | |
| static inline void list_reset(struct list_descriptor *const list)
 | |
| {
 | |
| 	list->head = NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * \brief Retrieve list head
 | |
|  *
 | |
|  * \param[in] list The pointer to a list descriptor
 | |
|  *
 | |
|  * \return A pointer to the head of the given list or NULL if the list is
 | |
|  * empty
 | |
|  */
 | |
| static inline void *list_get_head(const struct list_descriptor *const list)
 | |
| {
 | |
| 	return (void *)list->head;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * \brief Retrieve next list head
 | |
|  *
 | |
|  * \param[in] list The pointer to a list element
 | |
|  *
 | |
|  * \return A pointer to the next list element or NULL if there is not next
 | |
|  * element
 | |
|  */
 | |
| static inline void *list_get_next_element(const void *const element)
 | |
| {
 | |
| 	return element ? ((struct list_element *)element)->next : NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * \brief Insert an element as list head
 | |
|  *
 | |
|  * \param[in] list The pointer to a list element
 | |
|  * \param[in] element An element to insert to the given list
 | |
|  */
 | |
| void list_insert_as_head(struct list_descriptor *const list, void *const element);
 | |
| 
 | |
| /**
 | |
|  * \brief Insert an element after the given list element
 | |
|  *
 | |
|  * \param[in] after An element to insert after
 | |
|  * \param[in] element Element to insert to the given list
 | |
|  */
 | |
| void list_insert_after(void *const after, void *const element);
 | |
| 
 | |
| /**
 | |
|  * \brief Insert an element at list end
 | |
|  *
 | |
|  * \param[in] after An element to insert after
 | |
|  * \param[in] element Element to insert to the given list
 | |
|  */
 | |
| void list_insert_at_end(struct list_descriptor *const list, void *const element);
 | |
| 
 | |
| /**
 | |
|  * \brief Check whether an element belongs to a list
 | |
|  *
 | |
|  * \param[in] list The pointer to a list
 | |
|  * \param[in] element An element to check
 | |
|  *
 | |
|  * \return The result of checking
 | |
|  * \retval true If the given element is an element of the given list
 | |
|  * \retval false Otherwise
 | |
|  */
 | |
| bool is_list_element(const struct list_descriptor *const list, const void *const element);
 | |
| 
 | |
| /**
 | |
|  * \brief Removes list head
 | |
|  *
 | |
|  * This function removes the list head and sets the next element after the list
 | |
|  * head as a new list head.
 | |
|  *
 | |
|  * \param[in] list The pointer to a list
 | |
|  *
 | |
|  * \return The pointer to the new list head of NULL if the list head is NULL
 | |
|  */
 | |
| void *list_remove_head(struct list_descriptor *const list);
 | |
| 
 | |
| /**
 | |
|  * \brief Removes the list element
 | |
|  *
 | |
|  * \param[in] list The pointer to a list
 | |
|  * \param[in] element An element to remove
 | |
|  *
 | |
|  * \return The result of element removing
 | |
|  * \retval true The given element is removed from the given list
 | |
|  * \retval false The given element is not an element of the given list
 | |
|  */
 | |
| bool list_delete_element(struct list_descriptor *const list, const void *const element);
 | |
| 
 | |
| /**@}*/
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| #endif /* _UTILS_LIST_H_INCLUDED */
 |