/* Функция, устанавливающая итератор на элемент с указанным номером */ void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos){ if(iterator == NULL || ITR(iterator)->list == NULL) return; if(pos <= (ITR(iterator)->list->size / 2)){ ITR(iterator)->node = ITR(iterator)->list->BeforFirst; LSQ_ShiftPosition(iterator, pos + 1); }else{ ITR(iterator)->node = ITR(iterator)->list->PastRear; LSQ_ShiftPosition(iterator, pos - ITR(iterator)->list->size); } }
extern void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos) { IteratorT * iter = (IteratorT *)iterator; if IS_HANDLE_INVALID(iterator) return; iter->state = IST_BEFORE_FIRST; LSQ_ShiftPosition(iterator, pos + 1); }
/* Test moving on list with ShiftPosition */ void test6(void) { int i, j; LSQ_IteratorT iter; srand ( time(NULL) ); // print_LSQ(handleAll); printf("Testing ShiftPosition forward"); for(i = 0; i < MAX_TEST_ATTEMPTS; i++) { iter = LSQ_GetFrontElement(handleAll); assert( iter != NULL); j = rand() % LSQ_GetSize(handleAll); LSQ_ShiftPosition(iter, j); assert(*LSQ_DereferenceIterator(iter) == all[j]); assert( *LSQ_DereferenceIterator(iter) != MAX_ELEMENT_VALUE + 1); LSQ_DestroyIterator(iter); } printf("\t\t ---\t OK \n"); printf("Testing ShiftPosition backward"); for(i = 0; i < MAX_TEST_ATTEMPTS; i++) { iter = LSQ_GetPastRearElement(handleAll); LSQ_RewindOneElement(iter); assert( iter != NULL); j = rand() % LSQ_GetSize(handleAll); LSQ_ShiftPosition(iter, -j); assert( *LSQ_DereferenceIterator(iter) == all[LSQ_GetSize(handleAll) - 1 - j]); assert( *LSQ_DereferenceIterator(iter) != MAX_ELEMENT_VALUE + 1); LSQ_DestroyIterator(iter); // printf("i = %d \t j = %d\n", i, j); } printf("\t\t ---\t OK \n"); }
void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos){ TreeIteratorPtr it = iterator; if(pos < 0 || pos >= it->tree->size){ setIterator(it, NULL, 0, pos < 0 ? IT_BEFORE_FIRST : IT_PAST_REAR); return; } TreeNodePtr root = it->tree->root; setIterator(it, root, 0, IT_NORMAL); LSQ_ShiftPosition(it, pos - (isLeaf(root) ? 0 : root->subtreeKeyCount[0])); }
/* Функция, перемещающая итератор на один элемент назад */ void LSQ_RewindOneElement(LSQ_IteratorT iterator){ LSQ_ShiftPosition(iterator, -1); }
/* Функция, перемещающая итератор на один элемент вперед */ void LSQ_AdvanceOneElement(LSQ_IteratorT iterator){ LSQ_ShiftPosition(iterator, 1); }
extern void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos) { if(iterator == NULL) return; ((ArrayIteratorPointerT)iterator)->index = 0; LSQ_ShiftPosition(iterator, pos); }
extern void LSQ_SetPosition(LSQ_IteratorT iterator, LSQ_IntegerIndexT pos) { if IS_HANDLE_INVALID(iterator) return; LSQ_ShiftPosition(iterator, pos - ((IteratorT *)iterator)->index); }