1 | #include <lemon/list_graph.h> |
---|
2 | |
---|
3 | #include <boost/graph/graph_traits.hpp> |
---|
4 | #include <boost/graph/graph_concepts.hpp> |
---|
5 | #include <boost/iterator/iterator_facade.hpp> |
---|
6 | |
---|
7 | typedef lemon::ListGraph Graph; |
---|
8 | typedef Graph::NodeIt NodeIt; |
---|
9 | typedef Graph::Node Node; |
---|
10 | |
---|
11 | namespace boost { |
---|
12 | |
---|
13 | template<> |
---|
14 | struct graph_traits<Graph> { |
---|
15 | |
---|
16 | typedef Graph::Node vertex_descriptor; |
---|
17 | typedef directed_tag directed_category; |
---|
18 | typedef allow_parallel_edge_tag edge_parallel_category; |
---|
19 | typedef int vertices_size_type; |
---|
20 | |
---|
21 | struct traversal_category: public virtual forward_traversal_tag, |
---|
22 | public virtual vertex_list_graph_tag { |
---|
23 | }; |
---|
24 | |
---|
25 | class vertex_iterator: public iterator_facade<vertex_iterator, Node, |
---|
26 | forward_traversal_tag, const Node&> { |
---|
27 | public: |
---|
28 | vertex_iterator(const Graph& g) : |
---|
29 | base(g) { |
---|
30 | } |
---|
31 | |
---|
32 | vertex_iterator(lemon::Invalid arg = lemon::INVALID) : |
---|
33 | base(arg) { |
---|
34 | } |
---|
35 | |
---|
36 | private: |
---|
37 | const Node& dereference() const { |
---|
38 | return base; |
---|
39 | } |
---|
40 | |
---|
41 | bool equal(const vertex_iterator& other) const { |
---|
42 | return base == other.base; |
---|
43 | } |
---|
44 | |
---|
45 | void increment() { |
---|
46 | ++base; |
---|
47 | } |
---|
48 | //void decrement() { base = g->pred_node(base); } |
---|
49 | |
---|
50 | NodeIt base; |
---|
51 | |
---|
52 | friend class iterator_core_access; |
---|
53 | }; |
---|
54 | |
---|
55 | static vertex_descriptor null_vertex() { |
---|
56 | return Node(); |
---|
57 | } |
---|
58 | }; |
---|
59 | |
---|
60 | inline std::pair<graph_traits<Graph>::vertex_iterator, |
---|
61 | graph_traits<Graph>::vertex_iterator> vertices(const Graph& g) { |
---|
62 | typedef graph_traits<Graph>::vertex_iterator Iter; |
---|
63 | return std::make_pair(Iter(g), Iter(lemon::INVALID)); |
---|
64 | } |
---|
65 | |
---|
66 | graph_traits<Graph>::vertices_size_type num_vertices(const Graph& g) { |
---|
67 | //FIXME: takes O(n) for ListGraphs |
---|
68 | return lemon::countNodes(g); |
---|
69 | } |
---|
70 | |
---|
71 | } // namespace boost |
---|
72 | |
---|
73 | int main(int argc, char **argv) { |
---|
74 | boost::function_requires<boost::VertexListGraphConcept<Graph> >(); |
---|
75 | return 0; |
---|
76 | } |
---|