Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=b01df91caa9cfe2e3dc214b36b5c195dcfd9c124
commit b01df91caa9cfe2e3dc214b36b5c195dcfd9c124 Author: Michel Hermier <herm...@frugalware.org> Date: Tue Nov 4 14:29:03 2014 +0100 libpacman: Add base class for iterator wrappers. diff --git a/lib/libpacman/trans.cpp b/lib/libpacman/trans.cpp index 98867be..6da550c 100644 --- a/lib/libpacman/trans.cpp +++ b/lib/libpacman/trans.cpp @@ -1023,7 +1023,7 @@ int _pacman_fpmpackage_install(package_ptr pkg, pmtranstype_t type, pmtrans_t *t } sprintf(fn, "%s\t%s", file, sha1_pkg); } - lp.m_iterable->swap_data((const char *&)fn); + lp.m_iterator->swap_data((const char *&)fn); free(fn); } } @@ -1159,7 +1159,7 @@ int _pacman_fpmpackage_install(package_ptr pkg, pmtranstype_t type, pmtrans_t *t sprintf(fn, "%s\t%s", file, sha1); FREE(sha1); } - lp.m_iterable->swap_data((const char *&)fn); + lp.m_iterator->swap_data((const char *&)fn); free(fn); } } @@ -1507,7 +1507,7 @@ int __pmtrans_t::commit(FPtrList **data) for(auto m = depends.begin(), end = depends.end(); m != end; ++m) { if(!strcmp(*m, old->name())) { const char *str = strdup(pkg_new->name()); - m.m_iterable->swap_data(str); + m.m_iterator->swap_data(str); free(str); } } diff --git a/lib/libpacman/util/flist.h b/lib/libpacman/util/flist.h index 05c6f02..035ac66 100644 --- a/lib/libpacman/util/flist.h +++ b/lib/libpacman/util/flist.h @@ -70,10 +70,71 @@ namespace flib } }; + template <typename Iterator, bool Reverse = false> + class iterator_wrapper_base + { + public: + typedef Iterator wrapped_iterator_type; + typedef iterator_traits<Iterator> wrapped_iterator_traits; + typedef typename wrapped_iterator_traits::pointer pointer; + typedef typename wrapped_iterator_traits::size_type size_type; + typedef typename wrapped_iterator_traits::value_type value_type; + + explicit iterator_wrapper_base(wrapped_iterator_type i = wrapped_iterator_type()) + : m_iterator(i) + { } + + iterator_wrapper_base(const iterator_wrapper_base &o) + : m_iterator(o.m_iterator) + { } + + iterator_wrapper_base &operator = (const iterator_wrapper_base &o) + { + m_iterator = o.m_iterator; + return *this; + } + + /* explicit */ operator wrapped_iterator_type () + { + return m_iterator; + } + + bool operator == (const iterator_wrapper_base &o) const + { + return m_iterator == o.m_iterator; + } + + bool operator != (const iterator_wrapper_base &o) const + { + return m_iterator != o.m_iterator; + } + + wrapped_iterator_type iterator() const + { + return m_iterator; + } + + wrapped_iterator_type iterator_next() const + { + return !Reverse ? wrapped_iterator_traits::next(m_iterator) : wrapped_iterator_traits::previous(m_iterator); + } + + wrapped_iterator_type iterator_previous() const + { + return !Reverse ? wrapped_iterator_traits::previous(m_iterator) : wrapped_iterator_traits::next(m_iterator); + } + + /* protected: */ + wrapped_iterator_type m_iterator; + }; + template <typename Iterable, bool Reverse = false> struct const_iterator_wrapper + : public iterator_wrapper_base<Iterable, Reverse> { public: + typedef iterator_wrapper_base<Iterable, Reverse> super_type; + // typedef typename iterator_traits<Iterable>::difference_type difference_type; typedef typename iterator_traits<Iterable>::iterable iterable; typedef typename iterator_traits<Iterable>::pointer pointer; @@ -81,40 +142,25 @@ namespace flib typedef typename iterator_traits<Iterable>::value_type value_type; explicit const_iterator_wrapper(iterable i = iterable()) - : m_iterable(i) + : super_type(i) { } const_iterator_wrapper(const const_iterator_wrapper &o) - : m_iterable(o.m_iterable) + : super_type(o) { } ~const_iterator_wrapper() { } - operator iterable () - { - return m_iterable; - } - const_iterator_wrapper &operator = (const const_iterator_wrapper &o) { - m_iterable = o.m_iterable; + super_type::operator = (o); return *this; } - bool operator == (const const_iterator_wrapper &o) const - { - return m_iterable == o.m_iterable; - } - - bool operator != (const const_iterator_wrapper &o) const - { - return !operator == (o); - } - const_iterator_wrapper &operator ++ () { - m_iterable = _next(); + super_type::m_iterator = super_type::iterator_next(); return *this; } @@ -127,7 +173,7 @@ namespace flib const_iterator_wrapper &operator -- () { - m_iterable = _previous(); + super_type::m_iterator = super_type::iterator_previous(); return *this; } @@ -140,22 +186,22 @@ namespace flib value_type operator * () const { - return iterator_traits<Iterable>::value_of(m_iterable); + return iterator_traits<Iterable>::value_of(super_type::m_iterator); } const pointer operator -> () const { - return iterator_traits<Iterable>::pointer_of(m_iterable); + return iterator_traits<Iterable>::pointer_of(super_type::m_iterator); } const_iterator_wrapper next() const { - return const_iterator_wrapper(_next()); + return const_iterator_wrapper(super_type::iterator_next()); } const_iterator_wrapper previous() const { - return const_iterator_wrapper(_previous()); + return const_iterator_wrapper(super_type::iterator_previous()); } /* FIXME: temporary */ @@ -164,25 +210,15 @@ namespace flib { return (T *)operator *(); } - - protected: - iterable _next() const - { - return !Reverse ? iterator_traits<Iterable>::next(m_iterable) : iterator_traits<Iterable>::previous(m_iterable); - } - - iterable _previous() const - { - return !Reverse ? iterator_traits<Iterable>::previous(m_iterable) : iterator_traits<Iterable>::next(m_iterable); - } - - iterable m_iterable; }; template <typename Iterable, bool Reverse = false> struct iterator_wrapper + : public iterator_wrapper_base<Iterable, Reverse> { public: + typedef iterator_wrapper_base<Iterable, Reverse> super_type; + // typedef typename iterator_traits<Iterable>::difference_type difference_type; typedef typename iterator_traits<Iterable>::iterable iterable; typedef typename iterator_traits<Iterable>::pointer pointer; @@ -191,40 +227,25 @@ namespace flib typedef typename iterator_traits<Iterable>::value_type value_type; explicit iterator_wrapper(iterable i = iterable()) - : m_iterable(i) + : super_type(i) { } iterator_wrapper(const iterator_wrapper &o) - : m_iterable(o.m_iterable) + : super_type(o) { } ~iterator_wrapper() { } - operator iterable () - { - return m_iterable; - } - iterator_wrapper &operator = (const iterator_wrapper &o) { - m_iterable = o.m_iterable; + super_type::operator = (o); return *this; } - bool operator == (const iterator_wrapper &o) const - { - return m_iterable == o.m_iterable; - } - - bool operator != (const iterator_wrapper &o) const - { - return !operator == (o); - } - iterator_wrapper &operator ++ () { - m_iterable = _next(); + super_type::m_iterator = super_type::iterator_next(); return *this; } @@ -237,7 +258,7 @@ namespace flib iterator_wrapper &operator -- () { - m_iterable = _previous(); + super_type::m_iterator = super_type::iterator_previous(); return *this; } @@ -250,32 +271,32 @@ namespace flib reference operator * () { - return iterator_traits<Iterable>::reference_of(m_iterable); + return iterator_traits<Iterable>::reference_of(super_type::m_iterator); } value_type operator * () const { - return iterator_traits<Iterable>::value_of(m_iterable); + return iterator_traits<Iterable>::value_of(super_type::m_iterator); } pointer operator -> () { - return iterator_traits<Iterable>::pointer_of(m_iterable); + return iterator_traits<Iterable>::pointer_of(super_type::m_iterator); } const pointer operator -> () const { - return iterator_traits<Iterable>::pointer_of(m_iterable); + return iterator_traits<Iterable>::pointer_of(super_type::m_iterator); } iterator_wrapper next() const { - return iterator_wrapper(_next()); + return iterator_wrapper(super_type::iterator_next()); } iterator_wrapper previous() const { - return iterator_wrapper(_previous()); + return iterator_wrapper(super_type::iterator_previous()); } /* FIXME: temporary */ @@ -284,20 +305,6 @@ namespace flib { return (T *)operator *(); } - - protected: - iterable _next() const - { - return !Reverse ? iterator_traits<Iterable>::next(m_iterable) : iterator_traits<Iterable>::previous(m_iterable); - } - - iterable _previous() const - { - return !Reverse ? iterator_traits<Iterable>::previous(m_iterable) : iterator_traits<Iterable>::next(m_iterable); - } - - public: /* FIXME: Make protected/private */ - iterable m_iterable; }; class FCListItem _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git