Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=004d9639e75bfce9ba5f8afb6a8a5b5bb6a57c4a
commit 004d9639e75bfce9ba5f8afb6a8a5b5bb6a57c4a Author: Michel Hermier <herm...@frugalware.org> Date: Thu Oct 16 10:37:38 2014 +0200 libpacman: Add a basic graphing class (still unused) to store relations with package names with the *providers* of the said names. diff --git a/lib/libpacman/handle.h b/lib/libpacman/handle.h index 3e12e61..ed504fd 100644 --- a/lib/libpacman/handle.h +++ b/lib/libpacman/handle.h @@ -28,6 +28,7 @@ #include "pacman.h" #include "io/ffilelock.h" +#include "package.h" #include "trans.h" #include "kernel/fobject.h" @@ -93,6 +94,8 @@ public: int *dlremain; int *dlhowmany; int sysupgrade; + + libpacman::package_graph m_package_graph; }; } diff --git a/lib/libpacman/package.cpp b/lib/libpacman/package.cpp index 77c812d..58661ec 100644 --- a/lib/libpacman/package.cpp +++ b/lib/libpacman/package.cpp @@ -404,4 +404,34 @@ bool PackageMatcher::match(const Package *package, int mask = ~0) const return _pacman_strmatcher_match(m_strmatcher, package, m_flags & mask); } +package_node::package_node(const char *name) + : m_name(strdup(name)) +{ } + +package_node::package_node(package_node &&o) + : m_name(o.m_name), m_packages(std::move(o.m_packages)) +{ + o.m_name = NULL; +} + +package_node::~package_node() +{ + free(m_name); +} + +bool package_node::operator < (const package_node &o) const +{ + return strcmp(m_name, o.m_name) < 0; +} + +const char *package_node::name() const +{ + return m_name; +} + +bool package_node_less::operator () (const package_node *p1, const package_node *p2) +{ + return strcmp(p1->name(), p2->name()) < 0; +} + /* vim: set ts=2 sw=2 noet: */ diff --git a/lib/libpacman/package.h b/lib/libpacman/package.h index 29e492f..01e2c8d 100644 --- a/lib/libpacman/package.h +++ b/lib/libpacman/package.h @@ -34,12 +34,14 @@ #include "kernel/fobject.h" #include "kernel/fstr.h" #include "util/fset.h" +#include "util/fstringlist.h" typedef struct __pmdepend_t pmdepend_t; namespace libpacman { class Database; + class package_node; } @@ -140,6 +142,7 @@ public: libpacman::Database *m_database; unsigned int flags; + package_node *m_node; char m_name[PKG_NAME_LEN]; char m_version[PKG_VERSION_LEN]; char m_description[PKG_DESC_LEN]; @@ -201,6 +204,32 @@ private: FStrMatcher m_strmatcher_internal; }; + class package_node + { + public: + package_node(const char *name); + package_node(package_node &&o); + ~package_node(); + bool operator < (const package_node &o) const; + + const char *name() const; + + private: + char *m_name/*[PKG_NAME_LEN]*/; + flib::set<libpacman::Package *> m_packages; + }; + + struct package_node_less + { + bool operator () (const package_node *p1, const package_node *p2); + }; + + class package_graph + : flib::set<libpacman::package_node *, package_node_less> + { + public: + using set::set; + }; } // namespace libpacman int _pacman_pkg_delete(libpacman::Package *self); diff --git a/lib/libpacman/packages_transaction.cpp b/lib/libpacman/packages_transaction.cpp index 1c9bcb8..b0f220f 100644 --- a/lib/libpacman/packages_transaction.cpp +++ b/lib/libpacman/packages_transaction.cpp @@ -25,6 +25,8 @@ #include "packages_transaction.h" +#include "handle.h" + #include "util.h" #include "fstring.h" diff --git a/lib/libpacman/trans.h b/lib/libpacman/trans.h index 0088f51..3a90fb0 100644 --- a/lib/libpacman/trans.h +++ b/lib/libpacman/trans.h @@ -26,8 +26,6 @@ typedef struct __pmtrans_t pmtrans_t; -#include "handle.h" - #include "kernel/fobject.h" #include "util/fstringlist.h" diff --git a/lib/libpacman/util/flist.h b/lib/libpacman/util/flist.h index edaab92..608fffb 100644 --- a/lib/libpacman/util/flist.h +++ b/lib/libpacman/util/flist.h @@ -41,29 +41,6 @@ namespace flib struct uncompared { }; - template <class T> - struct mapped_traits - { - typedef T mapped_type; - typedef T key_type; - typedef T value_type; - - static const key_type &key_of(const mapped_type &o) - { - return o; - } - - static value_type &value_of(mapped_type &o) - { - return o; - } - - static const value_type &value_of(const mapped_type &o) - { - return o; - } - }; - template <typename Iterable> struct iterable_traits { @@ -658,7 +635,7 @@ namespace flib { }; } -template <typename T, class Compare = flib::uncompared, class MappedTrais = flib::mapped_traits<T>> +template <typename T> class FList : protected FCListItem { @@ -673,9 +650,6 @@ public: typedef flib::const_iterator<iterable, true> const_reverse_iterator; typedef size_t size_type; - typedef Compare key_compare; - typedef Compare value_compare; - FList() : FCListItem(this, this) { } @@ -865,15 +839,6 @@ public: } /* Observers */ - key_compare key_comp() const - { - return m_compare; - } - - value_compare value_comp() const - { - return m_compare; - } /* Operations */ void reverse() { @@ -905,9 +870,12 @@ public: return const_iterator(c_last()); } - void add(const value_type &val) // Make default implementation to happend + virtual iterator add(const value_type &val) { - (new FListItem<T>(val))->insert_after(last()); + // Default implementation is append + iterable newItem = new FListItem<T>(val); + newItem->insert_after(last()); + return iterator(newItem); } bool remove(void *ptr, _pacman_fn_cmp fn, value_type *data) @@ -954,20 +922,6 @@ public: return static_cast<iterable>((FCListItem *)this); } -protected: - template <class Data = value_type> - iterator find_insertion_point(typename std::enable_if<std::is_same<flib::uncompared, Compare>::value, const Data &>::type data) - { - return last(); - } - - template <class Data = value_type> - iterator find_insertion_point(typename std::enable_if<!std::is_same<flib::uncompared, Compare>::value, const Data &>::type data) - { - /* Return the first iterator where value does not satisfy Compare */ - return FList<T>::find_if_not([&] (const T &o) -> bool { return m_compare(o, data); }); - } - private: FList(const FList &); FList &operator = (const FList &); @@ -978,8 +932,6 @@ private: RET_ERR(PM_ERR_WRONG_ARGS, NULL); } #endif - - Compare m_compare; }; #endif /* __cplusplus */ diff --git a/lib/libpacman/util/fset.h b/lib/libpacman/util/fset.h index 9452143..4aa98c8 100644 --- a/lib/libpacman/util/fset.h +++ b/lib/libpacman/util/fset.h @@ -39,14 +39,17 @@ namespace flib using FList<T>::FList; - iterator add(const value_type &data) + typedef Compare key_compare; + typedef Compare value_compare; + + virtual iterator add(const value_type &data) override { iterator end = this->end(); /* Find insertion point. */ iterator next = find_insertion_point(data); // ensure we don't have an egality - if(next == end || m_less(data, *next)) { + if(next == end || m_compare(data, *next)) { iterable add = new FListItem<T>(data); add->insert_after(next.previous()); return iterator(add); @@ -60,20 +63,31 @@ namespace flib iterator it = find_insertion_point(data); // ensure we have an egality - if(it == end || !m_less(data, *it)) { + if(it == end || !m_compare(data, *it)) { return end; } return it; } + /* Observers */ + key_compare key_comp() const + { + return m_compare; + } + + value_compare value_comp() const + { + return m_compare; + } + private: /* Return the first iterator where value does not satisfy Compare */ iterator find_insertion_point(const value_type &data) { - return FList<T>::find_if_not([&] (const T &o) -> bool { return m_less(o, data); }); + return FList<T>::find_if_not([&] (const T &o) -> bool { return m_compare(o, data); }); } - Compare m_less; + Compare m_compare; }; } // namespace flib _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git