Aleph-w  1.9
General library for algorithms and data structures
tpl_dyn_graph.H
1 
2 /* Aleph-w
3 
4  / \ | | ___ _ __ | |__ __ __
5  / _ \ | |/ _ \ '_ \| '_ \ ____\ \ /\ / / Data structures & Algorithms
6  / ___ \| | __/ |_) | | | |_____\ V V / version 1.9b
7  /_/ \_\_|\___| .__/|_| |_| \_/\_/ https://github.com/lrleon/Aleph-w
8  |_|
9 
10  This file is part of Aleph-w library
11 
12  Copyright (c) 2002-2018 Leandro Rabindranath Leon & Alejandro Mujica
13 
14  This program is free software: you can redistribute it and/or modify
15  it under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  This program is distributed in the hope that it will be useful, but
20  WITHOUT ANY WARRANTY; without even the implied warranty of
21  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  General Public License for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27 # ifndef TPL_DYN_GRAPH_H
28 # define TPL_DYN_GRAPH_H
29 
30 # include <tpl_agraph.H>
31 
32 using namespace Aleph;
33 
34 namespace Aleph
35 {
36 
42  template <class GT>
43  class Dyn_Graph
44  {
45  public:
46 
47  typedef typename GT::Node Node;
48 
49  typedef typename GT::Arc Arc;
50 
51  typedef typename Node::Node_Info Node_Info;
52 
53  typedef typename Arc::Arc_Info Arc_Info;
54 
55  private:
56 
57  static Node * info_to_node(Node_Info & info)
58  {
59  Node * node_zero = 0;
60  long off_set = (long) &node_zero->get_info();
61  long ptr_info = (long) &info;
62  return (Node *) (ptr_info - off_set);
63  }
64 
65  static Arc * info_to_arc(Arc_Info & info)
66  {
67  Arc * arc_zero = 0;
68  long off_set = (long) &arc_zero->get_info();
69  long ptr_info = (long) &info;
70  return (Arc *) (ptr_info - off_set);
71  }
72 
73  GT graph;
74 
75  public:
76 
79  : graph()
80  {
81  // Empty
82  }
83 
84  Dyn_Graph(const Dyn_Graph & g)
85  : graph(g.graph)
86  {
87  // Empty
88  }
89 
90  Dyn_Graph(Dyn_Graph && g)
91  : graph(std::move(g.graph))
92  {
93  // Empty
94  }
95 
96 
102  Node_Info & insert_node(const Node_Info & info)
103  {
104  Node * node = graph.insert_node(new Node(info));
105  return node->get_info();
106  }
107 
113  Node_Info & insert_node(Node_Info && info = Node_Info())
114  {
115  Node * node = graph.insert_node(new Node(std::move(info)));
116  return node->get_info();
117  }
118 
129  Arc_Info & insert_arc(Node_Info & src_info, Node_Info & tgt_info,
130  const Arc_Info & info)
131  {
132  Node * src = info_to_node(src_info);
133  Node * tgt = info_to_node(tgt_info);
134  Arc * arc = graph.insert_arc(src, tgt);
135  arc->get_info() = info;
136  return arc->get_info();
137  }
138 
150  Arc_Info & insert_arc(Node_Info & src_info, Node_Info & tgt_info,
151  Arc_Info && info = Arc_Info())
152  {
153  Node * src = info_to_node(src_info);
154  Node * tgt = info_to_node(tgt_info);
155  Arc * arc = graph.insert_arc(src, tgt);
156  arc->get_info() = std::move(info);
157  return arc->get_info();
158  }
159 
165  Node_Info & get_src_node(Arc_Info & info)
166  {
167  Arc * arc = info_to_arc(info);
168  Node * src = graph.get_src_node(arc);
169  return src->get_info();
170  }
171 
177  Node_Info & get_tgt_node(Arc_Info & info)
178  {
179  Arc * arc = info_to_arc(info);
180  Node * tgt = graph.get_tgt_node(arc);
181  return tgt->get_info();
182  }
183 
184  Node_Info & get_connected_node(Node_Info & node_info, Arc_Info & arc_info)
185  {
186  Node * node = info_to_node(node_info);
187  Arc * arc = info_to_arc(arc_info);
188  Node * connected_node(node, arc);
189  return connected_node->get_info();
190  }
191 
196  void remove_arc(Arc_Info & info)
197  {
198  Arc * arc = info_to_arc(info);
199  graph.remove_arc(arc);
200  }
201 
206  void remove_node(Node_Info & info)
207  {
208  Node * node = info_to_node(info);
209  graph.remove_node(node);
210  }
211 
216  const size_t & get_num_nodes() const
217  {
218  return graph.get_num_nodes();
219  }
220 
225  const size_t & get_num_arcs() const
226  {
227  return graph.get_num_arcs();
228  }
229 
235  const size_t & get_num_arcs(Node_Info & info) const
236  {
237  Node * node = info_to_node(info);
238  return graph.get_num_arcs(node);
239  }
240  };
241 
242  # define GRAPH_SPECIALIZATION(G, N, A) \
243  template <typename Node_Info, typename Arc_Info> \
244  class Dyn_##G : public Dyn_Graph<G<N<Node_Info>, A<Arc_Info>>> \
245  { \
246  typedef G<N<Node_Info>, A<Arc_Info>> Graph_Type; \
247  \
248  public: \
249  Dyn_##G() \
250  : Dyn_Graph <Graph_Type>() { } \
251  \
252  Dyn_##G(const Dyn_##G & g) \
253  : Dyn_Graph <Graph_Type>(g) { } \
254  \
255  Dyn_##G(Dyn_##G && g) \
256  : Dyn_Graph <Graph_Type>(std::move(g)) { } \
257  };
258 
259  GRAPH_SPECIALIZATION(List_Graph, Graph_Node, Graph_Arc)
260 
261  GRAPH_SPECIALIZATION(List_Digraph, Graph_Node, Graph_Arc)
262 
263 } // End namespace Aleph
264 
265 # endif // TPL_DYN_GRAPH_H
266 
Node_Info & insert_node(const Node_Info &info)
Definition: tpl_dyn_graph.H:102
Definition: tpl_graph.H:56
Dyn_Graph()
Constructor por omisión.
Definition: tpl_dyn_graph.H:78
Arc_Info & insert_arc(Node_Info &src_info, Node_Info &tgt_info, const Arc_Info &info)
Definition: tpl_dyn_graph.H:129
Node_Info & insert_node(Node_Info &&info=Node_Info())
Definition: tpl_dyn_graph.H:113
Node_Info & get_tgt_node(Arc_Info &info)
Definition: tpl_dyn_graph.H:177
const size_t & get_num_nodes() const
Definition: tpl_dyn_graph.H:216
Definition: ah-comb.H:35
Arc_Info & insert_arc(Node_Info &src_info, Node_Info &tgt_info, Arc_Info &&info=Arc_Info())
Definition: tpl_dyn_graph.H:150
void remove_arc(Arc_Info &info)
Definition: tpl_dyn_graph.H:196
const size_t & get_num_arcs() const
Definition: tpl_dyn_graph.H:225
Node_Info & get_src_node(Arc_Info &info)
Definition: tpl_dyn_graph.H:165
void remove_node(Node_Info &info)
Definition: tpl_dyn_graph.H:206
const size_t & get_num_arcs(Node_Info &info) const
Definition: tpl_dyn_graph.H:235
Definition: tpl_graph.H:59
Definition: tpl_graph.H:46
Definition: tpl_graph.H:48
Definition: tpl_dyn_graph.H:43

Leandro Rabindranath León