ua_indexedList.c 3.4 KB

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