/***************************************************************************
 *   Copyright (C) 2003-2004 by David Saxton                               *
 *   david@bluehaze.org                                                    *
 *                                                                         *
 *   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 2 of the License, or     *
 *   (at your option) any later version.                                   *
 ***************************************************************************/

#include "cells.h"



#if 0
class CellSmall
{
	public:
		/**
	 * Resets bestScore, prevX, prevY, addedToLabels, it, permanent for each cell
		 */
		void reset();
	
// 		Point *point; // Pointer to the point in the TempLabelMap
		short prevX, prevY; // Which cell this came from, (-1,-1) if originating cell
		unsigned short CIpenalty; // 'Penalty' of using the cell from CNItem
		unsigned short Cpenalty; // 'Penalty' of using the cell from Connector
		unsigned short bestScore; // Best (lowest) score so far, _the_ best if it is permanent
		unsigned char numCon; // Number of connectors through that point
		bool permanent:1; // Whether the score can be improved on
		bool addedToLabels:1; // Whether the cell has already been added to the list of cells to check
};

class CellBig
{
	public:
		/**
	 * Resets bestScore, prevX, prevY, addedToLabels, it, permanent for each cell
		 */
		void reset();
	
		Point *point; // Pointer to the point in the TempLabelMap
		short prevX, prevY; // Which cell this came from, (-1,-1) if originating cell
		unsigned short CIpenalty; // 'Penalty' of using the cell from CNItem
		unsigned short Cpenalty; // 'Penalty' of using the cell from Connector
		unsigned short bestScore; // Best (lowest) score so far, _the_ best if it is permanent
		unsigned char numCon; // Number of connectors through that point
		bool permanent:1; // Whether the score can be improved on
		bool addedToLabels:1; // Whether the cell has already been added to the list of cells to check
};
#endif


Cells::Cells( const uint w, const uint h )
{
#if 0
	kdDebug() << "sizeof(CellSmall)="<<sizeof(CellSmall)<<endl;
	kdDebug() << "sizeof(CellBig)="<<sizeof(Cell)<<endl;
	kdDebug() << "sizeof(unsigned short)="<<sizeof(unsigned short)<<endl;
	kdDebug() << "sizeof(short)="<<sizeof(short)<<endl;
	kdDebug() << "sizeof(Point*)="<<sizeof(Point*)<<endl;
	kdDebug() << "sizeof(bool)="<<sizeof(bool)<<endl;
	kdDebug() << "sizeof(char)="<<sizeof(char)<<endl;
#endif
	init( w, h );
}


Cells::~Cells()
{
	for ( uint i=0; i<m_w; ++i )
	{
		delete [] m_cells[i];
	}
	delete [] m_cells;
}

Cells::Cells( const Cells &c )
{
	init( c.width(), c.height() );
	for ( uint x=0; x<m_w; x++ )
	{
		for ( uint y=0; y<m_h; y++ )
		{
			m_cells[x][y] = c.cell( x, y );
		}
	}
}


void Cells::init( const uint w, const uint h )
{
	m_w = w;
	m_h = h;
	
	typedef Cell* cellptr;
	m_cells = new cellptr[m_w];
	for ( uint i=0; i<m_w; ++i )
	{
		m_cells[i] = new Cell[m_h];
	}
}


void Cells::reset()
{
	for ( uint x=0; x<m_w; x++ )
	{
		for ( uint y=0; y<m_h; y++ )
		{
			m_cells[x][y].reset();
		}
	}
}


Point::Point()
{
	x = y = prevX = prevY = -1;
}

Cell::Cell()
{
	addedToLabels = false;
	permanent = false;
	CIpenalty = 0;
	numCon = 0;
	Cpenalty = 0;
	bestScore = (int)1e9; // Nice large value
}

void Cell::reset()
{
	addedToLabels = false;
	permanent = false;
	bestScore = (int)1e9; // Nice large value
}



