| /* Boost Graph example, from Boost-Cookbook + minor adaptations for testcase |
| source: https://github.com/apolukhin/Boost-Cookbook/blob/second_edition/Chapter12/01_graph/main.cpp |
| |
| Boost Software License - Version 1.0 - August 17th, 2003 |
| |
| Permission is hereby granted, free of charge, to any person or organization |
| obtaining a copy of the software and accompanying documentation covered by |
| this license (the "Software") to use, reproduce, display, distribute, |
| execute, and transmit the Software, and to prepare derivative works of the |
| Software, and to permit third-parties to whom the Software is furnished to |
| do so, all subject to the following: |
| |
| The copyright notices in the Software and this entire statement, including |
| the above license grant, this restriction and the following disclaimer, |
| must be included in all copies of the Software, in whole or in part, and |
| all derivative works of the Software, unless such copies or derivative |
| works are solely in the form of machine-executable object code generated by |
| a source language processor. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
| SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
| FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| DEALINGS IN THE SOFTWARE. |
| */ |
| |
| #include <boost/graph/adjacency_list.hpp> |
| #include <string> |
| |
| typedef std::string vertex_t; |
| |
| typedef boost::adjacency_list < |
| boost::vecS, |
| boost::vecS, |
| boost::bidirectionalS, |
| vertex_t> graph_type; |
| |
| #include <boost/utility/string_ref.hpp> |
| #include <iostream> |
| |
| inline bool find_and_print( const graph_type& graph, boost::string_ref name ) { |
| typedef boost::graph_traits<graph_type>::vertex_iterator vert_it_t; |
| |
| vert_it_t it, end; |
| boost::tie(it, end) = boost::vertices(graph); |
| |
| typedef boost::graph_traits<graph_type>::vertex_descriptor desc_t; |
| |
| for ( ; it != end; ++it ) { |
| const desc_t desc = *it; |
| const vertex_t& vertex = boost::get(boost::vertex_bundle, graph)[desc]; |
| |
| if ( vertex == name.data()) { |
| break; |
| } |
| } |
| |
| if ( it != end ) { |
| std::cout << name << '\n'; |
| return true; |
| } |
| else { |
| return false; |
| } |
| } |
| |
| int main() { |
| graph_type graph; |
| |
| static const std::size_t vertex_count = 5; |
| graph.m_vertices.reserve(vertex_count); |
| |
| typedef boost::graph_traits<graph_type>::vertex_descriptor descriptor_t; |
| |
| descriptor_t cpp = boost::add_vertex(vertex_t("C++"), graph); |
| descriptor_t stl = boost::add_vertex(vertex_t("STL"), graph); |
| descriptor_t boost = boost::add_vertex(vertex_t("Boost"), graph); |
| descriptor_t guru = boost::add_vertex(vertex_t("C++ guru"), graph); |
| descriptor_t ansic = boost::add_vertex(vertex_t("C"), graph); |
| |
| BOOST_STATIC_ASSERT(( boost::is_same<descriptor_t, std::size_t>::value )); |
| |
| boost::add_edge(cpp, stl, graph); |
| boost::add_edge(stl, boost, graph); |
| boost::add_edge(boost, guru, graph); |
| boost::add_edge(ansic, guru, graph); |
| |
| if ( find_and_print(graph, "Boost") ) { |
| return 0; |
| } |
| else { |
| return 1; |
| } |
| } |