예제 #1
0
파일: lsq_tests.c 프로젝트: Taller/Rhonda
/* Test before first and past rear */
void test3(void)
{
    LSQ_IteratorT iter = LSQ_GetFrontElement(handle);
    assert( iter != NULL);
    assert(LSQ_IsIteratorBeforeFirst(iter) != 1);
    LSQ_RewindOneElement(iter);
    assert(LSQ_IsIteratorBeforeFirst(iter) == 1);
    printf("LSQ_IsIteratorBeforeFirst\t --- \t OK \n");


    LSQ_IteratorT iter2 = LSQ_GetPastRearElement(handle);
    assert( iter2 != NULL);
    assert(LSQ_IsIteratorPastRear(iter2) == 1);
    LSQ_RewindOneElement(iter2);
    assert(LSQ_IsIteratorPastRear(iter2) != 1);
    printf("LSQ_IsIteratorPastRear\t\t --- \t OK \n");

    LSQ_DestroyIterator(iter);
    LSQ_DestroyIterator(iter2);
}	
예제 #2
0
extern void LSQ_AdvanceOneElement(LSQ_IteratorT iterator)
{
	IteratorT * iter = (IteratorT *)iterator;
	if (IS_HANDLE_INVALID(iterator) || (iter->tree->size == 0))
		return;
	if (LSQ_IsIteratorBeforeFirst(iterator)){
		iter->node = treeMinimum(iter->tree->root);	
		iter->state = IST_DEREFERENCABLE;
		return;
	}
	iter->node = successor(iter->node);
	if (iter->node == NULL)
		iter->state = IST_PAST_REAR;
}
예제 #3
0
/* Функция, перемещающая итератор на заданное смещение со знаком */
void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift){
	if(iterator == NULL)
		return;

	if(shift > 0)
		while(shift > 0 && !LSQ_IsIteratorPastRear(iterator)){
			shift--;
			ITR(iterator)->node = ITR(iterator)->node->next;
		}
	else
		while(shift < 0 && !LSQ_IsIteratorBeforeFirst(iterator)){
			ITR(iterator)->node = ITR(iterator)->node->prev;
			shift++;
		}
}
예제 #4
0
void LSQ_InsertElementBeforeGiven(LSQ_IteratorT iterator, LSQ_BaseTypeT newElement)
{
    _iterator *iter = iterator;
    _container *c = NULL;
    LSQ_BaseTypeT *temp = NULL;
    if(!LSQ_IsIteratorBeforeFirst(iter))
    {
        c = iter->container;
        c->size++;
        c->data = (LSQ_BaseTypeT *)realloc(c->data, sizeof(LSQ_BaseTypeT) * (c->size));
        temp = LSQ_DereferenceIterator(iter);
        memmove(temp + 1, temp, (c->size - 1 - iter->index) * sizeof(LSQ_BaseTypeT));
        c->data[iter->index] = newElement;
        //iter->index++;
    }
}
예제 #5
0
파일: avl-tree.c 프로젝트: twigil/loulou
void LSQ_RewindOneElement(LSQ_IteratorT iterator)
{
    IteratorPtr iter = iterator;
    NodePtr node = NULL;
    NodePtr temp = NULL;
    if (iter == NULL || LSQ_IsIteratorBeforeFirst(iter)) return;
    node = iter->node;
    if (node->left != NULL) iter->node = get_rightmost_node(node->left);
    else
    {
        temp = node->parent;
        while (temp != NULL && node == temp->left)
        {
            node = temp;
            temp = temp->parent;
        }
        iter->node = temp;
    }
}
예제 #6
0
파일: lsq_tests.c 프로젝트: Taller/Rhonda
/* Test IsIteratorDereferencable, DeleteGivenElement pastReaer, beforeFirst */
void test10(void)
{
    int i, j;

    printf("Testing IsIteratorDereferencable");
    LSQ_IteratorT iterator = LSQ_GetPastRearElement(handleAll);
    assert(LSQ_IsIteratorDereferencable(iterator) == 0);
    assert(LSQ_IsIteratorPastRear(iterator) == 1);
    LSQ_DeleteGivenElement(iterator);
    LSQ_DestroyIterator(iterator);
    printf("\t\t ---\t OK \n");
    
    iterator = LSQ_GetFrontElement(handleAll);
    LSQ_RewindOneElement(iterator);
    printf("Testing IsIteratorBeforeFirst");
    assert(LSQ_IsIteratorDereferencable(iterator) == 0);
    assert(LSQ_IsIteratorBeforeFirst(iterator) == 1);
    LSQ_DeleteGivenElement(iterator);
    LSQ_DestroyIterator(iterator);
    printf("\t\t ---\t OK \n");
}
예제 #7
0
/* Функция, определяющая, может ли данный итератор быть разыменован */
extern int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator){
	return	(iterator != NULL) ? !LSQ_IsIteratorBeforeFirst(iterator) && !LSQ_IsIteratorPastRear(iterator) : 0;
}
예제 #8
0
int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator)
{
    return !(LSQ_IsIteratorBeforeFirst(iterator) || LSQ_IsIteratorPastRear(iterator));
}