2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "libavutil/tree.c"
23 #include "libavutil/common.h"
24 #include "libavutil/lfg.h"
25 #include "libavutil/log.h"
26 #include "libavutil/mem.h"
28 static int check(AVTreeNode
*t
)
31 int left
= check(t
->child
[0]);
32 int right
= check(t
->child
[1]);
34 if (left
> 999 || right
> 999)
36 if (right
- left
!= t
->state
)
38 if (t
->state
> 1 || t
->state
< -1)
40 return FFMAX(left
, right
) + 1;
45 static void print(AVTreeNode
*t
, int depth
)
48 for (i
= 0; i
< depth
* 4; i
++)
49 av_log(NULL
, AV_LOG_ERROR
, " ");
51 av_log(NULL
, AV_LOG_ERROR
, "Node %p %2d %p\n", t
, t
->state
, t
->elem
);
52 print(t
->child
[0], depth
+ 1);
53 print(t
->child
[1], depth
+ 1);
55 av_log(NULL
, AV_LOG_ERROR
, "NULL\n");
58 static int cmp(const void *a
, const void *b
)
60 return (const uint8_t *) a
- (const uint8_t *) b
;
63 int main(int argc
, char **argv
)
67 AVTreeNode
*root
= NULL
, *node
= NULL
;
69 int log_level
= argc
<= 1 ? AV_LOG_INFO
: atoi(argv
[1]);
71 av_log_set_level(log_level
);
73 av_lfg_init(&prng
, 1);
75 for (i
= 0; i
< 10000; i
++) {
76 intptr_t j
= av_lfg_get(&prng
) % 86294;
78 if (check(root
) > 999) {
79 av_log(NULL
, AV_LOG_ERROR
, "FATAL error %d\n", i
);
83 av_log(NULL
, AV_LOG_DEBUG
, "inserting %4d\n", (int)j
);
86 node
= av_tree_node_alloc();
88 av_log(NULL
, AV_LOG_ERROR
, "Memory allocation failure.\n");
91 av_tree_insert(&root
, (void *)(j
+ 1), cmp
, &node
);
93 j
= av_lfg_get(&prng
) % 86294;
95 AVTreeNode
*node2
= NULL
;
96 av_log(NULL
, AV_LOG_DEBUG
, "removing %4d\n", (int)j
);
97 av_tree_insert(&root
, (void *)(j
+ 1), cmp
, &node2
);
98 k
= av_tree_find(root
, (void *)(j
+ 1), cmp
, NULL
);
100 av_log(NULL
, AV_LOG_ERROR
, "removal failure %d\n", i
);
106 av_tree_destroy(root
);