
#include "noidea.node.h"

NOIDEA_node * NOIDEA_insert (NOIDEA_node * noidea_parent, void * noidea_pack, int noidea_trie , void * noidea_null , void * noidea_ptr)
{
	//make sure there is memory allocated
	if (noidea_ptr == 0)
	{
		return 0;
	}
	NOIDEA_node * noidea_nud = (NOIDEA_node*) noidea_ptr;
	noidea_nud->pack = noidea_pack;

	if (noidea_parent == 0)
	{
		noidea_nud->sentinel = noidea_nud;
		noidea_nud->last = noidea_nud;
		noidea_nud->next = noidea_nud;
	}
	else
	{
		noidea_nud->sentinel = noidea_parent;
		if (noidea_null == 0)
		{
			noidea_null = noidea_nud;
		}

		if (noidea_trie == 0)
		{
			noidea_nud->last = noidea_null;
			noidea_nud->next = noidea_parent->next;
			noidea_parent->next = noidea_nud;
		}
		else 
		{
			noidea_nud->next = noidea_null;
			noidea_nud->last = noidea_parent->last;
			noidea_parent->last = noidea_nud;
		}
	}

	return noidea_nud;
}

void * NOIDEA_delete (NOIDEA_node * noidea_node)
{
	//return 0 if not a leaf , or it is root
	if ((noidea_node == noidea_node->sentinel) || (noidea_node->last != noidea_node->next) )
	{
		return 0;
	}
	void * noidea_pack = noidea_node->pack;
	NOIDEA_node * noidea_parent = noidea_node->sentinel;
	if (noidea_parent->next == noidea_node)
	{
		noidea_parent->next = noidea_node->next;
	}
	if (noidea_parent->last == noidea_node)
	{
		noidea_parent->last = noidea_node->last;
	}	
	return  noidea_pack;
}

void NOIDEA_roll (NOIDEA_node * noidea_pivot, NOIDEA_node * noidea_node)
{
	if (noidea_pivot == noidea_node)
	{
		return;
	}
	NOIDEA_node * noidea_parent = noidea_pivot->sentinel;
	if (noidea_pivot->next == noidea_node)
	{
		noidea_pivot->next = noidea_node->last;
		noidea_node->last = noidea_pivot;
		noidea_pivot->sentinel = noidea_node;
		noidea_node->sentinel = noidea_parent;
	}
	if (noidea_pivot->last == noidea_node)
	{
		noidea_pivot->last = noidea_node->next;
		noidea_node->next = noidea_pivot;
		noidea_pivot->sentinel = noidea_node;
		noidea_node->sentinel = noidea_parent;	
	}
	if (noidea_parent->next == noidea_pivot)
	{
		noidea_parent->next = noidea_node;
	}
	if (noidea_parent->last == noidea_pivot)
	{
		noidea_parent->last = noidea_node;
	}
	return;
}

//========================================================================================

int NOIDEA_it_is_tree(NOIDEA_node * noidea_node)
{
	if ((noidea_node->next->sentinel == noidea_node)&&(noidea_node->next->last != noidea_node))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int NOIDEA_it_is_list(NOIDEA_node * noidea_node)
{
	if (noidea_node->next->last == noidea_node)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int NOIDEA_it_is_root(NOIDEA_node * noidea_node)
{
	if (noidea_node == noidea_node->sentinel)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int NOIDEA_it_is_leaf(NOIDEA_node * noidea_node)
{
	if (noidea_node->next == noidea_node->last)	{
		return 1;
	}
	else
	{
		return 0;
	}
}
