ua_indexedList.c 3.4 KB

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