rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

test_list.c (6092B)


      1 /* Copyright (C) 2013-2023, 2025 Vincent Forest (vaplv@free.fr)
      2  *
      3  * The RSys library is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published
      5  * by the Free Software Foundation, either version 3 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * The RSys library is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with the RSys library. If not, see <http://www.gnu.org/licenses/>. */
     15 
     16 #include "list.h"
     17 #include "mem_allocator.h"
     18 #include "rsys.h"
     19 
     20 int
     21 main(int argc, char** argv)
     22 {
     23   struct elmt {
     24     struct list_node node;
     25     char c;
     26   } elmt0, elmt1, elmt2;
     27   struct list_node list, list1;
     28   struct list_node* n = NULL;
     29   struct list_node* tmp = NULL;
     30   int i = 0;
     31 
     32   (void)argc;
     33   (void)argv;
     34 
     35   list_init(&list);
     36   list_init(&list1);
     37   list_init(&elmt0.node);
     38   list_init(&elmt1.node);
     39   list_init(&elmt2.node);
     40 
     41   CHK(is_list_empty(&list) == 1);
     42 
     43   elmt0.c = 'a';
     44   list_add(&list,  &elmt0.node);
     45   CHK(is_list_empty(&list) == 0);
     46   CHK(list_head(&list) == &elmt0.node);
     47 
     48   elmt1.c = 'b';
     49   list_add(&list,  &elmt1.node);
     50   CHK(is_list_empty(&list) == 0);
     51   CHK(elmt1.node.next == &elmt0.node);
     52   CHK(elmt1.node.prev == &list);
     53   CHK(elmt1.node.next->prev == &elmt1.node);
     54   CHK(list_head(&list) == &elmt1.node);
     55 
     56   elmt2.c = 'c';
     57   list_add_tail(&list,  &elmt2.node);
     58   CHK(is_list_empty(&list) == 0);
     59   CHK(elmt2.node.next == &list);
     60   CHK(elmt2.node.prev == &elmt0.node);
     61   CHK(elmt2.node.prev->prev == &elmt1.node);
     62   CHK(elmt1.node.next->next == &elmt2.node);
     63   CHK(elmt0.node.next == &elmt2.node);
     64   CHK(list_head(&list) == &elmt1.node);
     65   CHK(list_tail(&list) == &elmt2.node);
     66 
     67   list_del(&elmt0.node);
     68   CHK(is_list_empty(&list) == 0);
     69   CHK(elmt2.node.next == &list);
     70   CHK(elmt2.node.prev == &elmt1.node);
     71   CHK(elmt1.node.next == &elmt2.node);
     72   CHK(elmt1.node.prev == &list);
     73   CHK(list_head(&list) == &elmt1.node);
     74   CHK(list_tail(&list) == &elmt2.node);
     75 
     76   list_del(&elmt2.node);
     77   CHK(is_list_empty(&list) == 0);
     78   CHK(elmt1.node.next == &list);
     79   CHK(elmt1.node.prev == &list);
     80   CHK(list_head(&list) == &elmt1.node);
     81   CHK(list_tail(&list) == &elmt1.node);
     82 
     83   list_del(&elmt1.node);
     84   CHK(is_list_empty(&list) == 1);
     85 
     86   list_add(&list,  &elmt2.node);
     87   list_add(&list,  &elmt1.node);
     88   list_add(&list,  &elmt0.node);
     89   CHK(is_list_empty(&list) == 0);
     90   CHK(elmt2.node.next == &list);
     91   CHK(elmt2.node.prev == &elmt1.node);
     92   CHK(elmt1.node.next == &elmt2.node);
     93   CHK(elmt1.node.prev == &elmt0.node);
     94   CHK(elmt0.node.next == &elmt1.node);
     95   CHK(elmt0.node.prev == &list);
     96   CHK(list_head(&list) == &elmt0.node);
     97   CHK(list_tail(&list) == &elmt2.node);
     98 
     99   CHK(is_list_empty(&list1) == 1);
    100   list_move(&elmt1.node, &list1);
    101   CHK(is_list_empty(&list) == 0);
    102   CHK(is_list_empty(&list1) == 0);
    103   CHK(elmt2.node.next == &list);
    104   CHK(elmt2.node.prev == &elmt0.node);
    105   CHK(elmt1.node.next == &list1);
    106   CHK(elmt1.node.prev == &list1);
    107   CHK(elmt0.node.next == &elmt2.node);
    108   CHK(elmt0.node.prev == &list);
    109   CHK(list_head(&list) == &elmt0.node);
    110   CHK(list_tail(&list) == &elmt2.node);
    111   CHK(list_head(&list1) == &elmt1.node);
    112   CHK(list_tail(&list1) == &elmt1.node);
    113 
    114   list_move_tail(&elmt2.node, &list1);
    115   CHK(is_list_empty(&list) == 0);
    116   CHK(is_list_empty(&list1) == 0);
    117   CHK(elmt2.node.next == &list1);
    118   CHK(elmt2.node.prev == &elmt1.node);
    119   CHK(elmt1.node.next == &elmt2.node);
    120   CHK(elmt1.node.prev == &list1);
    121   CHK(elmt0.node.next == &list);
    122   CHK(elmt0.node.prev == &list);
    123   CHK(list_head(&list) == &elmt0.node);
    124   CHK(list_tail(&list) == &elmt0.node);
    125   CHK(list_head(&list1) == &elmt1.node);
    126   CHK(list_tail(&list1) == &elmt2.node);
    127 
    128   list_move(&elmt0.node, &list1);
    129   CHK(is_list_empty(&list) == 1);
    130   CHK(is_list_empty(&list1) == 0);
    131   CHK(elmt2.node.next == &list1);
    132   CHK(elmt2.node.prev == &elmt1.node);
    133   CHK(elmt1.node.next == &elmt2.node);
    134   CHK(elmt1.node.prev == &elmt0.node);
    135   CHK(elmt0.node.next == &elmt1.node);
    136   CHK(elmt0.node.prev == &list1);
    137   CHK(list_head(&list1) == &elmt0.node);
    138   CHK(list_tail(&list1) == &elmt2.node);
    139 
    140   i = 0;
    141   LIST_FOR_EACH(n, &list1) {
    142     struct elmt* e = CONTAINER_OF(n, struct elmt, node);
    143     CHK(e->c == 'a' + i);
    144     ++i;
    145   }
    146   CHK(i == 3);
    147 
    148   i = 3;
    149   LIST_FOR_EACH_REVERSE(n, &list1) {
    150     struct elmt* e = CONTAINER_OF(n, struct elmt, node);
    151     --i;
    152     CHK(e->c == 'a' + i);
    153   }
    154   CHK(i == 0);
    155 
    156   i = 0;
    157   LIST_FOR_EACH_SAFE(n, tmp, &list1) {
    158     struct elmt* e = NULL;
    159     list_move_tail(n, &list);
    160     e = CONTAINER_OF(n, struct elmt, node);
    161     CHK(e->c == 'a' + i);
    162     ++i;
    163   }
    164   CHK(i == 3);
    165   CHK(is_list_empty(&list1) == 1);
    166   CHK(is_list_empty(&list) == 0);
    167 
    168   i = 3;
    169   LIST_FOR_EACH_REVERSE_SAFE(n, tmp, &list) {
    170     struct elmt* e = NULL;
    171     list_move(n, &list1);
    172     e = CONTAINER_OF(n, struct elmt, node);
    173     --i;
    174     CHK(e->c == 'a' + i);
    175   }
    176   CHK(i == 0);
    177   CHK(is_list_empty(&list1) == 0);
    178   CHK(is_list_empty(&list) == 1);
    179 
    180   i = 0;
    181   LIST_FOR_EACH(n, &list1) {
    182     struct elmt* e = CONTAINER_OF(n, struct elmt, node);
    183     CHK(e->c == 'a' + i);
    184     ++i;
    185   }
    186   CHK(i == 3);
    187 
    188   list_move(&elmt1.node, &list1);
    189   CHK(elmt2.node.next == &list1);
    190   CHK(elmt2.node.prev == &elmt0.node);
    191   CHK(elmt1.node.next == &elmt0.node);
    192   CHK(elmt1.node.prev == &list1);
    193   CHK(elmt0.node.next == &elmt2.node);
    194   CHK(elmt0.node.prev == &elmt1.node);
    195   CHK(list_head(&list1) == &elmt1.node);
    196   CHK(list_tail(&list1) == &elmt2.node);
    197 
    198   list_move_tail(&elmt0.node, &list1);
    199   CHK(elmt2.node.next == &elmt0.node);
    200   CHK(elmt2.node.prev == &elmt1.node);
    201   CHK(elmt1.node.next == &elmt2.node);
    202   CHK(elmt1.node.prev == &list1);
    203   CHK(elmt0.node.next == &list1);
    204   CHK(elmt0.node.prev == &elmt2.node);
    205   CHK(list_head(&list1) == &elmt1.node);
    206   CHK(list_tail(&list1) == &elmt0.node);
    207 
    208   CHK(MEM_ALLOCATED_SIZE(&mem_default_allocator) == 0);
    209 
    210   return 0;
    211 }