]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/src/libbenchmark_topology/libbenchmark_topology_iterate.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libbenchmark / src / libbenchmark_topology / libbenchmark_topology_iterate.c
1 /***** includes *****/
2 #include "libbenchmark_topology_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void libbenchmark_topology_iterate_init( struct libbenchmark_topology_iterate_state *tis, enum libbenchmark_topology_node_type type )
10 {
11   LFDS710_PAL_ASSERT( tis != NULL );
12   // TRD : type can be any value in its range
13
14   tis->baue = NULL;
15   tis->type = type;
16
17   return;
18 }
19
20
21
22
23
24 /****************************************************************************/
25 int libbenchmark_topology_iterate( struct libbenchmark_topology_state *ts, struct libbenchmark_topology_iterate_state *tis, struct libbenchmark_topology_node_state **tns )
26 {
27   int
28     rv = 1;
29
30   LFDS710_PAL_ASSERT( ts != NULL );
31   LFDS710_PAL_ASSERT( tis != NULL );
32   LFDS710_PAL_ASSERT( tns != NULL );
33
34   while( lfds710_btree_au_get_by_absolute_position_and_then_by_relative_position(&ts->topology_tree, &tis->baue, LFDS710_BTREE_AU_ABSOLUTE_POSITION_LARGEST_IN_TREE, LFDS710_BTREE_AU_RELATIVE_POSITION_NEXT_SMALLER_ELEMENT_IN_ENTIRE_TREE) )
35   {
36     *tns = LFDS710_BTREE_AU_GET_VALUE_FROM_ELEMENT( *tis->baue );
37
38     if( (*tns)->type == tis->type )
39       break;
40   }
41
42   if( tis->baue == NULL )
43   {
44     *tns = NULL;
45     rv = 0;
46   }
47
48   return rv;
49 }
50