/* 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); }
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; }
/* Функция, перемещающая итератор на заданное смещение со знаком */ 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++; } }
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++; } }
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; } }
/* 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"); }
/* Функция, определяющая, может ли данный итератор быть разыменован */ extern int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator){ return (iterator != NULL) ? !LSQ_IsIteratorBeforeFirst(iterator) && !LSQ_IsIteratorPastRear(iterator) : 0; }
int LSQ_IsIteratorDereferencable(LSQ_IteratorT iterator) { return !(LSQ_IsIteratorBeforeFirst(iterator) || LSQ_IsIteratorPastRear(iterator)); }