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 static inline Id dirpool_parent(Dirpool *dp, Id did) 00027 { 00028 if (!did) 00029 return 0; 00030 while (dp->dirs[--did] > 0) 00031 ; 00032 return -dp->dirs[did]; 00033 } 00034 00035 static inline Id 00036 dirpool_sibling(Dirpool *dp, Id did) 00037 { 00038 if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0) 00039 return did + 1; 00040 while (dp->dirs[--did] > 0) 00041 ; 00042 /* need to special case did == 0 to prevent looping */ 00043 if (!did) 00044 return 0; 00045 if (!dp->dirtraverse) 00046 dirpool_make_dirtraverse(dp); 00047 return dp->dirtraverse[did]; 00048 } 00049 00050 static inline Id 00051 dirpool_child(Dirpool *dp, Id did) 00052 { 00053 if (!dp->dirtraverse) 00054 dirpool_make_dirtraverse(dp); 00055 return dp->dirtraverse[did]; 00056 } 00057 00058 static inline void 00059 dirpool_free_dirtraverse(Dirpool *dp) 00060 { 00061 sat_free(dp->dirtraverse); 00062 dp->dirtraverse = 0; 00063 } 00064 00065 static inline Id 00066 dirpool_compid(Dirpool *dp, Id did) 00067 { 00068 return dp->dirs[did]; 00069 } 00070 00071 #endif /* SATSOLVER_DIRPOOL_H */