/* This file is part of ct. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ct. If not, see . */ #ifndef ACTIONS_H #define ACTIONS_H #include #include #include // =================================================================== // Types // =================================================================== enum A_TYPE { A_PLACE, A_MOVE }; typedef uint32_t action_t; #define A_DATA1_SHIFT 24 #define A_DATA0_SHIFT 16 #define A_LOC_SHIFT 8 #define A_GET_DATA1(a) (enum A_TYPE)((a)>>A_DATA1_SHIFT) #define A_GET_DATA0(a) (int8_t)(((a)>>A_DATA0_SHIFT) & 0xFF) #define A_GET_LOC(a) (uint8_t)(((a)>>A_LOC_SHIFT) & 0xFF) #define A_GET_TYPE(a) (uint8_t)((a) & 0xFF) #define A_BUILD(type,loc,data0,data1) ((type) \ | (loc) << A_LOC_SHIFT \ | (data0) << A_DATA0_SHIFT \ | (data1) << A_DATA1_SHIFT) // lazy queue #define ACTION_AR_LEN 256 typedef struct action_lq_s { action_t actions[ACTION_AR_LEN*2]; int length, i_f, i_b; } action_lq_t; // =================================================================== // Variables // =================================================================== extern int8_t move_deltas[4]; // =================================================================== // Methods // =================================================================== void action_lq_init(void); void action_lq_free(action_lq_t *lq); action_lq_t *action_lq_generate(void); action_lq_t *action_lq_copy_with_mtf(action_lq_t *lq, action_t front); int action_move_to_front(const action_t action, action_lq_t *lq); void action_take(const action_t action); void action_undo(const action_t action); void action_to_ptn(const action_t action, char* out_ptn); #endif