You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.9 KiB
89 lines
2.9 KiB
/* fcs_isa.c - Freecell Solver Indirect State Allocation Routines
|
|
|
|
Written by Shlomi Fish, 2000
|
|
This file is distributed under the public domain.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#include "fcs_config.h"
|
|
|
|
|
|
#include "state.h"
|
|
#include "fcs.h"
|
|
|
|
#include "fcs_isa.h"
|
|
|
|
#ifdef DMALLOC
|
|
#include "dmalloc.h"
|
|
#endif
|
|
|
|
void freecell_solver_state_ia_init(freecell_solver_hard_thread_t * hard_thread)
|
|
{
|
|
hard_thread->max_num_state_packs = IA_STATE_PACKS_GROW_BY;
|
|
hard_thread->state_packs = (fcs_state_with_locations_t * *)malloc(sizeof(fcs_state_with_locations_t *) * hard_thread->max_num_state_packs);
|
|
hard_thread->num_state_packs = 1;
|
|
/*
|
|
* All the states should fit in one 64KB segment. Now, we allocate as
|
|
* many states as possible, minus one, so we would be certain that there
|
|
* would be place for the overhead required by the malloc algorithm.
|
|
* */
|
|
hard_thread->state_pack_len = (0x010000 / sizeof(fcs_state_with_locations_t)) - 1;
|
|
hard_thread->state_packs[0] = malloc(hard_thread->state_pack_len*sizeof(fcs_state_with_locations_t));
|
|
|
|
hard_thread->num_states_in_last_pack = 0;
|
|
}
|
|
|
|
#if 0
|
|
fcs_state_with_locations_t * fcs_state_ia_alloc(freecell_solver_hard_thread_t * hard_thread)
|
|
{
|
|
if (hard_thread->num_states_in_last_pack == hard_thread->state_pack_len)
|
|
{
|
|
if (hard_thread->num_state_packs == hard_thread->max_num_state_packs)
|
|
{
|
|
hard_thread->max_num_state_packs += IA_STATE_PACKS_GROW_BY;
|
|
hard_thread->state_packs = (fcs_state_with_locations_t * *)realloc(hard_thread->state_packs, sizeof(fcs_state_with_locations_t *) * hard_thread->max_num_state_packs);
|
|
}
|
|
hard_thread->state_packs[hard_thread->num_state_packs] = malloc(hard_thread->state_pack_len * sizeof(fcs_state_with_locations_t));
|
|
hard_thread->num_state_packs++;
|
|
hard_thread->num_states_in_last_pack = 0;
|
|
}
|
|
return &(hard_thread->state_packs[hard_thread->num_state_packs-1][hard_thread->num_states_in_last_pack++]);
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
void fcs_state_ia_release(freecell_solver_hard_thread_t * hard_thread)
|
|
{
|
|
hard_thread->num_states_in_last_pack--;
|
|
}
|
|
#endif
|
|
|
|
void freecell_solver_state_ia_finish(freecell_solver_hard_thread_t * hard_thread)
|
|
{
|
|
int a;
|
|
for(a=0;a<hard_thread->num_state_packs;a++)
|
|
{
|
|
free(hard_thread->state_packs[a]);
|
|
}
|
|
free(hard_thread->state_packs);
|
|
hard_thread->state_packs = NULL;
|
|
}
|
|
|
|
void freecell_solver_state_ia_foreach(freecell_solver_hard_thread_t * hard_thread, void (*ptr_function)(fcs_state_with_locations_t *, void *), void * context)
|
|
{
|
|
int p,s;
|
|
for(p=0;p<hard_thread->num_state_packs-1;p++)
|
|
{
|
|
for(s=0 ; s < hard_thread->state_pack_len ; s++)
|
|
{
|
|
ptr_function(&(hard_thread->state_packs[p][s]), context);
|
|
}
|
|
}
|
|
for(s=0; s < hard_thread->num_states_in_last_pack ; s++)
|
|
{
|
|
ptr_function(&(hard_thread->state_packs[p][s]), context);
|
|
}
|
|
}
|