Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=e65bf4d63287a516f45a1f37c52defee0573f175
commit e65bf4d63287a516f45a1f37c52defee0573f175 Author: Michel Hermier <[email protected]> Date: Sun Sep 7 10:34:00 2014 +0200 libpacman: Move FCList(Item) definition to flist.h diff --git a/lib/libpacman/util/flist.h b/lib/libpacman/util/flist.h index 0494860..8771856 100644 --- a/lib/libpacman/util/flist.h +++ b/lib/libpacman/util/flist.h @@ -27,7 +27,513 @@ #include "util/fcallback.h" #include "util/fptrlist.h" +#ifndef __cplusplus +typedef struct FCList FCList; +typedef struct FCListItem FCListItem; +#ifndef F_NOCOMPAT +typedef struct FPtrList FPtrList; +#else /* F_NOCOMPAT */ +typedef struct FCList FPtrList; +#endif /* F_NOCOMPAT */ +typedef struct FCListItem FPtrListIterator; +#else /* __cplusplus */ +#ifndef F_NOCOMPAT +typedef class FPtrList FPtrList; +#else /* F_NOCOMPAT */ +typedef class FCList FPtrList; +#endif /* F_NOCOMPAT */ +typedef class FCListItem FPtrListIterator; +#endif /* __cplusplus */ + +#ifdef __cplusplus +#include <algorithm> + +extern "C" { +#endif /* __cplusplus */ + +#define _FREELIST(p, f) do { if(p) { FVisitor visitor = { (FVisitorFunc)f, NULL }; f_ptrlist_delete(p, &visitor); p = NULL; } } while(0) + +#define FREELIST(p) _FREELIST(p, free) +#define FREELISTPTR(p) _FREELIST(p, NULL) + +/* Sort comparison callback function declaration */ +typedef int (*_pacman_fn_cmp)(const void *, const void *); + +FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn); +bool _pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp fn, void **data); +FPtrList *_pacman_list_reverse(FPtrList *list); + +typedef void (*FPtrListIteratorVisitorFunc)(FPtrListIterator *item, void *visitor_data); + +void *f_ptrlistitem_data(const FPtrListIterator *self); +int f_ptrlistitem_insert_after(FPtrListIterator *self, FPtrListIterator *previous); +FPtrListIterator *f_ptrlistitem_next(FPtrListIterator *self); +size_t f_ptrlistiterator_count(const FPtrListIterator *self, const FPtrListIterator *to); + +FPtrList *f_ptrlist_new(void); +int f_ptrlist_delete(FPtrList *list, FVisitor *visitor); + +FPtrList *f_ptrlist_add(FPtrList *list, void *data); +int f_ptrlist_clear(FPtrList *list, FVisitor *visitor); +size_t f_ptrlist_count(const FPtrList *self); +FPtrListIterator *f_ptrlist_end(FPtrList *self); +const FPtrListIterator *f_ptrlist_end_const(const FPtrList *self); +FPtrListIterator *f_ptrlist_first(FPtrList *self); +const FPtrListIterator *f_ptrlist_first_const(const FPtrList *self); +FPtrListIterator *f_ptrlist_last(FPtrList *self); +const FPtrListIterator *f_ptrlist_last_const(const FPtrList *self); +FPtrListIterator *f_ptrlist_rend(FPtrList *self); +const FPtrListIterator *f_ptrlist_rend_const(const FPtrList *self); + #ifdef __cplusplus +} +#endif /* __cplusplus */ + +#ifdef __cplusplus +namespace flib +{ + template <typename Iterable> + struct iterable_traits + { + typedef Iterable iterable; +// typedef typename iterable::difference_type difference_type; + typedef typename iterable::pointer pointer; + typedef typename iterable::reference reference; + typedef typename iterable::size_type size_type; + 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 reference reference_of(iterable i) + { + return *i; + } + + static pointer pointer_of(iterable i) + { + return i.operator -> (); + } + + 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::size_type size_type; + 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 reference reference_of(iterable i) + { + return i->operator * (); + } + + static pointer pointer_of(iterable i) + { + return i->operator -> (); + } + + static value_type value_of(const iterable i) + { + return i->operator * (); + } + }; + + template <typename Iterable, bool Reverse = false> + struct const_iterator + { + public: +// 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) + : m_iterable(o.m_iterable) + { } + + ~const_iterator() + { } + + const_iterator &operator = (const const_iterator &o) + { + m_iterable = o.m_iterable; + return *this; + } + + bool operator == (const const_iterator &o) const + { + return m_iterable == o.m_iterable; + } + + bool operator != (const const_iterator &o) const + { + return !operator == (o); + } + + const_iterator &operator ++ () + { + m_iterable = !Reverse ? iterable_traits<Iterable>::next(m_iterable) : iterable_traits<Iterable>::previous(m_iterable); + return *this; + } + + const_iterator operator ++ (int) + { + const_iterator tmp(*this); + operator ++ (); + return tmp; + } + + const_iterator &operator -- () + { + m_iterable = !Reverse ? iterable_traits<Iterable>::previous(m_iterable) : iterable_traits<Iterable>::next(m_iterable); + return *this; + } + + const_iterator operator -- (int) + { + const_iterator tmp(*this); + operator -- (); + return tmp; + } + + value_type operator * () const + { + return iterable_traits<Iterable>::value_of(m_iterable); + } + + const pointer operator -> () const + { + return iterable_traits<Iterable>::pointer_of(m_iterable); + } + + protected: + iterable m_iterable; + }; + + template <typename Iterable, bool Reverse = false> + struct iterator + { + public: +// 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 iterator &o) + : m_iterable(o.m_iterable) + { } + + ~iterator() + { } + + iterator &operator = (const iterator &o) + { + m_iterable = o.m_iterable; + return *this; + } + + bool operator == (const iterator &o) const + { + return m_iterable == o.m_iterable; + } + + bool operator != (const iterator &o) const + { + return !operator == (o); + } + + iterator &operator ++ () + { + m_iterable = iterable_traits<Iterable>::next(m_iterable); + return *this; + } + + iterator operator ++ (int) + { + iterator tmp(*this); + operator ++ (); + return tmp; + } + + iterator &operator -- () + { + m_iterable = iterable_traits<Iterable>::previous(m_iterable); + return *this; + } + + iterator operator -- (int) + { + iterator tmp(*this); + operator -- (); + return tmp; + } + + reference operator * () + { + return iterable_traits<Iterable>::reference_of(m_iterable); + } + + value_type operator * () const + { + return iterable_traits<Iterable>::value_of(m_iterable); + } + + pointer operator -> () + { + return iterable_traits<Iterable>::pointer_of(m_iterable); + } + + const pointer operator -> () const + { + return iterable_traits<Iterable>::pointer_of(m_iterable); + } + + protected: + iterable m_iterable; + }; +} + +class FCListItem +{ +public: + friend FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn); + friend bool _pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp fn, void **data); + friend FPtrList *f_ptrlist_add(FPtrList *list, void *data); + friend int f_ptrlistitem_insert_after(FPtrListIterator *self, FPtrListIterator *previous); + friend class FPtrList; + + typedef void *value_type; + typedef value_type *pointer; + typedef size_t size_type; + typedef value_type &reference; + + FCListItem() + : FCListItem(NULL, NULL) + { } + + FCListItem(FCListItem *previous, FCListItem *next) + : m_next(next), m_previous(previous), m_data(NULL) + { } + + virtual ~FCListItem() + { } // FIXME: Make pure virtual + + virtual void *c_data() const + { return m_data; } // FIXME: Make pure virtual + + FCListItem *next() const + { + ASSERT(this != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); + return m_next; + } + + FCListItem *previous() const + { + ASSERT(this != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); + return m_previous; + } + + reference operator * () + { + return m_data; + } + + const value_type operator * () const + { + return m_data; + } + + pointer operator -> () + { + return &m_data; + } + + const pointer operator -> () const + { + return &m_data; + } + +//protected: // Disable for now + bool insert_after(FCListItem *previous); + + void *m_data; // Enabled for now + +protected: + FCListItem *m_next; + FCListItem *m_previous; +}; + +class FCList + : private FCListItem +{ +public: + /* std::list compatibility */ + typedef FCListItem *iterable; + 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() + : FCListItem(this, this) + { } + + virtual ~FCList() override + { + clear(); + } + + /* Iterators */ + iterator begin() + { + return first(); + } + + const_iterator begin() const + { + return cbegin(); + } + + const_iterator cbegin() const + { + 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); + } + + const_iterator end() const + { + return cend(); + } + + const_iterator cend() const + { + 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 + { + return next() == this; + } + + size_type size() const + { + size_type size = 0; + for(auto unused: *this) { + (void) unused; + ++size; + } + return size; + } + + /* Element access */ + + /* Modifiers */ + void clear() + { } + +public: + /* Extensions */ + /* Element access */ + iterator first() + { + return iterator(FCListItem::next()); + } + + const_iterator first() const + { + return const_iterator(FCListItem::next()); + } + + iterator last() + { + return iterator(FCListItem::previous()); + } + + const_iterator last() const + { + return const_iterator(FCListItem::previous()); + } + + /* Modifiers */ + virtual bool add(const reference val); // Make default implementation to happend + +protected: + FCList(const FCList &o); + + FCList &operator = (const FCList &o); +}; + template <typename T> class FListItem : public FCListItem diff --git a/lib/libpacman/util/fptrlist.cpp b/lib/libpacman/util/fptrlist.cpp index 0175981..2ef683f 100644 --- a/lib/libpacman/util/fptrlist.cpp +++ b/lib/libpacman/util/fptrlist.cpp @@ -22,8 +22,7 @@ #include "config.h" -#include "util/fptrlist.h" - +#include "fptrlist.h" #include "fstdlib.h" /* Add items to a list in sorted order. Use the given comparison function to diff --git a/lib/libpacman/util/fptrlist.h b/lib/libpacman/util/fptrlist.h index ac87e20..eb98006 100644 --- a/lib/libpacman/util/fptrlist.h +++ b/lib/libpacman/util/fptrlist.h @@ -27,379 +27,9 @@ #include "stdbool.h" #include "util/fcallback.h" - -#ifndef __cplusplus -typedef struct FCList FCList; -typedef struct FCListItem FCListItem; -#ifndef F_NOCOMPAT -typedef struct FPtrList FPtrList; -#else /* F_NOCOMPAT */ -typedef struct FCList FPtrList; -#endif /* F_NOCOMPAT */ -typedef struct FCListItem FPtrListIterator; -#else /* __cplusplus */ -#ifndef F_NOCOMPAT -typedef class FPtrList FPtrList; -#else /* F_NOCOMPAT */ -typedef class FCList FPtrList; -#endif /* F_NOCOMPAT */ -typedef class FCListItem FPtrListIterator; -#endif /* __cplusplus */ +#include "util/flist.h" #ifdef __cplusplus -#include <algorithm> - -extern "C" { -#endif /* __cplusplus */ - -#define _FREELIST(p, f) do { if(p) { FVisitor visitor = { (FVisitorFunc)f, NULL }; f_ptrlist_delete(p, &visitor); p = NULL; } } while(0) - -#define FREELIST(p) _FREELIST(p, free) -#define FREELISTPTR(p) _FREELIST(p, NULL) - -/* Sort comparison callback function declaration */ -typedef int (*_pacman_fn_cmp)(const void *, const void *); - -FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn); -bool _pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp fn, void **data); -FPtrList *_pacman_list_reverse(FPtrList *list); - -typedef void (*FPtrListIteratorVisitorFunc)(FPtrListIterator *item, void *visitor_data); - -void *f_ptrlistitem_data(const FPtrListIterator *self); -int f_ptrlistitem_insert_after(FPtrListIterator *self, FPtrListIterator *previous); -FPtrListIterator *f_ptrlistitem_next(FPtrListIterator *self); -size_t f_ptrlistiterator_count(const FPtrListIterator *self, const FPtrListIterator *to); - -FPtrList *f_ptrlist_new(void); -int f_ptrlist_delete(FPtrList *list, FVisitor *visitor); - -FPtrList *f_ptrlist_add(FPtrList *list, void *data); -int f_ptrlist_clear(FPtrList *list, FVisitor *visitor); -size_t f_ptrlist_count(const FPtrList *self); -FPtrListIterator *f_ptrlist_end(FPtrList *self); -const FPtrListIterator *f_ptrlist_end_const(const FPtrList *self); -FPtrListIterator *f_ptrlist_first(FPtrList *self); -const FPtrListIterator *f_ptrlist_first_const(const FPtrList *self); -FPtrListIterator *f_ptrlist_last(FPtrList *self); -const FPtrListIterator *f_ptrlist_last_const(const FPtrList *self); -FPtrListIterator *f_ptrlist_rend(FPtrList *self); -const FPtrListIterator *f_ptrlist_rend_const(const FPtrList *self); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#ifdef __cplusplus -namespace flib -{ - template <typename Iterable> - struct iterable_traits - { - typedef Iterable iterable; -// typedef typename iterable::difference_type difference_type; - typedef typename iterable::pointer pointer; - typedef typename iterable::reference reference; - typedef typename iterable::size_type size_type; - 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 reference reference_of(iterable i) - { - return *i; - } - - static pointer pointer_of(iterable i) - { - return i.operator -> (); - } - - 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::size_type size_type; - 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 reference reference_of(iterable i) - { - return i->operator * (); - } - - static pointer pointer_of(iterable i) - { - return i->operator -> (); - } - - static value_type value_of(const iterable i) - { - return i->operator * (); - } - }; - - template <typename Iterable, bool Reverse = false> - struct const_iterator - { - public: -// 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) - : m_iterable(o.m_iterable) - { } - - ~const_iterator() - { } - - const_iterator &operator = (const const_iterator &o) - { - m_iterable = o.m_iterable; - return *this; - } - - bool operator == (const const_iterator &o) const - { - return m_iterable == o.m_iterable; - } - - bool operator != (const const_iterator &o) const - { - return !operator == (o); - } - - const_iterator &operator ++ () - { - m_iterable = !Reverse ? iterable_traits<Iterable>::next(m_iterable) : iterable_traits<Iterable>::previous(m_iterable); - return *this; - } - - const_iterator operator ++ (int) - { - const_iterator tmp(*this); - operator ++ (); - return tmp; - } - - const_iterator &operator -- () - { - m_iterable = !Reverse ? iterable_traits<Iterable>::previous(m_iterable) : iterable_traits<Iterable>::next(m_iterable); - return *this; - } - - const_iterator operator -- (int) - { - const_iterator tmp(*this); - operator -- (); - return tmp; - } - - value_type operator * () const - { - return iterable_traits<Iterable>::value_of(m_iterable); - } - - const pointer operator -> () const - { - return iterable_traits<Iterable>::pointer_of(m_iterable); - } - - protected: - iterable m_iterable; - }; - - template <typename Iterable, bool Reverse = false> - struct iterator - { - public: -// 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 iterator &o) - : m_iterable(o.m_iterable) - { } - - ~iterator() - { } - - iterator &operator = (const iterator &o) - { - m_iterable = o.m_iterable; - return *this; - } - - bool operator == (const iterator &o) const - { - return m_iterable == o.m_iterable; - } - - bool operator != (const iterator &o) const - { - return !operator == (o); - } - - iterator &operator ++ () - { - m_iterable = iterable_traits<Iterable>::next(m_iterable); - return *this; - } - - iterator operator ++ (int) - { - iterator tmp(*this); - operator ++ (); - return tmp; - } - - iterator &operator -- () - { - m_iterable = iterable_traits<Iterable>::previous(m_iterable); - return *this; - } - - iterator operator -- (int) - { - iterator tmp(*this); - operator -- (); - return tmp; - } - - reference operator * () - { - return iterable_traits<Iterable>::reference_of(m_iterable); - } - - value_type operator * () const - { - return iterable_traits<Iterable>::value_of(m_iterable); - } - - pointer operator -> () - { - return iterable_traits<Iterable>::pointer_of(m_iterable); - } - - const pointer operator -> () const - { - return iterable_traits<Iterable>::pointer_of(m_iterable); - } - - protected: - iterable m_iterable; - }; -} - -class FCListItem -{ -public: - friend FPtrList *f_ptrlist_add_sorted(FPtrList *list, void *data, _pacman_fn_cmp fn); - friend bool _pacman_list_remove(FPtrList *haystack, void *needle, _pacman_fn_cmp fn, void **data); - friend FPtrList *f_ptrlist_add(FPtrList *list, void *data); - friend int f_ptrlistitem_insert_after(FPtrListIterator *self, FPtrListIterator *previous); - friend class FPtrList; - - typedef void *value_type; - typedef value_type *pointer; - typedef size_t size_type; - typedef value_type &reference; - - FCListItem() - : FCListItem(NULL, NULL) - { } - - FCListItem(FCListItem *previous, FCListItem *next) - : m_next(next), m_previous(previous), m_data(NULL) - { } - - virtual ~FCListItem() - { } // FIXME: Make pure virtual - - virtual void *c_data() const - { return m_data; } // FIXME: Make pure virtual - - FCListItem *next() const - { - ASSERT(this != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); - return m_next; - } - - FCListItem *previous() const - { - ASSERT(this != NULL, RET_ERR(PM_ERR_WRONG_ARGS, NULL)); - return m_previous; - } - - reference operator * () - { - return m_data; - } - - const value_type operator * () const - { - return m_data; - } - - pointer operator -> () - { - return &m_data; - } - - const pointer operator -> () const - { - return &m_data; - } - -//protected: // Disable for now - bool insert_after(FCListItem *previous); - - void *m_data; // Enabled for now - -protected: - FCListItem *m_next; - FCListItem *m_previous; -}; - -#ifndef F_NOCOMPAT class FPtrList : protected FCListItem { @@ -548,143 +178,6 @@ private: FPtrList &operator = (const FPtrList &o); }; #endif - -class FCList - : private FCListItem -{ -public: - /* std::list compatibility */ - typedef FCListItem *iterable; - 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() - : FCListItem(this, this) - { } - - virtual ~FCList() override - { - clear(); - } - - /* Iterators */ - iterator begin() - { - return first(); - } - - const_iterator begin() const - { - return cbegin(); - } - - const_iterator cbegin() const - { - 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); - } - - const_iterator end() const - { - return cend(); - } - - const_iterator cend() const - { - 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 - { - return next() == this; - } - - size_type size() const - { - size_type size = 0; - for(auto unused: *this) { - (void) unused; - ++size; - } - return size; - } - - /* Element access */ - - /* Modifiers */ - void clear() - { } - -public: - /* Extensions */ - /* Element access */ - iterator first() - { - return iterator(FCListItem::next()); - } - - const_iterator first() const - { - return const_iterator(FCListItem::next()); - } - - iterator last() - { - return iterator(FCListItem::previous()); - } - - const_iterator last() const - { - return const_iterator(FCListItem::previous()); - } - - /* Modifiers */ - virtual bool add(const reference val); // Make default implementation to happend - -protected: - FCList(const FCList &o); - - FCList &operator = (const FCList &o); -}; -#endif #endif /* F_PTRLIST_H */ /* vim: set ts=2 sw=2 noet: */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
