when I look at the error, I see that it complains about remove_edge().
However, I don't see any call of this in your example code. So I would suggest
that you either post a complete and short "working" example, or more carefully
select the lines that you post.
Concerning the question in the title of your post, one way to check if there
is an edge between two vertices could be to get the adjacent vertices of
Vertex b and check if Vertex d is among them, or even to check if Vertex b has
any adjacent vertices at all. I know, this is probably not the nicest solution
but unless you don't use an AdjacencyMatrix graph, I don't know if this would
even be possible in a nicer way, so to say in O(1).
Best,
Cedric
_______________________________________________
Boost-users mailing list
Boost...@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
template <class G>
struct GraphConcept
{
typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
..blah...
void constraints() {
function_requires< DefaultConstructibleConcept<vertex_descriptor> >();
function_requires< EqualityComparableConcept<vertex_descriptor> >();
function_requires< AssignableConcept<vertex_descriptor> >();
...blah.... }
G g;
};And produce something that looks like:
typedef adjacency_list<blahS, blabS, ...etc...> MyGraphType;
And supports what I need?
Eric
> It seems I do not have a mutable graph.�This sort of raises another
> issue: how do I declare an object that is described by a concept?�
The best you can do is apply a concept checking class. That doesn't
filter the members so you can only use the MutableGraph-required
functions, but it at least makes sure that the graph you have is a
MutableGraph.
> For example, in this case I know I need a MutableGraph, and I see from the doc (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/MutableGraph.html) that MutableGraphs
> have certain properties, such as DefaultConstructible, etc.�
>
> Now, how do I declare a MutableGraph, and know I have one? I know that:
>
> �typedef adjacency_list<vecS, vecS, undirectedS, POS<position_type>�LEN<position_type> > DG;
What methods are missing? Could you please try applying the MutableGraph
concept checking class to the DG type and see what breaks?
> More to the point, how do I read something like:�
>
> template <class G>
> struct GraphConcept
> {
> typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
> typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
> ..blah...
> void constraints() {
> function_requires< DefaultConstructibleConcept<vertex_descriptor> >();
> function_requires< EqualityComparableConcept<vertex_descriptor> >();
> function_requires< AssignableConcept<vertex_descriptor> >();
> ...blah....
>
> }
> G g;
> };
>
> And produce something that looks like:
>
> typedef adjacency_list<blahS, blabS, ...etc...> MyGraphType;
What do you mean? You want to add methods/functions to the graph type to
make it model a specific concept?
-- Jeremiah Willcock
On Thu, 10 Jun 2010, Eric Fowler wrote:
It seems I do not have a mutable graph. This sort of raises another issue: how do I declare an object that is described by a concept?
The best you can do is apply a concept checking class. That doesn't filter the members so you can only use the MutableGraph-required functions, but it at least makes sure that the graph you have is a MutableGraph.
For example, in this case I know I need a MutableGraph, and I see from the doc (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/MutableGraph.html) that MutableGraphs
have certain properties, such as DefaultConstructible, etc.
Now, how do I declare a MutableGraph, and know I have one? I know that:
typedef adjacency_list<vecS, vecS, undirectedS, POS<position_type> LEN<position_type> > DG;
What methods are missing? Could you please try applying the MutableGraph concept checking class to the DG type and see what breaks?
What do you mean? You want to add methods/functions to the graph type to make it model a specific concept?
-- Jeremiah Willcock
>
>
> On Fri, Jun 11, 2010 at 12:29 PM, Jeremiah Willcock <jewi...@osl.iu.edu> wrote:
> On Thu, 10 Jun 2010, Eric Fowler wrote:
>
> It seems I do not have a mutable graph.�This sort of raises another issue: how do I declare an object that is described by a concept?�
>
>
> The best you can do is apply a concept checking class. �That doesn't filter the members so you can only use the MutableGraph-required functions, but it at least makes
> sure that the graph you have is a MutableGraph.
>
> For example, in this case I know I need a MutableGraph, and I see from the doc (http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/MutableGraph.html) that
> MutableGraphs
> have certain properties, such as DefaultConstructible, etc.�
>
> Now, how do I declare a MutableGraph, and know I have one? I know that:
>
> �typedef adjacency_list<vecS, vecS, undirectedS, POS<position_type>�LEN<position_type> > DG;
>
>
> What methods are missing? �Could you please try applying the MutableGraph concept checking class to the DG type and see what breaks?
>
>
> Again I must ask: How? I have mined the examples and come up with:�
> BOOST_CONCEPT_ASSERT((MutableGraph<DG>));
> and�
> BOOST_CONCEPT_ASSERT((MutableGraph<DG<int>));�
> BOOST_CONCEPT_ASSERT((BidirectionalGraph<DG<int>));�
>
> and put them the head of a .cpp file that uses DG. These have generated obscure and unhelpful error messages.�
The first line is the one that's correct; what errors does that produce?
The other two CONCEPT_ASSERT lines you put are not syntactically correct.
> Copying this line from the examples and using it in the same place produces no errors:�
>
> BOOST_CONCEPT_ASSERT((BidirectionalIterator<std::list<int>::iterator>));
>
>
>
> What do you mean? �You want to add methods/functions to the graph type to make it model a specific concept?
>
>
> No. I mean, yes. I want to know how to define my graph type so it models a specific concept.�
You'd need to look at the documentation and then write the appropriate
functions. Beyond that, the concept checking classes are currently the
only compiler-based help you get without actual concepts in C++.
-- Jeremiah Willcock