/**********************************************************************
This file is part of Crack dot Com's free source code release of Golgotha.
for information about compiling & licensing issues visit this URL
 If that doesn't help, contact Jonathan Clark at 
  golgotha_source@usa.net (Subject should have "GOLG" in it) 
***********************************************************************/

#include "solvegraph_breadth.hh"
#include "search.hh"

void g1_breadth_first_graph_solver_class::set_graph(g1_critical_graph_class *_graph)
{
  graph=_graph;
  if (!graph || !solve_graph || graph->criticals!=nodes)
  {
    if (solve_graph)
      i4_free(solve_graph);

    nodes = graph->criticals;
    solve_graph = (solve_node*)i4_malloc(nodes*sizeof(solve_node), "solve_graph");
  }
}

g1_breadth_first_graph_solver_class::~g1_breadth_first_graph_solver_class()
{
  if (solve_graph)
    i4_free(solve_graph);
}


int compare_nodes(const g1_breadth_first_graph_solver_class::solve_node *a, 
                  const g1_breadth_first_graph_solver_class::solve_node *b)
{
  // smallest length last
  if (b->length > a->length)
    return 1;
  else if (b->length < a->length)
    return -1;
  else
    return 0;
}

i4_bool g1_breadth_first_graph_solver_class::add_node(g1_graph_node node, g1_graph_node from, 
                                                      i4_float len)
{
  if (solve_graph[node].ref && solve_graph[node].lengthcritical[node].connection;
    for (int i=0; icritical[node].connections; i++, c++)
      if (group_size<=c->size[grade])
        add_node(c->ref, node, len + c->dist);
  }

  points=0;
  
  if (solve_graph[end_node].ref==0)
    return i4_F;

  // count nodes
  node = end_node;
  points = 0;
  while (node!=start_node)
  {
    point[points*2+0] = i4_float(graph->critical[node].x)+0.5;
    point[points*2+1] = i4_float(graph->critical[node].y)+0.5;
    points++;
    node = solve_graph[node].ref;
  }
  point[points*2+0] = i4_float(graph->critical[start_node].x)+0.5;
  point[points*2+1] = i4_float(graph->critical[start_node].y)+0.5;
  points++;

  return i4_T;
}