Blame src/dirpool.h

Packit Service ff689b
/*
Packit Service ff689b
 * Copyright (c) 2007, Novell Inc.
Packit Service ff689b
 *
Packit Service ff689b
 * This program is licensed under the BSD license, read LICENSE.BSD
Packit Service ff689b
 * for further information
Packit Service ff689b
 */
Packit Service ff689b
#ifndef LIBSOLV_DIRPOOL_H
Packit Service ff689b
#define LIBSOLV_DIRPOOL_H
Packit Service ff689b
Packit Service ff689b
Packit Service ff689b
#include "pooltypes.h"
Packit Service ff689b
#include "util.h"
Packit Service ff689b
Packit Service ff689b
#ifdef __cplusplus
Packit Service ff689b
extern "C" {
Packit Service ff689b
#endif
Packit Service ff689b
Packit Service ff689b
typedef struct s_Dirpool {
Packit Service ff689b
  Id *dirs;
Packit Service ff689b
  int ndirs;
Packit Service ff689b
  Id *dirtraverse;
Packit Service ff689b
} Dirpool;
Packit Service ff689b
Packit Service ff689b
void dirpool_init(Dirpool *dp);
Packit Service ff689b
void dirpool_free(Dirpool *dp);
Packit Service ff689b
Packit Service ff689b
void dirpool_make_dirtraverse(Dirpool *dp);
Packit Service ff689b
Id dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create);
Packit Service ff689b
Packit Service ff689b
/* return the parent directory of child did */
Packit Service ff689b
static inline Id dirpool_parent(Dirpool *dp, Id did)
Packit Service ff689b
{
Packit Service ff689b
  if (!did)
Packit Service ff689b
    return 0;
Packit Service ff689b
  while (dp->dirs[--did] > 0)
Packit Service ff689b
    ;
Packit Service ff689b
  return -dp->dirs[did];
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
/* return the next child entry of child did */
Packit Service ff689b
static inline Id
Packit Service ff689b
dirpool_sibling(Dirpool *dp, Id did)
Packit Service ff689b
{
Packit Service ff689b
  /* if this block contains another entry, simply return it */
Packit Service ff689b
  if (did + 1 < dp->ndirs && dp->dirs[did + 1] > 0)
Packit Service ff689b
    return did + 1;
Packit Service ff689b
  /* end of block reached, rewind to get to the block's
Packit Service ff689b
   * dirtraverse entry */
Packit Service ff689b
  while (dp->dirs[--did] > 0)
Packit Service ff689b
    ;
Packit Service ff689b
  /* need to special case did == 0 to prevent looping */
Packit Service ff689b
  if (!did)
Packit Service ff689b
    return 0;
Packit Service ff689b
  if (!dp->dirtraverse)
Packit Service ff689b
    dirpool_make_dirtraverse(dp);
Packit Service ff689b
  return dp->dirtraverse[did];
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
/* return the first child entry of directory did */
Packit Service ff689b
static inline Id
Packit Service ff689b
dirpool_child(Dirpool *dp, Id did)
Packit Service ff689b
{
Packit Service ff689b
  if (!dp->dirtraverse)
Packit Service ff689b
    dirpool_make_dirtraverse(dp);
Packit Service ff689b
  return dp->dirtraverse[did];
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
static inline void
Packit Service ff689b
dirpool_free_dirtraverse(Dirpool *dp)
Packit Service ff689b
{
Packit Service ff689b
  solv_free(dp->dirtraverse);
Packit Service ff689b
  dp->dirtraverse = 0;
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
static inline Id
Packit Service ff689b
dirpool_compid(Dirpool *dp, Id did)
Packit Service ff689b
{
Packit Service ff689b
  return dp->dirs[did];
Packit Service ff689b
}
Packit Service ff689b
Packit Service ff689b
#ifdef __cplusplus
Packit Service ff689b
}
Packit Service ff689b
#endif
Packit Service ff689b
Packit Service ff689b
#endif /* LIBSOLV_DIRPOOL_H */