PaGMO  1.1.5
ring.cpp
1 /*****************************************************************************
2  * Copyright (C) 2004-2015 The PaGMO development team, *
3  * Advanced Concepts Team (ACT), European Space Agency (ESA) *
4  * *
5  * https://github.com/esa/pagmo *
6  * *
7  * act@esa.int *
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  * This program is distributed in the hope that it will be useful, *
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17  * GNU General Public License for more details. *
18  * *
19  * You should have received a copy of the GNU General Public License *
20  * along with this program; if not, write to the *
21  * Free Software Foundation, Inc., *
22  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
23  *****************************************************************************/
24 
25 #include <string>
26 
27 #include "../exceptions.h"
28 #include "base.h"
29 #include "ring.h"
30 
31 namespace pagmo { namespace topology {
32 
34 ring::ring():base(),m_first(0),m_last(0) {}
35 
37 {
38  return base_ptr(new ring(*this));
39 }
40 
42 {
43  // Store frequently-used variables.
45  pagmo_assert(t_size != 0);
46  switch (t_size) {
47  case 1: {
48  // If the topology was empty, just update the id of the first element.
49  m_first = n;
50  break;
51  }
52  case 2: {
53  pagmo_assert(n != m_first);
54  // Add connections to the only existing element.
55  add_edge(m_first,n);
56  add_edge(n,m_first);
57  break;
58  }
59  case 3: {
60  // Add new connections.
61  add_edge(m_last,n);
62  add_edge(n,m_last);
63  add_edge(m_first,n);
64  add_edge(n,m_first);
65  break;
66  }
67  default: {
68  // In general we must change the back connection of the first,
69  // the forward connection of the current last, and add the new last
70  // with proper connections.
71  remove_edge(m_last,m_first);
72  remove_edge(m_first,m_last);
73  add_edge(m_last,n);
74  add_edge(n,m_last);
75  add_edge(m_first,n);
76  add_edge(n,m_first);
77  }
78  }
79  // Update the id of the last island.
80  m_last = n;
81 }
82 
83 std::string ring::get_name() const
84 {
85  return "Ring";
86 }
87 
88 }} //namespaces
89 
90 BOOST_CLASS_EXPORT_IMPLEMENT(pagmo::topology::ring)
Root PaGMO namespace.
boost::shared_ptr< base > base_ptr
Alias for shared pointer to base topology.
Definition: topology/base.h:47
Base topology class.
Definition: topology/base.h:75
ring()
Default constructor.
Definition: ring.cpp:34
void remove_edge(const vertices_size_type &, const vertices_size_type &)
Remove an edge.
base_ptr clone() const
Clone method.
Definition: ring.cpp:36
Bi-directional ring topology.
Definition: ring.h:44
vertices_size_type get_number_of_vertices() const
Get number of vertices.
graph_type::vertices_size_type vertices_size_type
Vertices size type.
void add_edge(const vertices_size_type &, const vertices_size_type &)
Add an edge.
std::string get_name() const
Get name of the topology.
Definition: ring.cpp:83
void connect(const vertices_size_type &)
Establish connections between islands during a push_back() operation.
Definition: ring.cpp:41