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

#include "ratlibpoint.h"
#include "logger.h"

/**
 *
 *
 */
inline int
ratlibpoint_init (ratlibpoint_t *point, opool_t *pool)
{
	int error;
	
	if (unlikely(0 != (error = ratlibpoint_init2(point, pool, 0, 0))))
		LOG_ERROR_AND_RETURN(-1, "%s.. failed to ratlibpoint_init2, 0x%08X [%d]\n", __PRETTY_FUNCTION__, error, error);
	
	return 0;
}

/**
 *
 *
 */
inline int
ratlibpoint_init2 (ratlibpoint_t *point, opool_t *pool, uint32_t x, uint32_t y)
{
	int error;
	
	if (unlikely(point == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(0 != (error = cobject_init(&point->cobject, (cobject_destroy_func)ratlibpoint_destroy, pool))))
		LOG_ERROR_AND_RETURN(-101, "%s.. failed to cobject_init, 0x%08X [%d]\n", __PRETTY_FUNCTION__, error, error);
	
	point->x = x;
	point->y = y;
	
	return 0;
}

/**
 *
 *
 */
inline int
ratlibpoint_destroy (ratlibpoint_t *point)
{
	int error;
	
	if (unlikely(point == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	if (point->prev != NULL) {
		ratlibpoint_release(point->prev);
		point->prev = NULL;
	}
	
	if (unlikely(0 != (error = cobject_destroy(&point->cobject))))
		LOG_ERROR_AND_RETURN(-101, "%s.. failed to cobject_destroy, 0x%08X [%d]\n", __PRETTY_FUNCTION__, error, error);
	
	return 0;
}

/**
 *
 *
 */
inline int
ratlibpoint_equals (ratlibpoint_t *point1, ratlibpoint_t *point2)
{
	if (unlikely(point1 == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. [1] null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(point2 == NULL))
		LOG_ERROR_AND_RETURN(-2, "%s.. [2] null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	return point1->x == point2->x && point1->y == point2->y;
}

/**
 *
 */
inline int
ratlibpoint_setprev (ratlibpoint_t *point, ratlibpoint_t *prev)
{
	if (unlikely(point == NULL))
		LOG_ERROR_AND_RETURN(-1, "%s.. [1] null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(prev == NULL))
		LOG_ERROR_AND_RETURN(-3, "%s.. [2] null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	if (unlikely(point == prev))
		LOG_ERROR_AND_RETURN(-3, "%s.. point and prev can not be the same object\n", __PRETTY_FUNCTION__);
	
	if (point->prev != NULL)
		ratlibpoint_release(point->prev);
	
	point->prev = ratlibpoint_retain(prev);
	
	return 0;
}

/**
 *
 *
 */
inline ratlibpoint_t*
ratlibpoint_retain (ratlibpoint_t *point)
{
	if (unlikely(point == NULL))
		LOG_ERROR_AND_RETURN(NULL, "%s.. null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	return (ratlibpoint_t*)cobject_retain(&point->cobject);
}

/**
 *
 *
 */
inline void
ratlibpoint_release (ratlibpoint_t *point)
{
	if (unlikely(point == NULL))
		LOG_ERROR_AND_RETURN(, "%s.. null ratlibpoint_t\n", __PRETTY_FUNCTION__);
	
	cobject_release(&point->cobject);
}
