|
Boost : |
From: Eelis van der Weegen (gmane_at_[hidden])
Date: 2005-02-06 23:36:03
Analysis:
vec_adj_list_impl's operator= calls this->clear() followed by copy_impl(x),
where x is the vec_adj_list_impl that is being assigned from. copy_impl(x)
_adds_ x's vertices and edges to this->m_vertices and this->m_edges. Therefore,
it would seem that clear() should clear both of those. While clear() does
immediately do m_vertices.clear(), it doesn't clear m_edges directly, but
instead calls clear_dispatch(edge_property_type()). There are two overloads for
clear_dispatch(): one function template parameterized by the property type, and
a non-template overload that accepts a reference to const no_property. While the
former immediately calls m_edges.clear(), the latter does nothing (empty
function body). Consequently, in graphs whose edge_property_type is no_property,
the edges from 'x' mentioned above are added to the currently existing edges,
while they should replace them.
Since I don't know the purpose of the clear_dispatch() overload for no_property,
I have no idea what the solution should be.
I've also attached a simpler testcase.
Regards,
Eelis
#include <algorithm>
#include <boost/graph/adjacency_list.hpp>
int main ()
{
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS> G;
G g (2);
add_edge(0, 1, g);
G h = g;
g = h;
assert(num_edges(g) == num_edges(h)); // fails
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk