| 580 } |
580 } |
| 581 |
581 |
| 582 /** |
582 /** |
| 583 * Removes and returns the element at the specified index. |
583 * Removes and returns the element at the specified index. |
| 584 * |
584 * |
| 585 * No destructor is called and instead the element is copied to the |
585 * No destructor is called, and instead the element is copied to the |
| 586 * @p targetbuf which MUST be large enough to hold the removed element. |
586 * @p targetbuf which MUST be large enough to hold the removed element. |
| |
587 * If the list is storing pointers, only the pointer is copied to @p targetbuf. |
| 587 * |
588 * |
| 588 * @param list the list |
589 * @param list the list |
| 589 * @param index the index of the element |
590 * @param index the index of the element |
| 590 * @param targetbuf a buffer where to copy the element |
591 * @param targetbuf a buffer where to copy the element |
| 591 * @retval zero success |
592 * @retval zero success |
| 600 ) { |
601 ) { |
| 601 return list->cl->remove(list, index, 1, targetbuf) == 0; |
602 return list->cl->remove(list, index, 1, targetbuf) == 0; |
| 602 } |
603 } |
| 603 |
604 |
| 604 /** |
605 /** |
| |
606 * Removes and returns the first element of the list. |
| |
607 * |
| |
608 * No destructor is called, and instead the element is copied to the |
| |
609 * @p targetbuf which MUST be large enough to hold the removed element. |
| |
610 * If the list is storing pointers, only the pointer is copied to @p targetbuf. |
| |
611 * |
| |
612 * @param list the list |
| |
613 * @param targetbuf a buffer where to copy the element |
| |
614 * @retval zero success |
| |
615 * @retval non-zero list is empty |
| |
616 * @see cxListPopFront() |
| |
617 * @see cxListRemoveAndGetLast() |
| |
618 */ |
| |
619 cx_attr_nonnull |
| |
620 cx_attr_access_w(2) |
| |
621 static inline int cxListRemoveAndGetFirst( |
| |
622 CxList *list, |
| |
623 void *targetbuf |
| |
624 ) { |
| |
625 return list->cl->remove(list, 0, 1, targetbuf) == 0; |
| |
626 } |
| |
627 |
| |
628 /** |
| |
629 * Removes and returns the first element of the list. |
| |
630 * |
| |
631 * Alias for cxListRemoveAndGetFirst(). |
| |
632 * |
| |
633 * No destructor is called, and instead the element is copied to the |
| |
634 * @p targetbuf which MUST be large enough to hold the removed element. |
| |
635 * If the list is storing pointers, only the pointer is copied to @p targetbuf. |
| |
636 * |
| |
637 * @param list (@c CxList*) the list |
| |
638 * @param targetbuf (@c void*) a buffer where to copy the element |
| |
639 * @retval zero success |
| |
640 * @retval non-zero list is empty |
| |
641 * @see cxListRemoveAndGetFirst() |
| |
642 * @see cxListPop() |
| |
643 */ |
| |
644 #define cxListPopFront(list, targetbuf) cxListRemoveAndGetFirst((list), (targetbuf)) |
| |
645 |
| |
646 |
| |
647 /** |
| |
648 * Removes and returns the last element of the list. |
| |
649 * |
| |
650 * No destructor is called, and instead the element is copied to the |
| |
651 * @p targetbuf which MUST be large enough to hold the removed element. |
| |
652 * If the list is storing pointers, only the pointer is copied to @p targetbuf. |
| |
653 * |
| |
654 * @param list the list |
| |
655 * @param targetbuf a buffer where to copy the element |
| |
656 * @retval zero success |
| |
657 * @retval non-zero list is empty |
| |
658 */ |
| |
659 cx_attr_nonnull |
| |
660 cx_attr_access_w(2) |
| |
661 static inline int cxListRemoveAndGetLast( |
| |
662 CxList *list, |
| |
663 void *targetbuf |
| |
664 ) { |
| |
665 // note: index may wrap - member function will catch that |
| |
666 return list->cl->remove(list, list->collection.size - 1, 1, targetbuf) == 0; |
| |
667 } |
| |
668 |
| |
669 /** |
| |
670 * Removes and returns the last element of the list. |
| |
671 * |
| |
672 * Alias for cxListRemoveAndGetLast(). |
| |
673 * |
| |
674 * No destructor is called, and instead the element is copied to the |
| |
675 * @p targetbuf which MUST be large enough to hold the removed element. |
| |
676 * If the list is storing pointers, only the pointer is copied to @p targetbuf. |
| |
677 * |
| |
678 * @param list (@c CxList*) the list |
| |
679 * @param targetbuf (@c void*) a buffer where to copy the element |
| |
680 * @retval zero success |
| |
681 * @retval non-zero list is empty |
| |
682 * @see cxListRemoveAndGetLast() |
| |
683 * @see cxListPopFront() |
| |
684 */ |
| |
685 #define cxListPop(list, targetbuf) cxListRemoveAndGetLast((list), (targetbuf)) |
| |
686 |
| |
687 /** |
| 605 * Removes multiple element starting at the specified index. |
688 * Removes multiple element starting at the specified index. |
| 606 * |
689 * |
| 607 * If an element destructor function is specified, it is called for each |
690 * If an element destructor function is specified, it is called for each |
| 608 * element. It is guaranteed that the destructor is called before removing |
691 * element. It is guaranteed that the destructor is called before removing |
| 609 * the element, however, due to possible optimizations it is neither guaranteed |
692 * the element. However, due to possible optimizations, it is neither guaranteed |
| 610 * that the destructors are invoked for all elements before starting to remove |
693 * that the destructors are invoked for all elements before starting to remove |
| 611 * them, nor that the element is removed immediately after the destructor call |
694 * them, nor that the element is removed immediately after the destructor call |
| 612 * before proceeding to the next element. |
695 * before proceeding to the next element. |
| 613 * |
696 * |
| 614 * @param list the list |
697 * @param list the list |
| 624 ) { |
707 ) { |
| 625 return list->cl->remove(list, index, num, NULL); |
708 return list->cl->remove(list, index, num, NULL); |
| 626 } |
709 } |
| 627 |
710 |
| 628 /** |
711 /** |
| 629 * Removes and returns multiple element starting at the specified index. |
712 * Removes and returns multiple elements starting at the specified index. |
| 630 * |
713 * |
| 631 * No destructor is called and instead the elements are copied to the |
714 * No destructor is called, and instead the elements are copied to the |
| 632 * @p targetbuf which MUST be large enough to hold all removed elements. |
715 * @p targetbuf which MUST be large enough to hold all removed elements. |
| |
716 * If the list is storing pointers, @p targetbuf is expected to be an array of pointers. |
| 633 * |
717 * |
| 634 * @param list the list |
718 * @param list the list |
| 635 * @param index the index of the element |
719 * @param index the index of the element |
| 636 * @param num the number of elements to remove |
720 * @param num the number of elements to remove |
| 637 * @param targetbuf a buffer where to copy the elements |
721 * @param targetbuf a buffer where to copy the elements |
| 663 } |
747 } |
| 664 |
748 |
| 665 /** |
749 /** |
| 666 * Swaps two items in the list. |
750 * Swaps two items in the list. |
| 667 * |
751 * |
| 668 * Implementations should only allocate temporary memory for the swap, if |
752 * Implementations should only allocate temporary memory for the swap if |
| 669 * it is necessary. |
753 * it is necessary. |
| 670 * |
754 * |
| 671 * @param list the list |
755 * @param list the list |
| 672 * @param i the index of the first element |
756 * @param i the index of the first element |
| 673 * @param j the index of the second element |
757 * @param j the index of the second element |
| 674 * @retval zero success |
758 * @retval zero success |
| 675 * @retval non-zero one of the indices is out of bounds |
759 * @retval non-zero one of the indices is out of bounds, |
| 676 * or the swap needed extra memory but allocation failed |
760 * or the swap needed extra memory, but allocation failed |
| 677 */ |
761 */ |
| 678 cx_attr_nonnull |
762 cx_attr_nonnull |
| 679 static inline int cxListSwap( |
763 static inline int cxListSwap( |
| 680 CxList *list, |
764 CxList *list, |
| 681 size_t i, |
765 size_t i, |
| 698 size_t index |
784 size_t index |
| 699 ) { |
785 ) { |
| 700 return list->cl->at(list, index); |
786 return list->cl->at(list, index); |
| 701 } |
787 } |
| 702 |
788 |
| |
789 /** |
| |
790 * Returns a pointer to the first element. |
| |
791 * |
| |
792 * If the list is storing pointers, returns the first pointer stored in the list. |
| |
793 * |
| |
794 * @param list the list |
| |
795 * @return a pointer to the first element or @c NULL if the list is empty |
| |
796 */ |
| |
797 cx_attr_nonnull |
| |
798 static inline void *cxListFirst(const CxList *list) { |
| |
799 return list->cl->at(list, 0); |
| |
800 } |
| |
801 |
| |
802 /** |
| |
803 * Returns a pointer to the last element. |
| |
804 * |
| |
805 * If the list is storing pointers, returns the last pointer stored in the list. |
| |
806 * |
| |
807 * @param list the list |
| |
808 * @return a pointer to the last element or @c NULL if the list is empty |
| |
809 */ |
| |
810 cx_attr_nonnull |
| |
811 static inline void *cxListLast(const CxList *list) { |
| |
812 return list->cl->at(list, list->collection.size - 1); |
| |
813 } |
| 703 |
814 |
| 704 /** |
815 /** |
| 705 * Sets the element at the specified index in the list |
816 * Sets the element at the specified index in the list |
| 706 * |
817 * |
| 707 * @param list the list to set the element in |
818 * @param list the list to set the element in |