- rename dirpool_create to dirpool_init, as it just initializes the data
[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_init(Dirpool *dp);
21 void dirpool_free(Dirpool *dp);
22
23 void dirpool_make_dirtraverse(Dirpool *dp);
24 Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create);
25
26 static inline Id dirpool_parent(Dirpool *dp, Id did)
27 {
28   if (!did)
29     return 0;
30   while (dp->dirs[--did] > 0)
31     ;
32   return -dp->dirs[did];
33 }
34
35 static inline Id
36 dirpool_sibling(Dirpool *dp, Id did)
37 {
38   if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0)
39     return did + 1;
40   while (dp->dirs[--did] > 0)
41     ;
42   /* need to special case did == 0 to prevent looping */
43   if (!did)
44     return 0;
45   if (!dp->dirtraverse)
46     dirpool_make_dirtraverse(dp);
47   return dp->dirtraverse[did];
48 }
49
50 static inline Id
51 dirpool_child(Dirpool *dp, Id did)
52 {
53   if (!dp->dirtraverse)
54     dirpool_make_dirtraverse(dp);
55   return dp->dirtraverse[did];
56 }
57
58 static inline void
59 dirpool_free_dirtraverse(Dirpool *dp)
60 {
61   sat_free(dp->dirtraverse);
62   dp->dirtraverse = 0;
63 }
64
65 static inline Id
66 dirpool_compid(Dirpool *dp, Id did)
67 {
68   return dp->dirs[did];
69 }
70
71 #endif /* SATSOLVER_DIRPOOL_H */