graph/test/subgraph_props.cpp
2009-12-29 03:50:53 +00:00

133 lines
4.3 KiB
C++

// (C) Copyright Andrew Sutton 2009
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/subgraph.hpp>
#include "typestr.hpp"
using namespace boost;
struct TestProps {
typedef property<vertex_name_t, std::size_t> VertexProp;
typedef property<edge_name_t, std::size_t> EdgeName;
typedef property<edge_index_t, std::size_t, EdgeName> EdgeProp;
typedef adjacency_list<
vecS, vecS, bidirectionalS, VertexProp, EdgeProp
> Graph;
typedef subgraph<Graph> Subgraph;
typedef graph_traits<Subgraph>::vertex_descriptor Vertex;
typedef graph_traits<Subgraph>::edge_descriptor Edge;
typedef graph_traits<Subgraph>::vertex_iterator VertexIter;
typedef std::pair<VertexIter, VertexIter> VertexRange;
static void run() {
// Create a graph with some vertices.
Subgraph g(5);
VertexRange r = vertices(g);
// Create a child subgraph and add some vertices.
Subgraph& sg = g.create_subgraph();
Vertex v = add_vertex(*r.first, sg);
typedef property_map<Subgraph, vertex_name_t>::type DefaultMap;
DefaultMap map = get(vertex_name, g);
BOOST_ASSERT(get(map, v) == 0);
put(map, v, 5);
BOOST_ASSERT(get(map, v) == 5);
typedef global_property<vertex_name_t> GlobalProp;
typedef property_map<Subgraph, GlobalProp>::type GlobalVertMap;
GlobalVertMap groot = get(global(vertex_name), g);
GlobalVertMap gsub = get(global(vertex_name), sg);
BOOST_ASSERT(get(groot, v) == 5);
BOOST_ASSERT(get(gsub, v) == 5);
put(gsub, v, 10);
BOOST_ASSERT(get(groot, v) == 10);
BOOST_ASSERT(get(gsub, v) == 10);
BOOST_ASSERT(get(map, v) == 10);
typedef local_property<vertex_name_t> LocalProp;
typedef property_map<Subgraph, LocalProp>::type LocalVertMap;
LocalVertMap lroot = get(local(vertex_name), g); // Actually global!
LocalVertMap lsub = get(local(vertex_name), sg);
BOOST_ASSERT(get(lroot, v) == 10); // Recall it's 10 from above!
BOOST_ASSERT(get(lsub, v) == 0);
put(lsub, v, 5);
BOOST_ASSERT(get(lsub, v) == 5);
BOOST_ASSERT(get(lroot, v) == 10); // Don't change the root prop
BOOST_ASSERT(get(map, v) == 10); // Don't change the root prop
// typedef detail::subgraph_local_pmap::bind_<LocalProp, Subgraph, void> PM;
// std::cout << typestr<PM::TagType>() << "\n";
// std::cout << typestr<PM::PMap>() << "\n";
}
};
struct TestBundles {
struct Node {
Node() : value(-1) { }
int value;
};
struct Arc {
Arc() : value(-1) { }
int value;
};
typedef property<edge_index_t, std::size_t, Arc> EdgeProp;
typedef adjacency_list<
vecS, vecS, bidirectionalS, Node, EdgeProp
> Graph;
typedef subgraph<Graph> Subgraph;
typedef graph_traits<Subgraph>::vertex_descriptor Vertex;
typedef graph_traits<Subgraph>::edge_descriptor Edge;
typedef graph_traits<Subgraph>::vertex_iterator VertexIter;
typedef std::pair<VertexIter, VertexIter> VertexRange;
static void run() {
// Create a graph with some vertices.
Subgraph g(5);
VertexRange r = vertices(g);
// Create a child subgraph and add some vertices.
Subgraph& sg = g.create_subgraph();
Vertex v = add_vertex(*r.first, sg);
sg[v].value = 1;
BOOST_ASSERT(sg[v].value == 1);
BOOST_ASSERT(sg[global(v)].value == 1);
BOOST_ASSERT(sg[local(v)].value == -1);
sg[local(v)].value = 5;
BOOST_ASSERT(sg[local(v)].value == 5);
BOOST_ASSERT(sg[global(v)].value == 1);
BOOST_ASSERT(sg[v].value == 1);
typedef property_map<
Subgraph, local_property<int Node::*>
>::type LocalVertMap;
LocalVertMap lvm = get(local(&Node::value), sg);
BOOST_ASSERT(get(lvm, v) == 5);
typedef property_map<
Subgraph, global_property<int Node::*>
>::type GlobalVertMap;
GlobalVertMap gvm = get(global(&Node::value), sg);
BOOST_ASSERT(get(gvm, v) == 1);
}
};
int main(int argc, char* argv[])
{
TestProps::run();
TestBundles::run();
return 0;
}