0f75281d1b710e502987d73076456acf25a0b75a
[vpp.git] / vppinfra / vppinfra / test_dlist.c
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <vppinfra/dlist.h>
17
18 typedef struct {
19   dlist_elt_t * test_pool;
20   u32 head_index;
21 } test_main_t;
22
23 test_main_t test_main;
24
25 int test_dlist_main (unformat_input_t * input)
26 {
27   test_main_t * tm = &test_main;
28   dlist_elt_t * head, * elt;
29   u32 elt_index, head_index;
30   u32 value;
31   int i;
32   
33   pool_get (tm->test_pool, head);
34   head_index = head - tm->test_pool;
35   clib_dlist_init (tm->test_pool, head - tm->test_pool);
36
37   for (i = 1; i <= 3; i++)
38     {
39       pool_get (tm->test_pool, elt);
40       elt_index = elt - tm->test_pool;
41
42       clib_dlist_init (tm->test_pool, elt_index);
43       elt->value = i;
44       clib_dlist_addtail (tm->test_pool, head_index, elt_index);
45     }
46
47   head = pool_elt_at_index (tm->test_pool, head_index);
48
49   fformat (stdout, "Dump forward links\n");
50   elt_index = head->next;
51   i = 1;
52   value = 0;
53   while (value != ~0)
54     {
55       elt = pool_elt_at_index (tm->test_pool, elt_index);
56       fformat(stdout, "elt %d value %d\n", 
57               i++, elt->value);
58       elt_index = elt->next;
59       value = elt->value;
60     }
61
62   fformat (stdout, "Dump reverse links\n");
63   elt_index = head->prev;
64   i = 1;
65   value = 0;
66   while (value != ~0)
67     {
68       elt = pool_elt_at_index (tm->test_pool, elt_index);
69       fformat(stdout, "elt %d value %d\n", 
70               i++, elt->value);
71       elt_index = elt->prev;
72       value = elt->value;
73     }
74
75   fformat (stdout, "remove first element\n");
76
77   elt_index = clib_dlist_remove_head (tm->test_pool, head_index);
78   elt = pool_elt_at_index (tm->test_pool, elt_index);
79
80   fformat (stdout, "removed index %d value %d\n", elt_index, elt->value);
81
82   head = pool_elt_at_index (tm->test_pool, head_index);
83
84   fformat (stdout, "Dump forward links\n");
85   elt_index = head->next;
86   i = 1;
87   value = 0;
88   while (value != ~0)
89     {
90       elt = pool_elt_at_index (tm->test_pool, elt_index);
91       fformat(stdout, "elt %d value %d\n", 
92               i++, elt->value);
93       elt_index = elt->next;
94       value = elt->value;
95     }
96
97   fformat (stdout, "Dump reverse links\n");
98   elt_index = head->prev;
99   i = 1;
100   value = 0;
101   while (value != ~0)
102     {
103       elt = pool_elt_at_index (tm->test_pool, elt_index);
104       fformat(stdout, "elt %d value %d\n", 
105               i++, elt->value);
106       elt_index = elt->prev;
107       value = elt->value;
108     }
109
110   fformat (stdout, "re-insert index %d value %d at head\n", 1, 1);
111
112   clib_dlist_addhead (tm->test_pool, head_index, 1);
113
114   fformat (stdout, "Dump forward links\n");
115   elt_index = head->next;
116   i = 1;
117   value = 0;
118   while (value != ~0)
119     {
120       elt = pool_elt_at_index (tm->test_pool, elt_index);
121       fformat(stdout, "elt %d value %d\n", 
122               i++, elt->value);
123       elt_index = elt->next;
124       value = elt->value;
125     }
126
127   fformat (stdout, "Dump reverse links\n");
128   elt_index = head->prev;
129   i = 1;
130   value = 0;
131   while (value != ~0)
132     {
133       elt = pool_elt_at_index (tm->test_pool, elt_index);
134       fformat(stdout, "elt %d value %d\n", 
135               i++, elt->value);
136       elt_index = elt->prev;
137       value = elt->value;
138     }
139
140   fformat (stdout, "Remove middle element\n");
141
142   clib_dlist_remove (tm->test_pool, 2);
143   elt = pool_elt_at_index (tm->test_pool, 2);
144
145   fformat (stdout, "removed index %d value %d\n", elt_index, elt->value);
146   
147   fformat (stdout, "Dump forward links\n");
148   elt_index = head->next;
149   i = 1;
150   value = 0;
151   while (value != ~0)
152     {
153       elt = pool_elt_at_index (tm->test_pool, elt_index);
154       fformat(stdout, "elt %d value %d\n", 
155               i++, elt->value);
156       elt_index = elt->next;
157       value = elt->value;
158     }
159
160   fformat (stdout, "Dump reverse links\n");
161   elt_index = head->prev;
162   i = 1;
163   value = 0;
164   while (value != ~0)
165     {
166       elt = pool_elt_at_index (tm->test_pool, elt_index);
167       fformat(stdout, "elt %d value %d\n", 
168               i++, elt->value);
169       elt_index = elt->prev;
170       value = elt->value;
171     }
172
173   return 0;
174 }
175
176 #ifdef CLIB_UNIX
177 int main (int argc, char * argv[])
178 {
179   unformat_input_t i;
180   int ret;
181
182   clib_mem_init (0, 3ULL<<30);
183
184   unformat_init_command_line (&i, argv);
185   ret = test_dlist_main (&i);
186   unformat_free (&i);
187
188   return ret;
189 }
190 #endif /* CLIB_UNIX */