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