TEST(tagged, score_successor) { ASSERT_SAME(new_score(scEq, 1), get_score_successor(new_score(scEq, 0))); ASSERT_SAME(new_score(scEq, 2), get_score_successor(new_score(scEq, 1))); ASSERT_SAME(new_score(scEq, 0xFFFFFFFF), get_score_successor(new_score(scEq, 0xFFFFFFFE))); ASSERT_SAME(new_score(scIs, 1), get_score_successor(new_score(scIs, 0))); ASSERT_SAME(new_score(scIs, 2), get_score_successor(new_score(scIs, 1))); ASSERT_SAME(new_score(scIs, 0xFFFFFFFF), get_score_successor(new_score(scIs, 0xFFFFFFFE))); }
static value_t find_best_match(runtime_t *runtime, value_t current, value_t target, value_t current_score, value_t space, value_t *score_out) { if (value_identity_compare(current, target)) { *score_out = current_score; return success(); } else { TRY_DEF(parents, get_type_parents(runtime, space, current)); int64_t length = get_array_buffer_length(parents); value_t score = new_no_match_score(); for (int64_t i = 0; i < length; i++) { value_t parent = get_array_buffer_at(parents, i); value_t next_score = whatever(); TRY(find_best_match(runtime, parent, target, get_score_successor(current_score), space, &next_score)); score = best_score(score, next_score); } *score_out = score; return success(); } }