void RumorMill__addNode(struct RumorMill* mill, struct Address* addr, const char* file, int line) { struct RumorMill_pvt* rm = Identity_check((struct RumorMill_pvt*) mill); Address_getPrefix(addr); for (int i = 0; i < rm->pub.count; i++) { if (rm->pub.addresses[i].path == addr->path && !Bits_memcmp(rm->pub.addresses[i].key, addr->key, 32)) { return; } } if (!Bits_memcmp(addr->key, rm->selfAddr->key, 32)) { return; } struct Address* replace; if (rm->pub.count < rm->capacity) { replace = &rm->pub.addresses[rm->pub.count++]; } else { replace = getWorst(rm); } Bits_memcpyConst(replace, addr, sizeof(struct Address)); if (Defined(Log_DEBUG)) { uint8_t addrStr[60]; Address_print(addrStr, addr); Log_debug(rm->log, "[%s] addNode(%s) count[%d] from [%s:%d]", rm->pub.name, addrStr, rm->pub.count, file, line); } }
void SimpleMemoryUpdate::update(Problem *problem, Memory* memory, Solution* solution) { if (!memory->includes(solution)) { Solution *sol = solution->clone(problem->getVariableBuilder()); int worstPos = getWorst(memory); /* Replace worst solution if "sol" is better */ if (sol->compare(memory->getSolution(worstPos)) == WORSE) delete sol; else memory->setSolution(worstPos, sol); } }