31 #include <oc_stdlib.h> 32 #include <oc_errors.h> 39 #define _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 43 #undef _________________________________________LOCAL_PROTOTYPES_SECTION___________________________________________________________________ 51 #define _________________________________________INTERFACE_SECTION__________________________________________________________________________ 59 list = kmalloc(
sizeof(
struct List_t) , Allocator , Flags );
82 bool List_Delete(
oC_List_t * List , AllocationFlags_t Flags )
86 if(List_IsCorrect(*List))
90 (*List)->ObjectControl = 0;
92 if(kfree(*List,Flags))
99 oC_SaveError(
"List-delete: cannot release memory" , oC_ErrorCode_ReleaseError);
104 oC_SaveError(
"List-delete: cannot clear the list" , oC_ErrorCode_ReleaseError);
116 bool success =
false;
120 success = kfree(Element->Object,AllocationFlags_CanWaitForever) && kfree(Element,AllocationFlags_CanWaitForever);
132 if(isaddresscorrect(Object))
138 handle->Object = kmalloc(Size, Allocator , AllocationFlags_CanWaitForever);
139 memcpy(handle->Object,Object,Size);
142 handle->Previous =
NULL;
151 bool List_Contains(
oC_List_t List ,
void * Object , oC_UInt_t Size )
153 return List_CountObjects(List,Object,Size) > 0;
162 if(List_IsCorrect(List))
174 bool success =
false;
176 if(List_IsCorrect(List))
182 while(List_DeleteElement(element))
185 previous = previous->Previous;
195 uint32_t List_CountObjects(
oC_List_t List ,
void * Object , oC_UInt_t Size )
199 if(List_IsCorrect(List) && (Size > 0) && (isaddresscorrect(Object)))
203 if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
215 int List_IndexOf(
oC_List_t List ,
void * Object , oC_UInt_t Size )
219 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
221 int currentIndex = 0;
224 if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
226 index = currentIndex;
242 if(List_IsCorrect(List))
244 int currentIndex = 0;
247 if(ElementHandle == element)
249 index = currentIndex;
265 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
269 if((Size == element->Size) && (memcmp(Object,element->Object,element->Size) == 0))
286 if(List_IsCorrect(List) && (Index >= 0))
288 int currentIndex = 0;
291 if(currentIndex == Index)
304 bool List_PushBack(
oC_List_t List ,
const void * Object , oC_UInt_t Size ,
Allocator_t Allocator)
308 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
314 if(List->Last && List->First)
316 element->Previous = List->Last;
317 element->Next =
NULL;
318 List->Last->Next = element;
319 List->Last = element;
323 PushToEmpty(List,element);
331 oC_SaveError(
"List - push back element error" , oC_ErrorCode_AllocationError);
340 bool List_PushFront(
oC_List_t List ,
const void * Object , oC_UInt_t Size ,
Allocator_t Allocator)
344 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
350 if(List->Last && List->First)
352 element->Next = List->First;
353 element->Previous =
NULL;
354 List->First->Previous = element;
355 List->First = element;
359 PushToEmpty(List,element);
367 oC_SaveError(
"List - push front element error" , oC_ErrorCode_AllocationError);
378 bool inserted =
false;
380 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
382 if(List->First ==
NULL && List->Last ==
NULL)
384 inserted = List_PushFront(List,Object,Size,Allocator);
386 else if(isram(ElementHandle)==
false)
388 oC_SaveError(
"List-insert-after: ElementHandle is not in ram " , oC_ErrorCode_WrongAddress);
390 else if(List->Last == ElementHandle)
392 inserted = List_PushBack(List,Object,Size,Allocator);
400 element->Next = ElementHandle->Next;
401 element->Previous = ElementHandle;
403 ElementHandle->Next->Previous = element;
404 ElementHandle->Next = element;
411 oC_SaveError(
"List - insert after element error" , oC_ErrorCode_AllocationError);
423 bool inserted =
false;
425 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
427 if( (List->First == ElementHandle) || (List->First ==
NULL && List->Last ==
NULL))
429 inserted = List_PushFront(List,Object,Size,Allocator);
431 else if(isram(ElementHandle)==
false)
433 oC_SaveError(
"List-insert-after: ElementHandle is not in ram " , oC_ErrorCode_WrongAddress);
441 element->Next = ElementHandle;
442 element->Previous = ElementHandle->Previous;
444 ElementHandle->Previous->Next = element;
445 ElementHandle->Previous = element;
452 oC_SaveError(
"List - insert before element error" , oC_ErrorCode_AllocationError);
464 bool replaced =
false;
466 if(List_IsCorrect(List) && (Size > 0) && isram(ElementHandle) && isaddresscorrect(Object))
468 if( List->First ==
NULL && List->Last ==
NULL )
474 if(!kfree(ElementHandle->Object,Flags))
476 oC_SaveError(
"List replace" , oC_ErrorCode_ReleaseError);
479 ElementHandle->Object = kmalloc(Size,Allocator,Flags);
481 if(ElementHandle->Object)
483 memcpy(ElementHandle->Object,Object,Size);
484 ElementHandle->Size = Size;
498 bool removed =
false;
500 if(List_IsCorrect(List) && isram(ElementHandle) && (List->Count > 0))
502 if(ElementHandle == List->First)
504 removed = List_PopFront(List);
506 else if (ElementHandle == List->Last)
508 removed = List_PopBack(List);
515 previous->Next = next;
516 next->Previous = previous;
518 removed = List_DeleteElement(ElementHandle);
527 uint32_t List_RemoveAll(
oC_List_t List ,
void * Object , oC_UInt_t Size )
529 uint32_t removedCount = 0;
531 if(List_IsCorrect(List) && (Size > 0) && isaddresscorrect(Object))
535 while(handle !=
NULL)
537 if(Size == handle->Size && (memcmp(Object,handle->Object,Size) == 0))
539 if(List_Remove(List,handle))
556 void * Object =
NULL;
558 if(List_IsCorrect(List) && isram(ElementHandle) && isram(outObject))
560 if(Size == ElementHandle->Size)
563 memcpy(outObject,ElementHandle->Object,Size);
572 void * List_AtWithDefault(
oC_List_t List ,
void * DefaultObject , oC_UInt_t DefaultSize ,
oC_List_ElementHandle_t ElementHandle ,
void * outObject , oC_UInt_t Size )
574 void * AtObject = DefaultObject;
576 if(isram(outObject) && isaddresscorrect(DefaultObject))
578 if(Size == DefaultSize)
580 memcpy(outObject,DefaultObject,Size);
583 if(List_IsCorrect(List) && isram(ElementHandle))
585 if(Size == ElementHandle->Size)
587 AtObject = outObject;
588 memcpy(outObject,ElementHandle->Object,Size);
619 if(List_IsCorrect(List) && (List->Last !=
NULL))
623 List->Last = handle->Previous;
625 if(List->Last ==
NULL)
631 List->Last->Next =
NULL;
634 poped = List_DeleteElement(handle);
646 if(List_IsCorrect(List) && (List->Last !=
NULL))
650 List->First = handle->Next;
652 if(List->First ==
NULL)
658 List->First->Previous =
NULL;
661 poped = List_DeleteElement(handle);
673 if(List_IsCorrect(List) && isram(I) && isram(J))
675 void *
object = I->Object;
676 oC_UInt_t size = I->Size;
678 I->Object = J->Object;
696 if(List_IsCorrect(List) && isram(ElementHandle) && ElementHandle->Size == Size && isram(outObject))
698 if(ElementHandle == List->First)
700 result = List_TakeFirst(List,outObject,Size);
702 else if (ElementHandle == List->Last)
704 result = List_TakeLast(List,outObject,Size);
710 memcpy(outObject,ElementHandle->Object,Size);
717 previous->Next = next;
722 next->Previous = previous;
725 if(!List_DeleteElement(ElementHandle))
727 oC_SaveError(
"List , takeAt, delete element" , oC_ErrorCode_ReleaseError);
737 bool List_TakeFirst(
oC_List_t List ,
void * outObject , oC_UInt_t Size )
741 if(List_IsCorrect(List) && List->First !=
NULL && List->First->Size == Size && isram(outObject))
747 memcpy(outObject,List->First->Object,Size);
749 List->First = List->First->Next;
751 if(List->Last == first)
753 List->Last = List->First;
756 if(List->First !=
NULL)
758 List->First->Previous =
NULL;
761 if(!List_DeleteElement(first))
763 oC_SaveError(
"List , take first, delete element" , oC_ErrorCode_ReleaseError);
772 bool List_TakeLast(
oC_List_t List ,
void * outObject , oC_UInt_t Size )
776 if(List_IsCorrect(List) && List->Last !=
NULL && isram(outObject))
782 memcpy(outObject,List->Last->Object,Size);
784 List->Last = List->Last->Previous;
786 if(List->First == last)
788 List->First = List->Last;
791 if(List->Last !=
NULL)
793 List->Last->Next =
NULL;
796 if(!List_DeleteElement(last))
798 oC_SaveError(
"List , take last, delete element" , oC_ErrorCode_ReleaseError);
809 bool correct =
false;
811 if(List_IsCorrect(List))
820 correct = count == List->Count;
828 bool List_Repair(
oC_List_t List ,
void * SavedListAddress , uint32_t MaximumNumberOfObjects )
830 bool repaired =
false;
833 if(List_IsCorrect(List) ==
false)
835 if(isram(SavedListAddress) && List != SavedListAddress)
837 List = SavedListAddress;
839 if(List_IsCorrect(List) ==
false && isram(List) && SavedListAddress == List)
846 if(List_IsCorrect(List))
848 uint32_t countFromHead = 0;
849 uint32_t countFromTail = 0;
852 bool repairFromHead =
false;
853 bool repairFromTail =
false;
857 lastElementFromHead = element;
863 firstElementFromTail = element;
867 if(List->Count < MaximumNumberOfObjects)
869 if( countFromHead == List->Count && isram(lastElementFromHead))
871 repairFromHead =
true;
873 else if( countFromTail == List->Count && isram(lastElementFromHead))
875 repairFromTail =
true;
879 if(countFromHead < MaximumNumberOfObjects)
881 repairFromHead =
true;
883 if(countFromTail < MaximumNumberOfObjects)
885 repairFromTail =
true;
891 repairFromHead =
true;
892 repairFromTail =
true;
901 List->Last = lastElementFromHead;
905 element->Previous = previous;
917 List->First = firstElementFromTail;
921 element->Next = next;
933 List->Last = lastElementFromHead;
937 element->Previous = previous;
943 if(countFromHead == countFromTail && countFromHead < MaximumNumberOfObjects)
945 List->Count = countFromHead;
953 #undef _________________________________________INTERFACE_SECTION__________________________________________________________________________ 960 #define _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________ 970 #undef _________________________________________LOCAL_FUNCTIONS_SECTION____________________________________________________________________
identifier for allocations
The file with list library.
static oC_ObjectControl_t oC_CountObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId)
counts object control for object
static bool oC_CheckObjectControl(void *ObjectPointer, oC_ObjectId_t ObjectId, oC_ObjectControl_t ObjectControl)
checks if object control is correct
Definition of the null pointer.
static const oC_Allocator_t Allocator
#define NULL
pointer to a zero