ua_indexedList.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include "ua_indexedList.h"
  2. void UA_indexedList_defaultFreer(void* payload){
  3. UA_list_defaultFreer(payload);
  4. }
  5. UA_Int32 UA_indexedList_init(UA_indexedList_List* list){
  6. if(list==UA_NULL)return UA_ERROR;
  7. return UA_list_init((UA_list_List*)list);
  8. }
  9. UA_Int32 UA_indexedList_destroy(UA_indexedList_List* list, UA_indexedList_PayloadVisitor visitor){
  10. if(list==UA_NULL)return UA_ERROR;
  11. UA_list_Element* current = UA_NULL;
  12. current=list->first;
  13. while(current){
  14. UA_list_Element* next = current->next;
  15. UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
  16. if(visitor){
  17. (*visitor)(elem->payload);
  18. }
  19. if(elem){
  20. UA_free(elem);
  21. }
  22. UA_free(current);
  23. current = next;
  24. }
  25. UA_list_init(list);
  26. return UA_NO_ERROR;
  27. }
  28. UA_Int32 UA_indexedList_initElement(UA_indexedList_Element* elem){
  29. if(elem==UA_NULL)return UA_ERROR;
  30. elem->father = UA_NULL;
  31. elem->index = -1;
  32. elem->payload = UA_NULL;
  33. return UA_NO_ERROR;
  34. }
  35. UA_Int32 UA_indexedList_addValue(UA_indexedList_List* list, UA_Int32 index, void* payload){
  36. if(list==UA_NULL)return UA_ERROR;
  37. UA_list_Element* dllElem;
  38. UA_alloc((void**)&dllElem, sizeof(UA_list_Element));
  39. UA_list_initElement(dllElem);
  40. UA_indexedList_Element* iilElem;
  41. UA_alloc((void**)&iilElem, sizeof(UA_indexedList_Element));
  42. UA_indexedList_initElement(iilElem);
  43. iilElem->index = index;
  44. iilElem->father = dllElem;
  45. iilElem->payload = payload;
  46. dllElem->payload = iilElem;
  47. return UA_list_addElementToBack((UA_list_List*)list, dllElem);
  48. }
  49. UA_Int32 UA_indexedList_addValueToFront(UA_indexedList_List* list, UA_Int32 index, void* payload) {
  50. if(list==UA_NULL)return UA_ERROR;
  51. UA_list_Element* dllElem;
  52. UA_alloc((void**)&dllElem, sizeof(UA_list_Element));
  53. UA_list_initElement(dllElem);
  54. UA_indexedList_Element* iilElem;
  55. UA_alloc((void**)&iilElem, sizeof(UA_indexedList_Element));
  56. UA_indexedList_initElement(iilElem);
  57. iilElem->index = index;
  58. iilElem->father = dllElem;
  59. iilElem->payload = payload;
  60. dllElem->payload = iilElem;
  61. return UA_list_addElementToFront((UA_list_List*)list, dllElem);
  62. }
  63. UA_indexedList_Element* UA_indexedList_find(UA_indexedList_List* const list, UA_Int32 index){
  64. if(list==UA_NULL)return UA_NULL;
  65. UA_list_Element* current = list->first;
  66. while(current){
  67. if(current->payload){
  68. UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
  69. if(elem->index == index){
  70. return elem;
  71. }
  72. }
  73. current=current->next;
  74. }
  75. return UA_NULL;
  76. }
  77. void* UA_indexedList_findValue(UA_indexedList_List* const list, UA_Int32 index){
  78. if(list==UA_NULL)return UA_NULL;
  79. UA_indexedList_Element* iilElem = UA_indexedList_find(list, index);
  80. if(iilElem){
  81. return iilElem->payload;
  82. }
  83. return UA_NULL;
  84. }
  85. UA_Int32 UA_indexedList_iterateValues(UA_indexedList_List* const list, UA_indexedList_PayloadVisitor visitor){
  86. if(list==UA_NULL)return UA_ERROR;
  87. UA_list_Element* current = list->first;
  88. while(current){
  89. if(current->payload){
  90. UA_indexedList_Element* elem = (UA_indexedList_Element*)current->payload;
  91. if(visitor){
  92. (*visitor)(elem->payload);
  93. }
  94. }
  95. current=current->next;
  96. }
  97. return UA_NO_ERROR;
  98. }
  99. UA_Int32 UA_indexedList_removeElement(UA_indexedList_List* list, UA_indexedList_Element* elem, UA_indexedList_PayloadVisitor visitor){
  100. if(list==UA_NULL || elem==UA_NULL)return UA_ERROR;
  101. if(visitor){
  102. (*visitor)(elem->payload);
  103. }
  104. UA_list_Element* father = elem->father;
  105. UA_free(elem);
  106. return UA_list_removeElement(father, UA_NULL);
  107. }