Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=d531378cf530b7cae9310def1f4677f21377621d
commit d531378cf530b7cae9310def1f4677f21377621d Author: Michel Hermier <[email protected]> Date: Mon Aug 25 09:36:34 2014 +0200 Libpacman: Remove f_ptrlist_init/fini, add reverse iterators for FPtrList. diff --git a/lib/libpacman/util/fptrlist.cpp b/lib/libpacman/util/fptrlist.cpp index c709b2d..44f839f 100644 --- a/lib/libpacman/util/fptrlist.cpp +++ b/lib/libpacman/util/fptrlist.cpp @@ -31,6 +31,7 @@ */ FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn) { +#ifndef F_NOCOMPAT FPtrListIterator *add, *end = f_ptrlist_end(list), *previous = NULL, *iter = f_ptrlist_first(list); add = f_ptrlistitem_new(data); @@ -57,6 +58,15 @@ FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn) } return(list); +#else + if (list == NULL) { + list = new FPtrList(); + list->add(data); + } else { + // FIXME: Search insertion point. + } + return list; +#endif } /* Remove an item in a list. Use the given comparison function to find the @@ -67,6 +77,7 @@ FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn) */ FPtrList *_pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp fn, void **data) { +#ifndef F_NOCOMPAT FPtrListIterator *end = f_ptrlist_end(haystack), *i = f_ptrlist_first(haystack); if(*data != end) { @@ -104,6 +115,10 @@ FPtrList *_pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp f } return(haystack); +#else + // FIXME: Implement me + return haystack; +#endif } /* Reverse the order of a list @@ -117,7 +132,7 @@ FPtrList *_pacman_list_reverse(FPtrList *list) */ FPtrList *newlist = f_ptrlist_new(); - for(auto it = list->last(), end = list->rend(); it != end; it = it->previous()) { + for(auto it = list->rbegin(), end = list->rend(); it != end; it = it->previous()) { newlist = f_ptrlist_add(newlist, f_ptrlistitem_data(it)); } @@ -135,12 +150,16 @@ FPtrList *f_list_new() FPtrListIterator *f_ptrlistitem_new(void *ptr) { +#ifndef F_NOCOMPAT FPtrListIterator *item = f_zalloc(sizeof(*item)); if(item != NULL) { item->m_data = ptr; } return item; +#else + return new FPtrListIterator(ptr); +#endif } int f_ptrlistitem_delete(FPtrListIterator *self, FVisitor *visitor) @@ -197,29 +216,25 @@ int f_ptrlistitem_ptrcmp(const FPtrListIterator *item, const void *ptr) { FPtrList *f_ptrlist_new(void) { +#ifndef F_NOCOMPAT FPtrList *self; ASSERT((self = f_zalloc(sizeof(*self))) != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); - f_ptrlist_init(self); return self; +#else + return new FPtrList(); +#endif } int f_ptrlist_delete(FPtrList *self, FVisitor *visitor) { - return f_ptrlist_fini(self, visitor); -} - -int f_ptrlist_init(FPtrList *self) -{ - ASSERT(self != NULL, RET_ERR(PM_ERR_WRONG_ARGS, -1)); - - return 0; -} - -int f_ptrlist_fini(FPtrList *self, FVisitor *visitor) -{ +#ifndef F_NOCOMPAT return f_ptrlist_clear(self, visitor); +#else + self->clear(visitor); + delete self; +#endif } // FIXME: Change return value to bool diff --git a/lib/libpacman/util/fptrlist.h b/lib/libpacman/util/fptrlist.h index fa67121..290bb75 100644 --- a/lib/libpacman/util/fptrlist.h +++ b/lib/libpacman/util/fptrlist.h @@ -121,7 +121,7 @@ namespace flib } }; - template <typename Iterable> + template <typename Iterable, bool Reverse = false> struct const_iterator { public: @@ -159,7 +159,7 @@ namespace flib const_iterator &operator ++ () { - m_iterable = iterable_traits<Iterable>::next(m_iterable); + m_iterable = !Reverse ? iterable_traits<Iterable>::next(m_iterable) : iterable_traits<Iterable>::previous(m_iterable); return *this; } @@ -172,7 +172,7 @@ namespace flib const_iterator &operator -- () { - m_iterable = iterable_traits<Iterable>::previous(m_iterable); + m_iterable = !Reverse ? iterable_traits<Iterable>::previous(m_iterable) : iterable_traits<Iterable>::next(m_iterable); return *this; } @@ -197,7 +197,7 @@ namespace flib iterable m_iterable; }; - template <typename Iterable> + template <typename Iterable, bool Reverse = false> struct iterator { public: @@ -394,6 +394,21 @@ public: return last(); } + iterator rbegin() + { + return last(); + } + + const_iterator rbegin() const + { + return last(); + } + + const_iterator crbegin() const + { + return last(); + } + iterator rend() { return NULL; @@ -424,8 +439,10 @@ class FCList public: /* std::list compatibility */ typedef FCListItem *iterable; - typedef flib::const_iterator<iterable> const_iterator; typedef flib::iterator<iterable> iterator; + typedef flib::iterator<iterable, true> reverse_iterator; + typedef flib::const_iterator<iterable> const_iterator; + typedef flib::const_iterator<iterable, true> const_reverse_iterator; typedef size_t size_type; FCList() @@ -453,6 +470,21 @@ public: return first(); } + reverse_iterator rbegin() + { + return reverse_iterator(FCListItem::previous()); + } + + const_reverse_iterator rbegin() const + { + return crbegin(); + } + + const_reverse_iterator crbegin() const + { + return const_reverse_iterator(FCListItem::previous()); + } + iterator end() { return iterator(this); @@ -468,6 +500,21 @@ public: return const_iterator(const_cast<FCList *>(this)); } + reverse_iterator rend() + { + return reverse_iterator(this); + } + + const_reverse_iterator rend() const + { + return crend(); + } + + const_reverse_iterator crend() const + { + return const_reverse_iterator(const_cast<FCList *>(this)); + } + /* Capacity */ bool empty() const { @@ -552,9 +599,6 @@ int f_ptrlistitem_ptrcmp(const FPtrListIterator *item, const void *ptr); FPtrList *f_ptrlist_new(void); int f_ptrlist_delete(FPtrList *list, FVisitor *visitor); -int f_ptrlist_init(FPtrList *self); -int f_ptrlist_fini(FPtrList *self, FVisitor *visitor); - #define f_ptrlist_add f_ptrlist_append FPtrList *f_ptrlist_append(FPtrList *list, void *data); int f_ptrlist_clear(FPtrList *list, FVisitor *visitor); _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
