00001 /* 00002 * Copyright (c) 2007, Novell Inc. 00003 * 00004 * This program is licensed under the BSD license, read LICENSE.BSD 00005 * for further information 00006 */ 00007 #ifndef SATSOLVER_DIRPOOL_H 00008 #define SATSOLVER_DIRPOOL_H 00009 00010 00011 #include "pooltypes.h" 00012 #include "util.h" 00013 00014 typedef struct _Dirpool { 00015 Id *dirs; 00016 int ndirs; 00017 Id *dirtraverse; 00018 } Dirpool; 00019 00020 void dirpool_init(Dirpool *dp); 00021 void dirpool_free(Dirpool *dp); 00022 00023 void dirpool_make_dirtraverse(Dirpool *dp); 00024 Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create); 00025 00026 /* return the parent directory of child did */ 00027 static inline Id dirpool_parent(Dirpool *dp, Id did) 00028 { 00029 if (!did) 00030 return 0; 00031 while (dp->dirs[--did] > 0) 00032 ; 00033 return -dp->dirs[did]; 00034 } 00035 00036 /* return the next child entry of child did */ 00037 static inline Id 00038 dirpool_sibling(Dirpool *dp, Id did) 00039 { 00040 /* if this block contains another entry, simply return it */ 00041 if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0) 00042 return did + 1; 00043 /* end of block reached, rewind to get to the block's 00044 * dirtraverse entry */ 00045 while (dp->dirs[--did] > 0) 00046 ; 00047 /* need to special case did == 0 to prevent looping */ 00048 if (!did) 00049 return 0; 00050 if (!dp->dirtraverse) 00051 dirpool_make_dirtraverse(dp); 00052 return dp->dirtraverse[did]; 00053 } 00054 00055 /* return the first child entry of directory did */ 00056 static inline Id 00057 dirpool_child(Dirpool *dp, Id did) 00058 { 00059 if (!dp->dirtraverse) 00060 dirpool_make_dirtraverse(dp); 00061 return dp->dirtraverse[did]; 00062 } 00063 00064 static inline void 00065 dirpool_free_dirtraverse(Dirpool *dp) 00066 { 00067 sat_free(dp->dirtraverse); 00068 dp->dirtraverse = 0; 00069 } 00070 00071 static inline Id 00072 dirpool_compid(Dirpool *dp, Id did) 00073 { 00074 return dp->dirs[did]; 00075 } 00076 00077 #endif /* SATSOLVER_DIRPOOL_H */