Ejemplo n.º 1
0
// Adds 'parent' as a sire or dam of 'child'
// after checking for re-parentage and cycles.
void add_parent(CatID child, CatID parent) {

  // Update Child Pointers
  int childPointer = getCat(child);
  if (childPointer == NIL) {
    childPointer = nextFreeCat();
    cats[childPointer].tableEntry = child;
	// EDIT ME
    symTable[child] = childPointer;
  }

  // check for re-parentage
  if (is_male(parent) ? cats[childPointer].sire != NIL : cats[childPointer].dam != NIL) {
    printf("Input ignored: %d already has a %s.\n",
           child, is_male(parent) ? "sire" : "dam");
    return;
  }

  // Update Parent Pointers
  int parentPointer = getCat(parent);
  // printf("%d\n", parentPointer);
  if (parentPointer == NIL) {
    parentPointer = nextFreeCat();
    cats[parentPointer].tableEntry = parent;
	// EDIT ME
    symTable[parent] = parentPointer;
  }

  // check for cycles
  if (is_ancestor(parent, child)) {
    printf("Input ignored: it would cause cycle\n");
    return;
  }

  // set parent pointer
  if (is_male(parent)) cats[childPointer].sire = parentPointer;
  else cats[childPointer].dam = parentPointer;

  // set child pointer
  if (cats[parentPointer].eldest_child == NIL) {
    // this is first child to be added
    assert(cats[parentPointer].youngest_child == NIL);
    cats[parentPointer].eldest_child = childPointer;
    cats[parentPointer].youngest_child = childPointer;
  } else {
    // this is not the first child to be added
    CatID youngest_child = cats[parentPointer].youngest_child;
    assert(youngest_child != NIL);
    if (is_male(parent)) {
      assert(cats[youngest_child].next_younger_by_sire == NIL);
      cats[youngest_child].next_younger_by_sire = childPointer;
    } else {
      assert(cats[youngest_child].next_younger_by_dam == NIL);
      cats[youngest_child].next_younger_by_dam = childPointer;
    }
    cats[parentPointer].youngest_child = childPointer;
  }
}
Ejemplo n.º 2
0
// Prints the descendants of 'cat' down to 'max_depth'.
void query_descendants(CatID cat, int max_depth) {
  cat = getCat(cat);

  mark_descendants(cat, max_depth, 0);
  print_descendants(cat, cat, max_depth, 0);
  clear_descendants(cat, max_depth, 0);
}
Ejemplo n.º 3
0
// Prints all closest relationships between 'cat1' and 'cat2'.
void query_relationship(CatID cat1, CatID cat2) {
  //printf("%d %d\n", cat1, cat2);
  cat1 = getCat(cat1);
  cat2 = getCat(cat2);

  //printf("cat1: %d %d    cat2: %d %d \n", cats[cat1].tableEntry, cat1, cats[cat2].tableEntry, cat2);

  mark_ancestors(cat1, 0);
  int relationship = find_minimum_relationship(cat2, 0);
  if (relationship == COUNTER_SENTINEL) {
    //printf("%d-%d is not related to %d-%d.\n", cats[cat1].tableEntry, cat1, cats[cat2].tableEntry, cat2);
    printf("%d is not related to %d.\n", cats[cat1].tableEntry, cats[cat2].tableEntry);
    printf(" eldest_child: %d.\n", cats[cat1].eldest_child);
    printf(" par: %d.\n", cats[cats[cat1].sire].tableEntry);
    printf(" par: %d.\n", cats[cats[cat1].dam].tableEntry);
  } else {
    print_relationship_at_distance(cat1, cat2, cat2, relationship, 0);
  }
  clear_ancestors(cat1);
}
Ejemplo n.º 4
0
// Function called for each part (ex. 3@1) of the save command
void save_descendants(int cat, int lvl) {

  cat = getCat(cat);
  int damCat = getTopCat(cat, lvl);

  //printf("%d cat, %d damCat, %d lvl(s)\n", cats[cat].tableEntry, cats[damCat].tableEntry, lvl);

  // EXTRA
  //cats[cat].counter = COUNTER_SENTINEL;
  //cats[toSpacePointer] = cats[cat];
  //symTable[ cats[cat].tableEntry ] = toSpacePointer;
  // EXTRA

/*
  damCat = move_saved_dam(toSpacePointer, damCat);
  int eldestCat = move_saved_cats(damCat);
  cats[damCat].eldest_child = eldestCat;
  */
int eldestCat = -1;
if (cats[damCat].eldest_child != NIL) {
  eldestCat = move_saved_cats(cats[damCat].eldest_child);
}
damCat = move_saved_dam(toSpacePointer, damCat);
cats[damCat].eldest_child = eldestCat;
if (is_male(damCat))
cats[eldestCat].sire = damCat;
else
cats[eldestCat].dam = damCat;

  if (catMemory == 0) {
    toSpacePointer = 0;
    catMemory = NUM_CATS;
    memoryEnd = NUM_CATS * 2;
  }
  else {
    toSpacePointer = NUM_CATS;
    catMemory = 0;
    memoryEnd = NUM_CATS;
  }

  //printf("getCat %d | getTopCat %d\n", cat, damCat);
  setSoftLinks(damCat);

}
Ejemplo n.º 5
0
bool search(downloadtype type, category cat, const char* name, std::list<IDownload*>& searchres)
{
	IDownload::category icat = getCat(cat);
	if (isEngineDownload(icat)) { //engine downloads only work with http
		type = DL_ENGINE;
		LOG_ERROR("engine dl");
	}
	typ = type;
	std::string searchname = name;

	switch(type) {
	case DL_RAPID:
		return rapidDownload->search(searchres, searchname.c_str(), icat);
	case DL_HTTP:
	case DL_ENGINE:
		return httpDownload->search(searchres, searchname.c_str(), icat);
	case DL_PLASMA:
		return plasmaDownload->search(searchres, searchname.c_str(), icat);
	case DL_ANY:
		rapidDownload->search(searchres, searchname.c_str(), icat);
		if (!searchres.empty()) {
			typ = DL_RAPID;
			break;
		}
		typ = DL_HTTP;
		httpDownload->search(searchres, searchname.c_str(), icat);
		if (!searchres.empty()) {
			break;
		}
		//last try, use plasma
		return plasmaDownload->search(searchres, searchname.c_str(), icat);
	default:
		LOG_ERROR("%s: type invalid", __FUNCTION__);
		return false;
	}
	return true;
}