Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r49166 - sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix
From: asutton_at_[hidden]
Date: 2008-10-07 11:33:32


Author: asutton
Date: 2008-10-07 11:33:31 EDT (Tue, 07 Oct 2008)
New Revision: 49166
URL: http://svn.boost.org/trac/boost/changeset/49166

Log:
- Broke out some of the details into their own headers.
- Implemented a specialization on optional_value that will use absentee
  values to indicate missing edges.

Added:
   sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/column_traits.hpp (contents, props changed)
   sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/matrix_element.hpp (contents, props changed)
Text files modified:
   sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/basic_matrix.hpp | 96 ++++++++++------------------------------
   1 files changed, 24 insertions(+), 72 deletions(-)

Modified: sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/basic_matrix.hpp
==============================================================================
--- sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/basic_matrix.hpp (original)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/basic_matrix.hpp 2008-10-07 11:33:31 EDT (Tue, 07 Oct 2008)
@@ -5,73 +5,17 @@
 #include <vector>
 
 #include <boost/optional.hpp>
+#include <boost/optional_value.hpp>
 #include <boost/none.hpp>
 #include <boost/triple.hpp>
 
+#include <boost/graphs/adjacency_matrix/matrix_element.hpp>
+#include <boost/graphs/adjacency_matrix/column_traits.hpp>
+
 namespace boost { namespace graphs { namespace adjacency_matrix {
 
 namespace detail
 {
- // Metafunctions to generate the value type of a basic matrix.
- // TODO: This facility probably needs to be exposed to other matrix
- // implementations (e.g., triangular matrix, compressed matrix, etc.).
- template <typename T>
- struct matrix_element { typedef optional<T> type; };
- template <> struct matrix_element<none> { typedef bool type; };
-
- // Specialize the case of matrix references and various operations on them.
- // Note that the generic case is empty.
- template <typename T> struct column_traits { };
- template <typename T>
- struct column_traits<std::vector<optional<T>>>
- {
- typedef std::vector<optional<T>> container;
- typedef typename container::size_type size_type;
- typedef typename container::reference reference;
- typedef typename container::const_reference const_reference;
-
- typedef T const& get_result;
-
- static optional<T> make_value(T const& x)
- { return optional<T>(x); }
-
- // This can easily segfault c[i] is not valid.
- get_result get(container const& c, size_type i)
- { return c[i].get(); }
-
- static void set(container& c, size_type i)
- { c[i] = optional<T>(); }
-
- static void set(container&c, size_type i, T const& x)
- { c[i] = x; }
-
- static void clear(container& c, size_type i)
- { c[i].reset(); }
- };
- template <>
- struct column_traits<std::vector<bool>>
- {
- typedef std::vector<bool> container;
- typedef container::size_type size_type;
- typedef container::reference reference;
- typedef container::const_reference const_reference;
-
- typedef const_reference get_result;
-
- static bool make_value(none)
- { return false; }
-
- static get_result get(container const& c, size_type i)
- { return c[i]; }
-
- static void set(container& c, size_type i)
- { c[i] = true; }
-
- static void clear(container& c, size_type i)
- { c[i] = false; }
- };
-
-
     // A little helper function for the template constructor.
     // TODO Write this for tuples also.
     template <typename Matrix, typename T1, typename T2>
@@ -85,10 +29,7 @@
 
 /**
  * An unoptimized implementation of the basic square matrix that contains
- * optional elements T. Note that the underlying storage type is specialized
- * for the type 'none', because this is essentially already a boolean data
- * structure, and we don't need to store any additional information. Otherwise,
- * T is made to be optional<T>.
+ * optional elements T.
  *
  * This is not a basic matrix in the linear algebra sense of things. This is a
  * legitimate container, albeit arranged in a fairly rigid fashion. This class
@@ -96,19 +37,26 @@
  * The reason for this is that we can return optional values for all non-boolean
  * value types.
  *
+ * There are three important variations of this structure that depend on the
+ * type T. If T is given as none, then the value type stored by this class is
+ * boolean. If T is an optional_value<U,A> then this stores exactly objects of
+ * exactly that type, buit the value_type is reinterpreted to be U. Otherwise,
+ * this will store optional<T> and the value_type is T.
+ *
  * This is currently implemented using std::vectors, but could potentially be
  * rewritten to use a simple dynamic array.
+ *
+ * @todo Invert the meanings of element_type and value_type.
  */
 template <typename T, template <typename> class Allocator = std::allocator>
 struct basic_matrix
 {
- typedef typename detail::matrix_element<T>::type value_type;
- typedef std::vector<value_type> columns_type; // contains edges
- typedef std::vector<columns_type> rows_type; // contains rows
+ typedef typename detail::matrix_element<T>::value_type value_type;
+ typedef typename detail::matrix_element<T>::element_type element_type;
+ typedef std::vector<element_type> columns_type; // contains edges
+ typedef std::vector<columns_type> rows_type; // contains rows
 
     typedef detail::column_traits<columns_type> ct;
-
- // The reference type of these vectors may not be the same as value_type&.
     typedef typename ct::reference reference;
     typedef typename ct::const_reference const_reference;
 
@@ -116,7 +64,11 @@
 
     /** @name Constructors/Destructor */
     //@{
- basic_matrix(size_type n, T const& x = T())
+ basic_matrix(size_type n)
+ : _rows(n, columns_type(n))
+ { }
+
+ basic_matrix(size_type n, value_type const& x)
         : _rows(n, columns_type(n, ct::make_value(x)))
     { }
 
@@ -170,7 +122,7 @@
     /**
      * Set the value of this element to the given value.
      */
- void set(size_type i, size_type j, T const& x)
+ void set(size_type i, size_type j, element_type const& x)
     { ct::set(_rows[i], j, x); }
 
     /**
@@ -202,6 +154,6 @@
     rows_type _rows;
 };
 
-} } }
+} } } /* namespace boost::graphs::adjacency_matrix */
 
 #endif

Added: sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/column_traits.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/column_traits.hpp 2008-10-07 11:33:31 EDT (Tue, 07 Oct 2008)
@@ -0,0 +1,98 @@
+
+#ifndef BOOST_GRAPHS_ADJMATRIX_COLUMN_TRAITS_HPP
+#define BOOST_GRAPHS_ADJMATRIX_COLUMN_TRAITS_HPP
+
+namespace boost { namespace graphs { namespace adjacency_matrix {
+
+namespace detail
+{
+ // Specialize the case of matrix references and various operations on them.
+ // Note that the generic case is empty to force compiler errors.
+ template <typename T>
+ struct column_traits { };
+
+ // Delegate operations onto a vector of optionals.
+ template <typename T>
+ struct column_traits<std::vector<optional<T>>>
+ {
+ typedef std::vector<optional<T>> container;
+ typedef typename container::size_type size_type;
+ typedef typename container::reference reference;
+ typedef typename container::const_reference const_reference;
+
+ typedef T const& get_result;
+
+ static optional<T> make_value(T const& x)
+ { return optional<T>(x); }
+
+ // This can easily segfault c[i] is not valid.
+ get_result get(container const& c, size_type i)
+ { return c[i].get(); }
+
+ /* Set the optional to a default-constructed value. */
+ static void set(container& c, size_type i)
+ { c[i] = optional<T>(T()); }
+
+ /* Set the element to a valid value x. */
+ static void set(container&c, size_type i, T const& x)
+ { c[i] = x; }
+
+ static void clear(container& c, size_type i)
+ { c[i].reset(); }
+ };
+
+ template <typename T, typename A>
+ struct column_traits<std::vector<optional_value<T,A>>>
+ {
+ typedef std::vector<optional_value<T,A>> container;
+ typedef typename container::size_type size_type;
+ typedef typename container::reference reference;
+ typedef typename container::const_reference const_reference;
+
+ typedef T const& get_result;
+
+ static optional_value<T,A> make_value(T const& x)
+ { return optional_value<T,A>(x); }
+
+ // This can easily segfault c[i] is not valid.
+ get_result get(container const& c, size_type i)
+ { return c[i].get(); }
+
+ static void set(container& c, size_type i)
+ { c[i] = optional_value<T>(T()); }
+
+ static void set(container&c, size_type i, T const& x)
+ { c[i] = x; }
+
+ static void clear(container& c, size_type i)
+ { c[i].reset(); }
+ };
+
+ // Delegate operations onto the yea-olde bit vector.
+ template <>
+ struct column_traits<std::vector<bool>>
+ {
+ typedef std::vector<bool> container;
+ typedef container::size_type size_type;
+ typedef container::reference reference;
+ typedef container::const_reference const_reference;
+
+ typedef const_reference get_result;
+
+ static bool make_value(none)
+ { return false; }
+
+ static get_result get(container const& c, size_type i)
+ { return c[i]; }
+
+ static void set(container& c, size_type i)
+ { c[i] = true; }
+
+ static void clear(container& c, size_type i)
+ { c[i] = false; }
+ };
+}
+
+} } } /* namespace boost::graphs::adjacency_matrix */
+
+#endif

Added: sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/matrix_element.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2008/graphs/trunk/boost/graphs/adjacency_matrix/matrix_element.hpp 2008-10-07 11:33:31 EDT (Tue, 07 Oct 2008)
@@ -0,0 +1,41 @@
+
+#ifndef BOOST_GRAPHS_ADJMATRIX_MATRIX_ELEMENT_HPP
+#define BOOST_GRAPHS_ADJMATRIX_MATRIX_ELEMENT_HPP
+
+namespace boost { namespace graphs { namespace adjacency_matrix {
+
+namespace detail
+{
+ // Metafunctions to generate the value type of a basic matrix.
+ // TODO: This facility probably needs to be exposed to other matrix
+ // implementations (e.g., triangular matrix, compressed matrix, etc.).
+ template <typename T>
+ struct matrix_element
+ {
+ typedef T value_type;
+ typedef optional<T> element_type;
+ };
+
+ // When parameterized over optional values, we simply store those objects.
+ // Note that this reduces the storage cost by using the absentee value of
+ // the optional_value to represent missing values.
+ template <typename T, typename A>
+ struct matrix_element<optional_value<T,A>>
+ {
+ typedef T value_type;
+ typedef optional_value<T,A> element_type;
+ };
+
+ // For unparameterized matrix elements, we can simply revert to using a
+ // boolean value to indicate the presence or absence of edge types.
+ template <>
+ struct matrix_element<none>
+ {
+ typedef none value_type;
+ typedef bool element_type;
+ };
+}
+
+} } } /* namespace boost::graphs::adjacency_matrix */
+
+#endif


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk