/*
 *  ratlibgrid.h
 *  RatLib
 *
 *  Created by Curtis Jones on 2009.11.13.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef __RATLIB_GRID_H__
#define __RATLIB_GRID_H__

#include "cobject.h"
#include "opool.h"
#include "slist.h"
#include "ratlibpoint.h"

#define RATLIB_GRID_VISITED (1<<0)
#define RATLIB_GRID_SET1    (1<<1)
#define RATLIB_GRID_SET2    (1<<2)
#define RATLIB_GRID_SET3    (1<<3)

//
// ratlibgrid
//
struct ratlibgrid
{
	cobject_t cobject;								// super class
	
	uint8_t *grid;										// grid data
	uint32_t width;										// grid width
	uint32_t height;									// grid height;
	
	slist_t set1;											// set1
	slist_t set2;											// set2
	slist_t set3;											// set3
};
typedef struct ratlibgrid ratlibgrid_t;

/**
 * ratlibgrid, pool, width, height
 */
int ratlibgrid_init (ratlibgrid_t*, opool_t*, uint32_t, uint32_t);

/**
 *
 */
int ratlibgrid_destroy (ratlibgrid_t*);

/**
 *
 */
int ratlibgrid_isvisited (ratlibgrid_t*, ratlibpoint_t*);

/**
 *
 */
int ratlibgrid_markasvisited (ratlibgrid_t*, ratlibpoint_t*);

/**
 * grid, set
 */
int ratlibgrid_set_clear (ratlibgrid_t*, uint32_t);

/**
 * grid, set, point
 */
int ratlibgrid_set_mark (ratlibgrid_t*, uint32_t, ratlibpoint_t*);

/**
 * grid, set, point
 */
int ratlibgrid_set_unmark (ratlibgrid_t*, uint32_t, ratlibpoint_t*);

/**
 * grid, set, point
 */
int ratlibgrid_set_marked (ratlibgrid_t*, uint32_t, ratlibpoint_t*);

/**
 * grid, set, point (return value)
 */
int ratlibgrid_set_any (ratlibgrid_t*, uint32_t, ratlibpoint_t**);

/**
 * grid, set
 */
int ratlibgrid_set_count (ratlibgrid_t*, uint32_t);

/**
 * grid, point, set source, set destination
 */
int ratlibgrid_set_aups (ratlibgrid_t*, ratlibpoint_t*, uint32_t, uint32_t);

/**
 * grid, point, set source, set destination
 */
int ratlibgrid_set_amps (ratlibgrid_t*, ratlibpoint_t*, uint32_t, uint32_t);

/**
 *
 */
ratlibgrid_t* ratlibgrid_retain (ratlibgrid_t*);

/**
 *
 */
void ratlibgrid_release (ratlibgrid_t*);

#endif /* __RATLIB_GRID_H__ */
