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 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 */

doxygen