Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=d8d32b53d27ba30c23744fdba272cf415311c3f2
commit d8d32b53d27ba30c23744fdba272cf415311c3f2 Author: Michel Hermier <[email protected]> Date: Sun Aug 24 08:20:35 2014 +0200 libpacman: More list changes, now FCList is compatible with for range C++11 feature. diff --git a/lib/libpacman/kernel/fstr.cpp b/lib/libpacman/kernel/fstr.cpp index d08a64c..8ef55f7 100644 --- a/lib/libpacman/kernel/fstr.cpp +++ b/lib/libpacman/kernel/fstr.cpp @@ -80,12 +80,21 @@ bool FStrMatcher::match(const char *str) const int f_stringlist_any_match(const FStringList *list, const FStrMatcher *matcher) { +#ifndef F_NOCOMPAT for(auto it = list->begin(), end = list->end(); it != end; it = it->next()) { if(matcher->match(f_stringlistitem_to_str(it)) != 0) { return 1; } } return 0; +#else + for(auto str: *list) { + if(matcher->match((const char *)str) != 0) { + return 1; + } + } + return 0; +#endif } /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/util/fptrlist.cpp b/lib/libpacman/util/fptrlist.cpp index de565d7..45b2fc4 100644 --- a/lib/libpacman/util/fptrlist.cpp +++ b/lib/libpacman/util/fptrlist.cpp @@ -33,8 +33,7 @@ FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn) { FPtrListItem *add, *end = f_ptrlist_end(list), *previous = NULL, *iter = f_ptrlist_first(list); - add = f_ptrlist_new(); - add->m_data = data; + add = f_ptrlistitem_new(data); /* Find insertion point. */ while(iter != end) { @@ -130,12 +129,7 @@ FPtrList *f_list_new() #ifndef F_NOCOMPAT return NULL; #else - FPtrList *self; - - ASSERT((self = f_zalloc(sizeof(*self))) != NULL, return NULL); - - f_ptrlist_init(self); - return self; + return new FPtrList(); #endif } @@ -290,15 +284,23 @@ bool f_ptrlist_contains_ptr(const FPtrList *list, const void *ptr) int f_ptrlist_count(const FPtrList *self) { +#ifndef F_NOCOMPAT int i = 0; for(auto it = self->cbegin(), end = self->cend(); it != end; it = it->next(), i++); return i; +#else + return self->size(); +#endif } bool f_ptrlist_empty(const FPtrList *self) { +#ifndef F_NOCOMPAT return self == NULL; +#else + return self->empty(); +#endif } FPtrListItem *f_ptrlist_end(FPtrList *self) diff --git a/lib/libpacman/util/fptrlist.h b/lib/libpacman/util/fptrlist.h index 501e8ae..673177a 100644 --- a/lib/libpacman/util/fptrlist.h +++ b/lib/libpacman/util/fptrlist.h @@ -49,66 +49,89 @@ typedef class FCList FPtrList; #endif typedef class FCListItem FPtrListItem; -#include <memory> // for std::allocator, std::allocator_traits - namespace flib { - template <typename Iter, typename Alloc = std::allocator<Iter>> + template <typename Iterable> struct iterable_traits - : std::allocator_traits<Alloc> { - typedef std::allocator_traits<Alloc> super_type; - typedef iterable_traits<Iter, Alloc> self_type; - typedef Iter iterable; - typedef typename super_type::pointer pointer; - typedef typename super_type::const_pointer const_pointer; + typedef Iterable iterable; +// typedef typename iterable::difference_type difference_type; + typedef typename iterable::pointer pointer; typedef typename iterable::reference reference; - typedef typename iterable::const_reference const_reference; + typedef typename iterable::value_type value_type; + + static iterable next(const iterable &i) + { + return i.next(); + } + + static iterable previous(const iterable &i) + { + return i.previous(); + } - static pointer next(pointer p) + static reference reference_of(iterable i) { - return p->next(); + return *i; } - static const_pointer next(const_pointer p) + static pointer pointer_of(iterable i) { - return p->next(); + return i.operator -> (); } - static pointer previous(pointer p) + static value_type value_of(const iterable i) + { + return *i; + } + }; + + template <typename Iterable> + struct iterable_traits<Iterable *> + { + typedef Iterable *iterable; +// typedef typename Iterable::difference_type difference_type; + typedef typename Iterable::pointer pointer; + typedef typename Iterable::reference reference; + typedef typename Iterable::value_type value_type; + + static iterable next(const iterable &i) + { + return i->next(); + } + + static iterable previous(const iterable &i) { - return p->previous(); + return i->previous(); } - static const_pointer previous(const_pointer p) + static reference reference_of(iterable i) { - return p->previous(); + return i->operator * (); } - static reference dereference(pointer p) + static pointer pointer_of(iterable i) { - return *p; + return i->operator -> (); } - static const_reference dereference(const_pointer p) + static value_type value_of(const iterable i) { - return *p; + return i->operator * (); } }; - template <typename T> + template <typename Iterable> struct const_iterator { public: - typedef const_iterator<T> self_type; - typedef self_type &self_reference_type; - typedef const self_reference_type const_self_reference_type; - typedef flib::iterable_traits<T> iterable_traits; - typedef typename iterable_traits::const_pointer const_pointer; - typedef typename iterable_traits::const_reference const_reference; - - explicit const_iterator(const_pointer iterable) - : m_iterable(iterable) +// typedef typename iterable_traits<Iterable>::difference_type difference_type; + typedef typename iterable_traits<Iterable>::iterable iterable; + typedef typename iterable_traits<Iterable>::pointer pointer; + typedef typename iterable_traits<Iterable>::value_type value_type; + + explicit const_iterator(iterable i) + : m_iterable(i) { } const_iterator(const const_iterator &o) @@ -118,142 +141,156 @@ namespace flib ~const_iterator() { } - self_reference_type operator = (const_self_reference_type o) + const_iterator &operator = (const const_iterator &o) { m_iterable = o.m_iterable; return *this; } - bool operator == (const_self_reference_type o) const + bool operator == (const const_iterator &o) const { return m_iterable == o.m_iterable; } - bool operator != (const_self_reference_type o) const + bool operator != (const const_iterator &o) const { return !operator == (o); } - self_reference_type operator ++ () + const_iterator &operator ++ () { - m_iterable = iterable_traits::next(m_iterable); + m_iterable = iterable_traits<Iterable>::next(m_iterable); return *this; } - self_type operator ++ (int) + const_iterator operator ++ (int) { - self_type tmp(*this); + const_iterator tmp(*this); operator ++ (); return tmp; } - self_reference_type operator -- () + const_iterator &operator -- () { - m_iterable = iterable_traits::previous(m_iterable); + m_iterable = iterable_traits<Iterable>::previous(m_iterable); return *this; } - self_type operator -- (int) + const_iterator operator -- (int) { - self_type tmp(*this); + const_iterator tmp(*this); operator -- (); return tmp; } - const_reference operator * () const + value_type operator * () const + { + return iterable_traits<Iterable>::value_of(m_iterable); + } + + const pointer operator -> () const { - return iterable_traits::dereference(m_iterable); + return iterable_traits<Iterable>::pointer_of(m_iterable); } protected: - const_pointer m_iterable; + iterable m_iterable; }; - template <typename T> + template <typename Iterable> struct iterator { public: - typedef const_iterator<T> self_type; - typedef self_type &self_reference_type; - typedef const self_reference_type const_self_reference_type; - typedef flib::iterable_traits<T> iterable_traits; - typedef typename iterable_traits::pointer pointer; - typedef typename iterable_traits::reference reference; - typedef typename iterable_traits::const_reference const_reference; - - explicit iterator(pointer iterable) - : m_iterable(iterable) +// typedef typename iterable_traits<Iterable>::difference_type difference_type; + typedef typename iterable_traits<Iterable>::iterable iterable; + typedef typename iterable_traits<Iterable>::pointer pointer; + typedef typename iterable_traits<Iterable>::reference reference; + typedef typename iterable_traits<Iterable>::value_type value_type; + + explicit iterator(iterable i) + : m_iterable(i) { } - iterator(const_self_reference_type o) + iterator(const iterator &o) : m_iterable(o.m_iterable) { } ~iterator() { } - const_self_reference_type operator = (const_self_reference_type o) + iterator &operator = (const iterator &o) { m_iterable = o.m_iterable; return *this; } - bool operator == (const_self_reference_type o) const + bool operator == (const iterator &o) const { return m_iterable == o.m_iterable; } - bool operator != (const_self_reference_type o) const + bool operator != (const iterator &o) const { return !operator == (o); } - self_reference_type operator ++ () + iterator &operator ++ () { - m_iterable = iterable_traits::next(m_iterable); + m_iterable = iterable_traits<Iterable>::next(m_iterable); return *this; } - self_type operator ++ (int) + iterator operator ++ (int) { - self_type tmp(*this); + iterator tmp(*this); operator ++ (); return tmp; } - self_reference_type operator -- () - { - m_iterable = iterable_traits::previous(m_iterable); + iterator &operator -- () + { + m_iterable = iterable_traits<Iterable>::previous(m_iterable); return *this; } - self_type operator -- (int) + iterator operator -- (int) { - self_type tmp(*this); + iterator tmp(*this); operator -- (); return tmp; } reference operator * () { - return iterable_traits::dereference(m_iterable); + return iterable_traits<Iterable>::reference_of(m_iterable); + } + + value_type operator * () const + { + return iterable_traits<Iterable>::value_of(m_iterable); } - const_reference operator * () const + pointer operator -> () { - return iterable_traits::dereference(m_iterable); + return iterable_traits<Iterable>::pointer_of(m_iterable); + } + + const pointer operator -> () const + { + return iterable_traits<Iterable>::pointer_of(m_iterable); } protected: - pointer m_iterable; + iterable m_iterable; }; } class FCListItem { public: - typedef void * &reference; - typedef const reference const_reference; + typedef void *value_type; + typedef value_type *pointer; + typedef value_type &reference; FCListItem() : FCListItem(NULL, NULL) @@ -269,22 +306,12 @@ public: virtual void *c_data() const { return m_data; } // FIXME: Make pure virtual - FCListItem *next() - { - return m_next; - } - FCListItem *next() const { return m_next; } - FCListItem *previous() - { - return m_previous; - } - - const FCListItem *previous() const + FCListItem *previous() const { return m_previous; } @@ -299,6 +326,7 @@ public: return m_data; } +#ifndef F_NOCOMPAT // Migration code typedef FCListItem *iterator; typedef const iterator const_iterator; @@ -310,12 +338,12 @@ public: const_iterator begin() const { - return this; + return cbegin(); } const_iterator cbegin() const { - return this; + return const_cast<const_iterator>(this); } iterator end() @@ -370,6 +398,7 @@ public: { return NULL; } +#endif //protected: // Disable for now bool insert_after(FCListItem *previous); @@ -384,8 +413,10 @@ class FCList { public: /* std::list compatibility */ - typedef flib::iterator<FCListItem> iterator; - typedef flib::const_iterator<FCListItem> const_iterator; + typedef FCListItem *iterable; + typedef flib::const_iterator<FCListItem *> const_iterator; + typedef flib::iterator<FCListItem *> iterator; + typedef size_t size_type; FCList() : FCListItem(this, this) @@ -399,7 +430,17 @@ public: void clear() { } - size_t count() const; + size_type size() const + { + size_type size = 0; + for(auto dummy: *this) ++size; + return size; + } + + bool empty() const + { + return next() == this; + } iterator begin() { @@ -408,7 +449,7 @@ public: const_iterator begin() const { - return first(); + return cbegin(); } const_iterator cbegin() const @@ -418,17 +459,17 @@ public: iterator end() { - return last(); + return iterator(this); } const_iterator end() const { - return last(); + return cend(); } const_iterator cend() const { - return last(); + return const_iterator(const_cast<FCList *>(this)); } public: diff --git a/lib/libpacman/util/stringlist.h b/lib/libpacman/util/stringlist.h index 9289f1e..6db0a06 100644 --- a/lib/libpacman/util/stringlist.h +++ b/lib/libpacman/util/stringlist.h @@ -28,9 +28,9 @@ extern "C" { #endif -#ifndef F_NOCOMPAT +#if 1 typedef FPtrList FStringList; -typedef FPtrList FStringListItem; +typedef FPtrListItem FStringListItem; #else typedef struct FStringList FStringList; typedef struct FStringListItem FStringListItem; _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
