dirpool.h

Go to the documentation of this file.
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 */

Generated on Mon Dec 15 17:56:24 2014 for satsolver by  doxygen 1.5.6