bah revert... you dreamer
[platform/upstream/libsolv.git] / src / dirpool.h
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7 #ifndef SATSOLVER_DIRPOOL_H
8 #define SATSOLVER_DIRPOOL_H
9
10
11 #include "pooltypes.h"
12 #include "util.h"
13
14 typedef struct _Dirpool {
15   Id *dirs;
16   int ndirs;
17   Id *dirtraverse;
18 } Dirpool;
19
20 void dirpool_create(Dirpool *dp);
21 void dirpool_make_dirtraverse(Dirpool *dp);
22 Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create);
23
24 static inline Id dirpool_parent(Dirpool *dp, Id did)
25 {
26   if (!did)
27     return 0;
28   while (dp->dirs[--did] > 0)
29     ;
30   return -dp->dirs[did];
31 }
32
33 static inline Id
34 dirpool_sibling(Dirpool *dp, Id did)
35 {
36   if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0)
37     return did + 1;
38   while (dp->dirs[--did] > 0)
39     ;
40   /* need to special case did == 0 to prevent looping */
41   if (!did)
42     return 0;
43   if (!dp->dirtraverse)
44     dirpool_make_dirtraverse(dp);
45   return dp->dirtraverse[did];
46 }
47
48 static inline Id
49 dirpool_child(Dirpool *dp, Id did)
50 {
51   if (!dp->dirtraverse)
52     dirpool_make_dirtraverse(dp);
53   return dp->dirtraverse[did];
54 }
55
56 static inline void
57 dirpool_free_dirtraverse(Dirpool *dp)
58 {
59   sat_free(dp->dirtraverse);
60   dp->dirtraverse = 0;
61 }
62
63 static inline Id
64 dirpool_compid(Dirpool *dp, Id did)
65 {
66   return dp->dirs[did];
67 }
68
69 #endif /* SATSOLVER_DIRPOOL_H */