コード例 #1
0
ファイル: hs.c プロジェクト: NetSys/sts
bool
hs_compact_m (struct hs *hs, const array_t *mask)
{
  struct hs_vec *v = &hs->list;
  for (int i = 0; i < v->used; i++) {
    vec_compact (&v->diff[i], mask, hs->len);
    for (int j = 0; j < v->diff[i].used; j++) {
      if (!array_is_sub (v->diff[i].elems[j], v->elems[i], hs->len)) continue;
      vec_elem_free (v, i);
      i--; break;
    }
  }
  return v->used;
}
コード例 #2
0
ファイル: hs.c プロジェクト: NetSys/sts
/* Remove elems of V that are covered by another elem. V must be a diff list.
   LEN is length of each array. */
static void
vec_compact (struct hs_vec *v, const array_t* mask, int len)
{
  for (int i = 0; i < v->used; i++) {
    for (int j = i + 1; j < v->used; j++) {
      array_t *extra;
      array_combine(&(v->elems[i]), &(v->elems[j]), &extra, mask, len);
      if (extra) {
        vec_append(v,extra,true);
      }
      if (v->elems[i] == NULL) {
        vec_elem_free (v, i);
        if (v->elems[j] == NULL) vec_elem_free (v, j);
        i--;
        break;
      }
      if (v->elems[j] == NULL) {
        vec_elem_free (v, j);
        j--;
        continue;
      }
    }
  }
}
コード例 #3
0
ファイル: hs.c プロジェクト: MurphyMc/sts
/* Remove elems of V that are covered by another elem. V must be a diff list.
   LEN is length of each array. */
static void
vec_compact (struct hs_vec *v, int len)
{
  for (int i = 0; i < v->used; i++) {
    for (int j = i + 1; j < v->used; j++) {
      int sub;
      if (array_is_sub (v->elems[i], v->elems[j], len)) sub = j;
      else if (array_is_sub (v->elems[j], v->elems[i], len)) sub = i;
      else continue;

      vec_elem_free (v, sub);
      if (sub == j) { j--; continue; }
      else { i--; break; }
    }
  }
}