/* Test moving on list with setPosition */ void test4(void) { int i, j; srand ( time(NULL) ); LSQ_IteratorT iter = LSQ_GetFrontElement(handleAll); assert( iter != NULL); // print_LSQ(handleAll); printf("Testing SetPosition"); for(i = 0; i < MAX_TEST_ATTEMPTS; i++) { j = rand() % 1000; // printf("\n Step = %d \t setPosition = %d ", i, j); LSQ_SetPosition(iter, j); if( j < LSQ_GetSize(handleAll)) { // printf("\n Expecting value = %d \t ", all[j]); // printf("\n Found value = %d \t ", iter->self->value); assert( *LSQ_DereferenceIterator(iter) == all[j]); assert( *LSQ_DereferenceIterator(iter) != MAX_ELEMENT_VALUE + 1); } } printf("\t\t ---\t OK \n"); LSQ_DestroyIterator(iter); }
/* Checking front and rear filling */ void test2(void) { int i; // print_LSQ(handle); LSQ_IteratorT iter = LSQ_GetFrontElement(handle); assert( iter != NULL); for(i = 49; i >= 0; i--) { // printf("front = %d \t index i = %d \t value = %d \n",front[i], i, *LSQ_DereferenceIterator(iter)); assert( *LSQ_DereferenceIterator(iter) == front[i] ); assert( *LSQ_DereferenceIterator(iter) != MAX_ELEMENT_VALUE + 1 ); LSQ_AdvanceOneElement(iter); } LSQ_SetPosition(iter, LSQ_GetSize(handle)-1); assert( iter != NULL); // print_LSQ(handle); // printf("iter = %p \t node = %p \t value = %d \n", iter, iter->self, iter->self->value); for(i = 49; i >= 0; i--) { // printf("rear = %d \t index i = %d \t value = %d \n",rear[i], i, *LSQ_DereferenceIterator(iter)); assert( *LSQ_DereferenceIterator(iter) == rear[i] ); assert( *LSQ_DereferenceIterator(iter) != MAX_ELEMENT_VALUE + 1 ); LSQ_RewindOneElement(iter); } // print_LSQ(handle); LSQ_DestroyIterator(iter); }
LSQ_IteratorT LSQ_GetFrontElement(LSQ_HandleT handle){ TreeIteratorPtr it = malloc(sizeof(TreeIterator)); if(NULL == it) return NULL; it->tree = handle; LSQ_SetPosition(it, 0); return it; }
void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift){ if(NULL == iterator || !shift) return; TreeIteratorPtr it = iterator; if(it->state == IT_PAST_REAR && shift > 0 || it->state == IT_BEFORE_FIRST && shift < 0) return; if(it->state == IT_BEFORE_FIRST){ LSQ_SetPosition(it, 0); shift--; } else if(it->state == IT_PAST_REAR){ LSQ_SetPosition(it, it->tree->size - 1); shift++; } if(shift > 0) shiftForward(it, shift); else shiftBackward(it, -shift); }
void LSQ_ShiftPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT shift) { _iterator *iter = iterator; if (iter != NULL) { shift += iter->index; LSQ_SetPosition(iter, shift); } }
/* Функция, возвращающая итератор, ссылающийся на элемент с указанным индексом */ LSQ_IteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index){ TypeIterator *iterator = NULL; if(handle == NULL) return(LSQ_HandleInvalid); iterator = (TypeIterator*)malloc(sizeof(TypeIterator)); iterator->list = SEQ(handle); LSQ_SetPosition(iterator, index); return(iterator); }