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

Reply via email to