// (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001. // 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) // Revision History: // 03 May 2001 Jeremy Siek // Moved property iterator code to headers. // 02 May 2001 Francois Faure // Initial version. #include <boost/graph/adjacency_list_io.hpp> #include <boost/graph/property_iter_range.hpp> #include <fstream> #include <algorithm> using namespace boost; //======== vertex properties struct toto_t { enum { num = 23063}; typedef vertex_property_tag kind; }; typedef property< toto_t, double > Toto; struct radius_t { enum { num = 23062}; typedef vertex_property_tag kind; }; typedef property< radius_t, double, Toto > Radius; struct mass_t { enum { num = 23061}; typedef vertex_property_tag kind; }; typedef property< mass_t, int, Radius > Mass; //====== edge properties struct stiff_t { enum { num = 23064}; typedef edge_property_tag kind; }; typedef property<stiff_t, double> Stiff; //===== graph type typedef Mass VertexProperty; typedef Stiff EdgeProperty; typedef adjacency_list<vecS, setS, bidirectionalS, VertexProperty, EdgeProperty> Graph; //===== utilities struct Print { template<class T> Print& operator() (const T& t) { std::cout << t << " "; return (*this); } }; template<class T> struct Set { T value; Set( const T& t ):value(t){} Set& operator() (T& t) { t=value; return (*this); } }; //===== program int main(int argc, char* argv[]) { if (argc < 2) { std::cerr<<"args: file"<<std::endl; return EXIT_FAILURE; } std::ifstream readFile(argv[1]); Graph graph; readFile >> read( graph ); std::cout << write( graph ); std::cout << "radii:" << std::endl; graph_property_iter_range<Graph,radius_t>::type seqRadius = get_property_iter_range(graph,radius_t()); std::for_each( seqRadius.first, seqRadius.second, Print() ); std::cout << std::endl; std::cout << "stiff:" << std::endl; graph_property_iter_range<Graph,stiff_t>::type seqStiff = get_property_iter_range(graph, stiff_t()); std::for_each( seqStiff.first, seqStiff.second, Print() ); std::cout << std::endl; seqStiff = get_property_iter_range(graph, stiff_t()); std::for_each( seqStiff.first, seqStiff.second, Set<double>(2.4) ); std::cout << "new stiff:" << std::endl; seqStiff = get_property_iter_range(graph,stiff_t()); std::for_each( seqStiff.first, seqStiff.second, Print() ); std::cout << std::endl; return 0; }