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 LIBSOLV_DIRPOOL_H
8 #define LIBSOLV_DIRPOOL_H
9 
10 
11 #include "pooltypes.h"
12 #include "util.h"
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 typedef struct s_Dirpool {
19   Id *dirs;
20   int ndirs;
21   Id *dirtraverse;
22 } Dirpool;
23 
24 void dirpool_init(Dirpool *dp);
25 void dirpool_free(Dirpool *dp);
26 
27 void dirpool_make_dirtraverse(Dirpool *dp);
28 Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create);
29 
30 /* return the parent directory of child did */
dirpool_parent(Dirpool * dp,Id did)31 static inline Id dirpool_parent(Dirpool *dp, Id did)
32 {
33   if (!did)
34     return 0;
35   while (dp->dirs[--did] > 0)
36     ;
37   return -dp->dirs[did];
38 }
39 
40 /* return the next child entry of child did */
41 static inline Id
dirpool_sibling(Dirpool * dp,Id did)42 dirpool_sibling(Dirpool *dp, Id did)
43 {
44   /* if this block contains another entry, simply return it */
45   if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0)
46     return did + 1;
47   /* end of block reached, rewind to get to the block's
48    * dirtraverse entry */
49   while (dp->dirs[--did] > 0)
50     ;
51   /* need to special case did == 0 to prevent looping */
52   if (!did)
53     return 0;
54   if (!dp->dirtraverse)
55     dirpool_make_dirtraverse(dp);
56   return dp->dirtraverse[did];
57 }
58 
59 /* return the first child entry of directory did */
60 static inline Id
dirpool_child(Dirpool * dp,Id did)61 dirpool_child(Dirpool *dp, Id did)
62 {
63   if (!dp->dirtraverse)
64     dirpool_make_dirtraverse(dp);
65   return dp->dirtraverse[did];
66 }
67 
68 static inline void
dirpool_free_dirtraverse(Dirpool * dp)69 dirpool_free_dirtraverse(Dirpool *dp)
70 {
71   solv_free(dp->dirtraverse);
72   dp->dirtraverse = 0;
73 }
74 
75 static inline Id
dirpool_compid(Dirpool * dp,Id did)76 dirpool_compid(Dirpool *dp, Id did)
77 {
78   return dp->dirs[did];
79 }
80 
81 #ifdef __cplusplus
82 }
83 #endif
84 
85 #endif /* LIBSOLV_DIRPOOL_H */
86