Esempio n. 1
0
void update_sprite_prios(int sprite_no, uint8_t x_pos) {

    Node *current_node = inverse_prio_sprites + sprite_no;
    // Order by x position and if equal then by sprite number
    uint16_t val = (x_pos << 8) | sprite_no;
    current_node->x_pos = val;
    Node *swap_node = current_node;

   
    // Move up priorities
    if (swap_node->next != sentinal && val < swap_node->next->x_pos) {
        while (swap_node->next != sentinal && val < swap_node->next->x_pos) {
            swap_node = swap_node->next;
        }
        move_after(current_node, swap_node);
     }
    
    // Move down priorites
    else if (swap_node->prev != sentinal && val > swap_node->prev->x_pos) {
        while (swap_node->prev != sentinal && val > swap_node->prev->x_pos) {
            swap_node = swap_node->prev;
        }
        move_after(current_node, swap_node->prev);
    }

    // Set new head if replaced
    if (current_node != swap_node && swap_node == head_ptr) {
        head_ptr = current_node;
    }
}
Esempio n. 2
0
static void tst4(unsigned sz, unsigned num_rounds) {
    uint_total_order to;
    unsigned_vector  v;
    unsigned_vector  inv_v;
    to.insert(0);
    v.push_back(0);
    inv_v.push_back(0);
    for (unsigned i = 0; i < sz; i++) {
        to.insert_after(i, i+1);
        v.push_back(i+1);
        inv_v.push_back(i+1);
    }
    for (unsigned i = 0; i < num_rounds; i++) {
        unsigned v1 = rand() % sz;
        unsigned v2 = rand() % sz;
        if (v1 != v2) {
            to.move_after(v1, v2); 
            move_after(v, inv_v, v1, v2);
        }
        for (unsigned k = 0; k < sz - 1; k++) {
            SASSERT(inv_v[v[k]] == k);
            SASSERT(to.lt(v[k], v[k+1]));
        }
        if (i % 1000 == 0) {
            std::cout << "*";
            std::cout.flush();
        }
    }
    std::cout << std::endl;
}
Esempio n. 3
0
void modify_branch_so_that_state_access_is_indexed(Branch* branch, int index)
{
    Term* stateInput = find_state_input(branch);
    if (stateInput == NULL)
        return;

    // If the state output is connected directly to state input, then do nothing.
    Term* stateOutput = find_state_output(branch);

    if (stateOutput->input(0) == stateInput)
        return;

    Term* unpackList = apply(branch, FUNCS.unpack_state_from_list, TermList(stateInput));
    unpackList->setIntProp("index", index);
    move_after_inputs(unpackList);

    for (int i=0; i < stateInput->users.length(); i++) {
        Term* term = stateInput->users[i];
        if (term == unpackList)
            continue;
        remap_pointers_quick(term, stateInput, unpackList);
    }

    Term* stateResult = stateOutput->input(0);
    ca_assert(stateResult != NULL);

    Term* packList = apply(branch, FUNCS.pack_state_to_list,
                           TermList(stateInput, stateResult));
    packList->setIntProp("index", index);
    packList->setBoolProp("final", true);
    set_input(stateOutput, 0, packList);
    move_after(packList, stateResult);
}
Esempio n. 4
0
void for_loop_fix_state_input(Branch* contents)
{
    // This function will look at the state access inside for-loop contents.
    // If there's state, the default building functions will have created
    // terms that look like this:
    //
    // input() :state -> unpack_state -> pack_state -> output() :state
    //
    // We want each loop iteration to have its own state container. So we'll
    // insert pack/unpack_state_list_n terms so that each iteration accesses
    // state from a list. The result will look like:
    //
    // input() :state -> unpack_state_list_n(index) -> unpack_state -> pack_state
    // -> pack_state_list_n(index) -> output() :state
    
    // First insert the unpack_state_list_n call
    Term* stateInput = find_state_input(contents);

    // Nothing to do if there's no state input
    if (stateInput == NULL)
        return;

    // Nothing to do if unpack_state_list_n term already exists
    if (find_user_with_function(stateInput, FUNCS.unpack_state_list_n) != NULL)
        return;

    Term* unpackState = find_user_with_function(stateInput, FUNCS.unpack_state);
    ca_assert(unpackState != NULL);

    Term* index = for_loop_find_index(contents);

    Term* unpackStateList = apply(contents, FUNCS.unpack_state_list_n,
        TermList(stateInput, index));
    transfer_users(stateInput, unpackStateList);
    move_before(unpackStateList, unpackState);
    set_input(unpackState, 0, unpackStateList);

    // Now insert the pack_state_list_n call
    Term* stateResult = find_open_state_result(contents, contents->length());

    Term* packStateList = apply(contents, FUNCS.pack_state_list_n,
        TermList(stateInput, stateResult, index));
    packStateList->setBoolProp("final", true);
    move_after(packStateList, stateResult);

    // Make sure the state output uses this result
    Term* stateOutput = append_state_output(contents);
    set_input(stateOutput, 0, packStateList);
}