1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _
3*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| |
4*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___
6*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker *
8*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker *
10*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker *
14*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker *
18*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker *
21*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker *
23*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "curlcheck.h"
25*6236dae4SAndroid Build Coastguard Worker
26*6236dae4SAndroid Build Coastguard Worker #include "splay.h"
27*6236dae4SAndroid Build Coastguard Worker #include "warnless.h"
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker
unit_setup(void)30*6236dae4SAndroid Build Coastguard Worker static CURLcode unit_setup(void)
31*6236dae4SAndroid Build Coastguard Worker {
32*6236dae4SAndroid Build Coastguard Worker return CURLE_OK;
33*6236dae4SAndroid Build Coastguard Worker }
34*6236dae4SAndroid Build Coastguard Worker
unit_stop(void)35*6236dae4SAndroid Build Coastguard Worker static void unit_stop(void)
36*6236dae4SAndroid Build Coastguard Worker {
37*6236dae4SAndroid Build Coastguard Worker
38*6236dae4SAndroid Build Coastguard Worker }
39*6236dae4SAndroid Build Coastguard Worker
splayprint(struct Curl_tree * t,int d,char output)40*6236dae4SAndroid Build Coastguard Worker static void splayprint(struct Curl_tree *t, int d, char output)
41*6236dae4SAndroid Build Coastguard Worker {
42*6236dae4SAndroid Build Coastguard Worker struct Curl_tree *node;
43*6236dae4SAndroid Build Coastguard Worker int i;
44*6236dae4SAndroid Build Coastguard Worker int count;
45*6236dae4SAndroid Build Coastguard Worker if(!t)
46*6236dae4SAndroid Build Coastguard Worker return;
47*6236dae4SAndroid Build Coastguard Worker
48*6236dae4SAndroid Build Coastguard Worker splayprint(t->larger, d + 1, output);
49*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < d; i++)
50*6236dae4SAndroid Build Coastguard Worker if(output)
51*6236dae4SAndroid Build Coastguard Worker printf(" ");
52*6236dae4SAndroid Build Coastguard Worker
53*6236dae4SAndroid Build Coastguard Worker if(output) {
54*6236dae4SAndroid Build Coastguard Worker printf("%ld.%ld[%d]", (long)t->key.tv_sec,
55*6236dae4SAndroid Build Coastguard Worker (long)t->key.tv_usec, i);
56*6236dae4SAndroid Build Coastguard Worker }
57*6236dae4SAndroid Build Coastguard Worker
58*6236dae4SAndroid Build Coastguard Worker for(count = 0, node = t->samen; node != t; node = node->samen, count++)
59*6236dae4SAndroid Build Coastguard Worker ;
60*6236dae4SAndroid Build Coastguard Worker
61*6236dae4SAndroid Build Coastguard Worker if(output) {
62*6236dae4SAndroid Build Coastguard Worker if(count)
63*6236dae4SAndroid Build Coastguard Worker printf(" [%d more]\n", count);
64*6236dae4SAndroid Build Coastguard Worker else
65*6236dae4SAndroid Build Coastguard Worker printf("\n");
66*6236dae4SAndroid Build Coastguard Worker }
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker splayprint(t->smaller, d + 1, output);
69*6236dae4SAndroid Build Coastguard Worker }
70*6236dae4SAndroid Build Coastguard Worker
71*6236dae4SAndroid Build Coastguard Worker UNITTEST_START
72*6236dae4SAndroid Build Coastguard Worker
73*6236dae4SAndroid Build Coastguard Worker /* number of nodes to add to the splay tree */
74*6236dae4SAndroid Build Coastguard Worker #define NUM_NODES 50
75*6236dae4SAndroid Build Coastguard Worker
76*6236dae4SAndroid Build Coastguard Worker struct Curl_tree *root, *removed;
77*6236dae4SAndroid Build Coastguard Worker struct Curl_tree nodes[NUM_NODES*3];
78*6236dae4SAndroid Build Coastguard Worker size_t storage[NUM_NODES*3];
79*6236dae4SAndroid Build Coastguard Worker int rc;
80*6236dae4SAndroid Build Coastguard Worker int i, j;
81*6236dae4SAndroid Build Coastguard Worker struct curltime tv_now = {0, 0};
82*6236dae4SAndroid Build Coastguard Worker root = NULL; /* the empty tree */
83*6236dae4SAndroid Build Coastguard Worker
84*6236dae4SAndroid Build Coastguard Worker /* add nodes */
85*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_NODES; i++) {
86*6236dae4SAndroid Build Coastguard Worker struct curltime key;
87*6236dae4SAndroid Build Coastguard Worker
88*6236dae4SAndroid Build Coastguard Worker key.tv_sec = 0;
89*6236dae4SAndroid Build Coastguard Worker key.tv_usec = (541*i)%1023;
90*6236dae4SAndroid Build Coastguard Worker storage[i] = key.tv_usec;
91*6236dae4SAndroid Build Coastguard Worker Curl_splayset(&nodes[i], &storage[i]);
92*6236dae4SAndroid Build Coastguard Worker root = Curl_splayinsert(key, root, &nodes[i]);
93*6236dae4SAndroid Build Coastguard Worker }
94*6236dae4SAndroid Build Coastguard Worker
95*6236dae4SAndroid Build Coastguard Worker puts("Result:");
96*6236dae4SAndroid Build Coastguard Worker splayprint(root, 0, 1);
97*6236dae4SAndroid Build Coastguard Worker
98*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_NODES; i++) {
99*6236dae4SAndroid Build Coastguard Worker int rem = (i + 7)%NUM_NODES;
100*6236dae4SAndroid Build Coastguard Worker printf("Tree look:\n");
101*6236dae4SAndroid Build Coastguard Worker splayprint(root, 0, 1);
102*6236dae4SAndroid Build Coastguard Worker printf("remove pointer %d, payload %zu\n", rem,
103*6236dae4SAndroid Build Coastguard Worker *(size_t *)Curl_splayget(&nodes[rem]));
104*6236dae4SAndroid Build Coastguard Worker rc = Curl_splayremove(root, &nodes[rem], &root);
105*6236dae4SAndroid Build Coastguard Worker if(rc) {
106*6236dae4SAndroid Build Coastguard Worker /* failed! */
107*6236dae4SAndroid Build Coastguard Worker printf("remove %d failed!\n", rem);
108*6236dae4SAndroid Build Coastguard Worker fail("remove");
109*6236dae4SAndroid Build Coastguard Worker }
110*6236dae4SAndroid Build Coastguard Worker }
111*6236dae4SAndroid Build Coastguard Worker
112*6236dae4SAndroid Build Coastguard Worker fail_unless(root == NULL, "tree not empty after removing all nodes");
113*6236dae4SAndroid Build Coastguard Worker
114*6236dae4SAndroid Build Coastguard Worker /* rebuild tree */
115*6236dae4SAndroid Build Coastguard Worker for(i = 0; i < NUM_NODES; i++) {
116*6236dae4SAndroid Build Coastguard Worker struct curltime key;
117*6236dae4SAndroid Build Coastguard Worker
118*6236dae4SAndroid Build Coastguard Worker key.tv_sec = 0;
119*6236dae4SAndroid Build Coastguard Worker key.tv_usec = (541*i)%1023;
120*6236dae4SAndroid Build Coastguard Worker
121*6236dae4SAndroid Build Coastguard Worker /* add some nodes with the same key */
122*6236dae4SAndroid Build Coastguard Worker for(j = 0; j <= i % 3; j++) {
123*6236dae4SAndroid Build Coastguard Worker storage[i * 3 + j] = key.tv_usec*10 + j;
124*6236dae4SAndroid Build Coastguard Worker Curl_splayset(&nodes[i * 3 + j], &storage[i * 3 + j]);
125*6236dae4SAndroid Build Coastguard Worker root = Curl_splayinsert(key, root, &nodes[i * 3 + j]);
126*6236dae4SAndroid Build Coastguard Worker }
127*6236dae4SAndroid Build Coastguard Worker }
128*6236dae4SAndroid Build Coastguard Worker
129*6236dae4SAndroid Build Coastguard Worker removed = NULL;
130*6236dae4SAndroid Build Coastguard Worker for(i = 0; i <= 1100; i += 100) {
131*6236dae4SAndroid Build Coastguard Worker printf("Removing nodes not larger than %d\n", i);
132*6236dae4SAndroid Build Coastguard Worker tv_now.tv_usec = i;
133*6236dae4SAndroid Build Coastguard Worker root = Curl_splaygetbest(tv_now, root, &removed);
134*6236dae4SAndroid Build Coastguard Worker while(removed) {
135*6236dae4SAndroid Build Coastguard Worker printf("removed payload %zu[%zu]\n",
136*6236dae4SAndroid Build Coastguard Worker *(size_t *)Curl_splayget(removed) / 10,
137*6236dae4SAndroid Build Coastguard Worker *(size_t *)Curl_splayget(removed) % 10);
138*6236dae4SAndroid Build Coastguard Worker root = Curl_splaygetbest(tv_now, root, &removed);
139*6236dae4SAndroid Build Coastguard Worker }
140*6236dae4SAndroid Build Coastguard Worker }
141*6236dae4SAndroid Build Coastguard Worker
142*6236dae4SAndroid Build Coastguard Worker fail_unless(root == NULL, "tree not empty when it should be");
143*6236dae4SAndroid Build Coastguard Worker
144*6236dae4SAndroid Build Coastguard Worker UNITTEST_STOP
145