Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "library.h"
- #include <stdlib.h>
- #include <string.h>
- typedef struct LSQ_Container {
- LSQ_IntegerIndexT size;
- LSQ_BaseTypeT *array;
- } LSQ_Container;
- typedef struct LSQ_Iterator {
- LSQ_Container *container;
- LSQ_IntegerIndexT index;
- } LSQ_Iterator;
- //функция создающая пустой контейнер
- LSQ_HandleT LSQ_CreateSequence(void) {
- LSQ_Container* newArr;
- newArr = malloc(sizeof(LSQ_Container));
- newArr->size = 0;
- return newArr;
- }
- // функция уничтожающая контейнер
- extern void LSQ_DestroySequence(LSQ_HandleT handle) {
- if(handle != LSQ_HandleInvalid) {
- free(((LSQ_Container*)handle)->array);
- free(handle);
- }
- }
- //функция возвращающая количество элеметов
- extern LSQ_IntegerIndexT LSQ_GetSize(LSQ_HandleT handle) {
- if (handle == LSQ_HandleInvalid) return (0);
- return (((LSQ_Container *) handle)->size);
- }
- //функция определяющая, указывает ли итератор на следущий за последним элементом в контейнере
- extern int LSQ_IsIteratorPastRear(LSQ_iteratorT iterator){
- return((iterator != NULL && ((LSQ_Iterator*)iterator)->index) > ((LSQ_Iterator*)iterator)->container->size);
- }
- //функция определяющая, указывает ли итератор на элемент, предшествующий первому
- extern int LSQ_IsIteratorBeforeFirst(LSQ_iteratorT iterator){
- return(iterator != NULL && ((LSQ_Iterator*)iterator)->index < 0);
- }
- //функция, определяющая, может ли итератор быть разыменован
- extern int LSQ_IsIteratorDereferencable(LSQ_iteratorT iterator){
- return (!LSQ_IsIteratorPastRear(iterator) && !LSQ_IsIteratorBeforeFirst(iterator) && iterator != NULL);
- }
- //Функция разыменовывающая итератор. Возвращает указатель на элемент, на который ссылается данный итератор
- LSQ_BaseTypeT* LSQ_DereferenceIterator(LSQ_iteratorT iterator){
- return (!LSQ_IsIteratorDereferencable(iterator))? NULL : ((LSQ_Iterator*)iterator)->container->array + ((LSQ_Iterator*)iterator)->index;
- }
- // функция, возвращающая итератор, ссылающая на элемент с указанным индексом
- LSQ_iteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index){
- LSQ_Iterator *iterator = NULL;
- if (handle == LSQ_HandleInvalid) return (NULL);
- iterator = (LSQ_Iterator*)malloc(sizeof(LSQ_Iterator));
- iterator->index = index;
- iterator->container = ((LSQ_Container *) handle);
- return ((LSQ_iteratorT)iterator);
- }
- // функция, возвращающая итератор,ссылающийся на первый элемент
- LSQ_iteratorT LSQ_GetFrontElement(LSQ_HandleT handle){
- return(LSQ_GetElementByIndex(handle, 0));
- }
- //функция, возвращающая итератор, ссылающийся на последний элемент
- LSQ_iteratorT LSQ_GetPastRearElement(LSQ_HandleT handle){
- return(handle == NULL)? NULL: (LSQ_GetElementByIndex(handle,((LSQ_Container*)handle)->size));
- }
- // функция, уничтожающая итератор
- extern void LSQ_DestroyIterator(LSQ_iteratorT iterator){
- free(iterator);
- }
- //Функция, перемещающая итератор на один элемент вперед
- extern void LSQ_AdvanceOneElement(LSQ_iteratorT iterator){
- if (((LSQ_Iterator*)iterator)->container == NULL)
- return;
- ((LSQ_Iterator*)iterator)->index++;
- }
- extern void LSQ_RewindOneElement(LSQ_iteratorT iterator){
- if (((LSQ_Iterator*)iterator)->container == NULL)
- return;
- ((LSQ_Iterator*)iterator)->index--;
- }
- // Функция, перемещающая итератор на определенное количество элементов вперед
- extern void LSQ_ShiftPosition(LSQ_iteratorT iterator, LSQ_IntegerIndexT shift){
- if (((LSQ_Iterator*)iterator)->container == NULL)
- return;
- ((LSQ_Iterator*)iterator)->index += shift;
- }
- // Функция, передвигающая итератор на указанную позицию
- extern void LSQ_SetPosition(LSQ_iteratorT iterator, LSQ_IntegerIndexT pos){
- if (((LSQ_Iterator*)iterator)->container == NULL)
- return;
- ((LSQ_Iterator*)iterator)->index = pos;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement