SHARE
TWEET

Untitled

a guest Jan 22nd, 2020 50 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include "library.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. typedef struct LSQ_Container {
  7.     LSQ_IntegerIndexT size;
  8.     LSQ_BaseTypeT *array;
  9. } LSQ_Container;
  10.  
  11. typedef struct LSQ_Iterator {
  12.     LSQ_Container *container;
  13.     LSQ_IntegerIndexT index;
  14. } LSQ_Iterator;
  15.  
  16. //функция создающая пустой контейнер
  17. LSQ_HandleT LSQ_CreateSequence(void) {
  18.     LSQ_Container* newArr;
  19.     newArr = malloc(sizeof(LSQ_Container));
  20.     newArr->size = 0;
  21.     return newArr;
  22. }
  23.  
  24. // функция уничтожающая контейнер
  25. extern void LSQ_DestroySequence(LSQ_HandleT handle) {
  26.     if(handle != LSQ_HandleInvalid) {
  27.         free(((LSQ_Container*)handle)->array);
  28.         free(handle);
  29.     }
  30. }
  31.  
  32. //функция возвращающая количество элеметов
  33. extern LSQ_IntegerIndexT LSQ_GetSize(LSQ_HandleT handle) {
  34.     if (handle == LSQ_HandleInvalid) return (0);
  35.     return (((LSQ_Container *) handle)->size);
  36. }
  37.  
  38. //функция определяющая, указывает ли итератор на следущий за последним элементом в контейнере
  39. extern int LSQ_IsIteratorPastRear(LSQ_iteratorT iterator){
  40.     return((iterator != NULL && ((LSQ_Iterator*)iterator)->index) > ((LSQ_Iterator*)iterator)->container->size);
  41. }
  42.  
  43. //функция определяющая, указывает ли итератор на элемент, предшествующий первому
  44. extern int LSQ_IsIteratorBeforeFirst(LSQ_iteratorT iterator){
  45.     return(iterator != NULL && ((LSQ_Iterator*)iterator)->index < 0);
  46. }
  47.  
  48. //функция, определяющая, может ли итератор быть разыменован
  49. extern int LSQ_IsIteratorDereferencable(LSQ_iteratorT iterator){
  50.     return (!LSQ_IsIteratorPastRear(iterator) && !LSQ_IsIteratorBeforeFirst(iterator) && iterator != NULL);
  51. }
  52.  
  53. //Функция разыменовывающая итератор. Возвращает указатель на элемент, на который ссылается данный итератор
  54. LSQ_BaseTypeT* LSQ_DereferenceIterator(LSQ_iteratorT iterator){
  55.     return (!LSQ_IsIteratorDereferencable(iterator))? NULL : ((LSQ_Iterator*)iterator)->container->array + ((LSQ_Iterator*)iterator)->index;
  56. }
  57.  
  58. // функция, возвращающая итератор, ссылающая на элемент с указанным индексом
  59. LSQ_iteratorT LSQ_GetElementByIndex(LSQ_HandleT handle, LSQ_IntegerIndexT index){
  60.     LSQ_Iterator *iterator = NULL;
  61.  
  62.     if (handle == LSQ_HandleInvalid) return (NULL);
  63.     iterator = (LSQ_Iterator*)malloc(sizeof(LSQ_Iterator));
  64.     iterator->index = index;
  65.     iterator->container = ((LSQ_Container *) handle);
  66.     return ((LSQ_iteratorT)iterator);
  67. }
  68.  
  69. // функция, возвращающая итератор,ссылающийся на первый элемент
  70. LSQ_iteratorT LSQ_GetFrontElement(LSQ_HandleT handle){
  71.     return(LSQ_GetElementByIndex(handle, 0));
  72. }
  73.  
  74. //функция, возвращающая итератор, ссылающийся на последний элемент
  75. LSQ_iteratorT LSQ_GetPastRearElement(LSQ_HandleT handle){
  76.     return(handle == NULL)? NULL: (LSQ_GetElementByIndex(handle,((LSQ_Container*)handle)->size));
  77. }
  78.  
  79. // функция, уничтожающая итератор
  80. extern void LSQ_DestroyIterator(LSQ_iteratorT iterator){
  81.     free(iterator);
  82. }
  83.  
  84. //Функция, перемещающая итератор на один элемент вперед
  85. extern void LSQ_AdvanceOneElement(LSQ_iteratorT iterator){
  86.     if (((LSQ_Iterator*)iterator)->container == NULL)
  87.         return;
  88.     ((LSQ_Iterator*)iterator)->index++;
  89. }
  90.  
  91. extern void LSQ_RewindOneElement(LSQ_iteratorT iterator){
  92.     if (((LSQ_Iterator*)iterator)->container == NULL)
  93.         return;
  94.     ((LSQ_Iterator*)iterator)->index--;
  95. }
  96.  
  97. // Функция, перемещающая итератор на определенное количество элементов вперед
  98. extern void LSQ_ShiftPosition(LSQ_iteratorT iterator, LSQ_IntegerIndexT shift){
  99.     if (((LSQ_Iterator*)iterator)->container == NULL)
  100.         return;
  101.     ((LSQ_Iterator*)iterator)->index += shift;
  102. }
  103.  
  104. // Функция, передвигающая итератор на указанную позицию
  105. extern void LSQ_SetPosition(LSQ_iteratorT iterator, LSQ_IntegerIndexT pos){
  106.     if (((LSQ_Iterator*)iterator)->container == NULL)
  107.         return;
  108.     ((LSQ_Iterator*)iterator)->index = pos;
  109. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top