X-Git-Url: http://git.maemo.org/git/?p=mardrone;a=blobdiff_plain;f=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVP_SDK%2FATcodec%2FATcodec_Sorted_List.c;fp=mardrone%2FARDrone_SDK_Version_1_8_20110726%2FARDroneLib%2FVP_SDK%2FATcodec%2FATcodec_Sorted_List.c;h=14786d994f4e16a7030688d2e7fa360d158e65da;hp=0000000000000000000000000000000000000000;hb=9ec9bc13b75d30bc45535c54a652934debfcea92;hpb=ae0a3c2dc0898400aca0dd6b439c5db8044db7b2 diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Sorted_List.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Sorted_List.c new file mode 100644 index 0000000..14786d9 --- /dev/null +++ b/mardrone/ARDrone_SDK_Version_1_8_20110726/ARDroneLib/VP_SDK/ATcodec/ATcodec_Sorted_List.c @@ -0,0 +1,182 @@ +/** + * @file ATcodec_Sorted_List.c + * @author aurelien.morelle@parrot.fr + * @date 2007/01/30 + */ +#include "VP_Os/vp_os_assert.h" +#include "VP_Os/vp_os_malloc.h" +#include "VP_Os/vp_os_types.h" + +#include "ATcodec_Sorted_List.h" + + +#define ATCODEC_MAGIC_NUMBER 0xA7C00DEC + + +typedef struct _ATcodec_Sorted_List_header_ +{ + uint32_t magic; + + struct _ATcodec_Sorted_List_header_ *next; + struct _ATcodec_Sorted_List_header_ *previous; + uint32_t sortValue; + + void *element; +} +ATcodec_Sorted_List_header_t; + + +#define ATCODEC_SYSTEM_PTR(ELEMENT) \ + ((ATcodec_Sorted_List_header_t *)(((int)(ELEMENT))-(int)&((ATcodec_Sorted_List_header_t *)NULL)->element)) + +void +ATcodec_Sorted_List_init (ATcodec_Sorted_List_t *list, size_t size) +{ + list->head = NULL; + list->nb = 0; + list->size = size; +} + +void +ATcodec_Sorted_List_batchProcess (ATcodec_Sorted_List_t *list, ATcodec_element_processing process_func) +{ + ATcodec_Sorted_List_header_t *current = (ATcodec_Sorted_List_header_t *)list->head; + ATcodec_Sorted_List_header_t *next; + + while(current) + { + next = current->next; + process_func(¤t->element); + current = next; + } +} + +static void +ATcodec_Sorted_List_freeElement(void *element) +{ + vp_os_free(ATCODEC_SYSTEM_PTR(element)); +} + +void +ATcodec_Sorted_List_destroy (ATcodec_Sorted_List_t *list) +{ + ATcodec_Sorted_List_batchProcess(list, ATcodec_Sorted_List_freeElement); +} + +void * +ATcodec_Sorted_List_headElement (ATcodec_Sorted_List_t *list) +{ + return &((ATcodec_Sorted_List_header_t *)list->head)->element; +} + +void * +ATcodec_Sorted_List_nextElement (ATcodec_Sorted_List_t *list, void *element) +{ + ATcodec_Sorted_List_header_t *system_ptr = ATCODEC_SYSTEM_PTR(element); + return &system_ptr->next->element; +} + +void * +ATcodec_Sorted_List_previousElement (ATcodec_Sorted_List_t *list, void *element) +{ + ATcodec_Sorted_List_header_t *system_ptr = ATCODEC_SYSTEM_PTR(element); + return &system_ptr->previous->element; +} + +void * +ATcodec_Sorted_List_getElement (ATcodec_Sorted_List_t *list, unsigned int index) +{ + ATcodec_Sorted_List_header_t *current = (ATcodec_Sorted_List_header_t *)list->head; + + while(current && index--) + { + current = current->next; + } + + return (current ? ¤t->element : NULL); +} + +void +ATcodec_Sorted_List_removeElement (ATcodec_Sorted_List_t *list, void *element) +{ + ATcodec_Sorted_List_header_t *system_ptr; + ATcodec_Sorted_List_header_t *next; + ATcodec_Sorted_List_header_t *previous; + + VP_OS_ASSERT(element); + + system_ptr = ATCODEC_SYSTEM_PTR(element); + + VP_OS_ASSERT(system_ptr); + VP_OS_ASSERT(system_ptr->magic == ATCODEC_MAGIC_NUMBER); + + next = system_ptr->next; + previous = system_ptr->previous; + + if(previous) + { + previous->next = next; + } + else + { + list->head = next; + } + + if(next) + next->previous = previous; + + vp_os_free(system_ptr); + + list->nb--; +} + +void +ATcodec_Sorted_List_insertElement (ATcodec_Sorted_List_t *list, const void *element, int sortValue) +{ + ATcodec_Sorted_List_header_t *current = (ATcodec_Sorted_List_header_t *)list->head; + ATcodec_Sorted_List_header_t *previous = NULL; + ATcodec_Sorted_List_header_t *ptr = (ATcodec_Sorted_List_header_t *)vp_os_malloc(list->size+sizeof(ATcodec_Sorted_List_header_t)-sizeof(void *)); + + ptr->magic = ATCODEC_MAGIC_NUMBER; + ptr->sortValue = sortValue; + memcpy(&ptr->element, element, list->size); + + while(current && sortValue >= (int32_t)current->sortValue) + { + previous = current; + current = current->next; + } + + if(current && sortValue < (int32_t)current->sortValue) + { + if(current->previous) + { + current->previous->next = ptr; + } + else + { + list->head = ptr; + } + + ptr->previous = current->previous; + ptr->next = current; + current->previous = ptr; + } + else + { + if(previous) + { + previous->next = ptr; + ptr->previous = previous; + ptr->next = NULL; + } + else + { + list->head = ptr; + ptr->previous = NULL; + ptr->next = NULL; + } + } + + list->nb++; +}