Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.51 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement