acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_ll.h (4162B)

      1 /**
      2  * @file lv_ll.h
      3  * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module.
      4  */
      5 
      6 #ifndef LV_LL_H
      7 #define LV_LL_H
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 /*********************
     14  *      INCLUDES
     15  *********************/
     16 #include <stdint.h>
     17 #include <stddef.h>
     18 #include <stdbool.h>
     19 
     20 /*********************
     21  *      DEFINES
     22  *********************/
     23 
     24 /**********************
     25  *      TYPEDEFS
     26  **********************/
     27 
     28 /** Dummy type to make handling easier*/
     29 typedef uint8_t lv_ll_node_t;
     30 
     31 /** Description of a linked list*/
     32 typedef struct {
     33     uint32_t n_size;
     34     lv_ll_node_t * head;
     35     lv_ll_node_t * tail;
     36 } lv_ll_t;
     37 
     38 /**********************
     39  * GLOBAL PROTOTYPES
     40  **********************/
     41 
     42 /**
     43  * Initialize linked list
     44  * @param ll_p pointer to lv_ll_t variable
     45  * @param node_size the size of 1 node in bytes
     46  */
     47 void _lv_ll_init(lv_ll_t * ll_p, uint32_t node_size);
     48 
     49 /**
     50  * Add a new head to a linked list
     51  * @param ll_p pointer to linked list
     52  * @return pointer to the new head
     53  */
     54 void * _lv_ll_ins_head(lv_ll_t * ll_p);
     55 
     56 /**
     57  * Insert a new node in front of the n_act node
     58  * @param ll_p pointer to linked list
     59  * @param n_act pointer a node
     60  * @return pointer to the new node
     61  */
     62 void * _lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act);
     63 
     64 /**
     65  * Add a new tail to a linked list
     66  * @param ll_p pointer to linked list
     67  * @return pointer to the new tail
     68  */
     69 void * _lv_ll_ins_tail(lv_ll_t * ll_p);
     70 
     71 /**
     72  * Remove the node 'node_p' from 'll_p' linked list.
     73  * It does not free the memory of node.
     74  * @param ll_p pointer to the linked list of 'node_p'
     75  * @param node_p pointer to node in 'll_p' linked list
     76  */
     77 void _lv_ll_remove(lv_ll_t * ll_p, void * node_p);
     78 
     79 /**
     80  * Remove and free all elements from a linked list. The list remain valid but become empty.
     81  * @param ll_p pointer to linked list
     82  */
     83 void _lv_ll_clear(lv_ll_t * ll_p);
     84 
     85 /**
     86  * Move a node to a new linked list
     87  * @param ll_ori_p pointer to the original (old) linked list
     88  * @param ll_new_p pointer to the new linked list
     89  * @param node pointer to a node
     90  * @param head true: be the head in the new list
     91  *             false be the tail in the new list
     92  */
     93 void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head);
     94 
     95 /**
     96  * Return with head node of the linked list
     97  * @param ll_p pointer to linked list
     98  * @return pointer to the head of 'll_p'
     99  */
    100 void * _lv_ll_get_head(const lv_ll_t * ll_p);
    101 
    102 /**
    103  * Return with tail node of the linked list
    104  * @param ll_p pointer to linked list
    105  * @return pointer to the tail of 'll_p'
    106  */
    107 void * _lv_ll_get_tail(const lv_ll_t * ll_p);
    108 
    109 /**
    110  * Return with the pointer of the next node after 'n_act'
    111  * @param ll_p pointer to linked list
    112  * @param n_act pointer a node
    113  * @return pointer to the next node
    114  */
    115 void * _lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act);
    116 
    117 /**
    118  * Return with the pointer of the previous node after 'n_act'
    119  * @param ll_p pointer to linked list
    120  * @param n_act pointer a node
    121  * @return pointer to the previous node
    122  */
    123 void * _lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act);
    124 
    125 /**
    126  * Return the length of the linked list.
    127  * @param ll_p pointer to linked list
    128  * @return length of the linked list
    129  */
    130 uint32_t _lv_ll_get_len(const lv_ll_t * ll_p);
    131 
    132 /**
    133  * TODO
    134  * @param ll_p
    135  * @param n1_p
    136  * @param n2_p
    137 void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p);
    138  */
    139 
    140 /**
    141  * Move a node before an other node in the same linked list
    142  * @param ll_p pointer to a linked list
    143  * @param n_act pointer to node to move
    144  * @param n_after pointer to a node which should be after `n_act`
    145  */
    146 void _lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after);
    147 
    148 /**
    149  * Check if a linked list is empty
    150  * @param ll_p pointer to a linked list
    151  * @return true: the linked list is empty; false: not empty
    152  */
    153 bool _lv_ll_is_empty(lv_ll_t * ll_p);
    154 
    155 /**********************
    156  *      MACROS
    157  **********************/
    158 
    159 #define _LV_LL_READ(list, i) for(i = _lv_ll_get_head(list); i != NULL; i = _lv_ll_get_next(list, i))
    160 
    161 #define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(list); i != NULL; i = _lv_ll_get_prev(list, i))
    162 
    163 #ifdef __cplusplus
    164 } /*extern "C"*/
    165 #endif
    166 
    167 #endif