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

Reply via email to