// (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 #include #include #include 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; }