Branch data Line data Source code
1 : : #ifndef MESHKIT_GRAPH_NODE_HPP
2 : : #define MESHKIT_GRAPH_NODE_HPP
3 : :
4 : : #include "lemon/list_graph.h"
5 : : #include <string>
6 : :
7 : : namespace MeshKit {
8 : :
9 : : class MKGraph;
10 : :
11 : : /** \class GraphNode GraphNode.hpp "meshkit/GraphNode.hpp"
12 : : * \brief A parent class for anything that will be a graph node
13 : : *
14 : : * This class encapsulates operations on graph nodes, like inserting/removing
15 : : * in graph, inserting new parents, etc. This class HasA Lemon node object
16 : : * (which is really just an index into the graph node vector). Instances of
17 : : * this class keep a pointer to a MKGraph object, which is really usually just
18 : : * the MKCore instance, where the graph itself is stored.
19 : : */
20 : : class GraphNode
21 : : {
22 : : public:
23 : :
24 : : //! Friend class, to allow more direct access
25 : :
26 : : friend class MKGraph;
27 : :
28 : : //! Copy constructor
29 : : GraphNode(const GraphNode &graph_node);
30 : :
31 : : //! Bare constructor
32 : : GraphNode(MKGraph *graph);
33 : :
34 : : //! Destructor
35 : : virtual ~GraphNode();
36 : :
37 : : //! Get the associated MKGraph object
38 : : MKGraph *get_graph() const;
39 : :
40 : : //! Get the graph node corresponding to this GraphNode
41 : : lemon::ListDigraph::Node get_node() const;
42 : :
43 : : //! Return an iterator over incoming graph edges
44 : : lemon::ListDigraph::InArcIt in_arcs() const;
45 : :
46 : : //! Return an iterator over outgoing graph edges
47 : : lemon::ListDigraph::OutArcIt out_arcs() const;
48 : :
49 : : /** \brief Return the GraphNode at the other end of a connected graph edge
50 : : * \param arc Edge being queried
51 : : * \return GraphNode corresponding to the other graph node
52 : : */
53 : : GraphNode *other_node(lemon::ListDigraph::Arc arc);
54 : :
55 : : //! Get node name
56 : : virtual std::string get_name() const;
57 : :
58 : : //! Set node name
59 : : virtual void set_name(std::string new_name);
60 : :
61 : : //! Pure virtual, derived class must define
62 : : virtual void setup_this() = 0;
63 : :
64 : : //! Pure virtual, derived class must define
65 : : virtual void execute_this() = 0;
66 : :
67 : : /** \brief Get flag denoting whether setup_this has been called for this node
68 : : * \return Value of executeCalled
69 : : */
70 : : bool setup_called() const;
71 : :
72 : : /** \brief Set flag denoting whether setup_this has been called for this node
73 : : * \param flag New value for setupCalled
74 : : */
75 : : void setup_called(bool flag);
76 : :
77 : : /** \brief Get flag denoting whether execute_this has been called for this node
78 : : * \return Value of executeCalled
79 : : */
80 : : bool execute_called() const;
81 : :
82 : : /** \brief Set flag denoting whether execute_this has been called for this node
83 : : * \param flag New value for setupCalled
84 : : */
85 : : void execute_called(bool flag);
86 : :
87 : : protected:
88 : : //! MKGraph associated with this GraphNode
89 : : MKGraph *mkGraph;
90 : :
91 : : //! The graph node associated with this GraphNode
92 : : lemon::ListDigraph::Node graphNode;
93 : :
94 : : //! Local name for this node
95 : : std::string nodeName;
96 : :
97 : : //! Flag denoting whether setup_this has been called for this node
98 : : bool setupCalled;
99 : :
100 : : //! Flag denoting whether execute_this has been called for this node
101 : : bool executeCalled;
102 : :
103 : : private:
104 : : };
105 : :
106 : 0 : inline GraphNode::GraphNode(const GraphNode &node)
107 : 0 : : mkGraph(node.get_graph()), nodeName(node.get_name()),
108 [ # # ][ # # ]: 0 : setupCalled(node.setup_called()), executeCalled(node.execute_called())
109 : : {
110 : : // create a node for this meshop
111 [ # # ][ # # ]: 0 : graphNode = get_graph()->get_graph().addNode();
[ # # ]
112 : :
113 : : // this is a copy; set in/out edges from copied node
114 [ # # ][ # # ]: 0 : for (lemon::ListDigraph::InArcIt ait(get_graph()->get_graph(), node.get_node());
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
115 [ # # ]: 0 : ait != lemon::INVALID; ++ait)
116 [ # # ][ # # ]: 0 : get_graph()->get_graph().addArc(get_graph()->source(ait)->get_node(), graphNode);
[ # # ][ # # ]
[ # # ][ # # ]
117 [ # # ][ # # ]: 0 : for (lemon::ListDigraph::OutArcIt ait(get_graph()->get_graph(), node.get_node());
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
118 [ # # ]: 0 : ait != lemon::INVALID; ++ait)
119 [ # # ][ # # ]: 0 : get_graph()->get_graph().addArc(graphNode, get_graph()->target(ait)->get_node());
[ # # ][ # # ]
[ # # ][ # # ]
120 : 0 : }
121 : :
122 : 245 : inline GraphNode::GraphNode(MKGraph *graph)
123 : 245 : : mkGraph(graph), nodeName(), setupCalled(false), executeCalled(false)
124 : : {
125 : : // create a Lemon node
126 [ + - ][ + - ]: 245 : graphNode = graph->get_graph().addNode();
127 : :
128 : : // set the nodemap value for this meshop
129 [ + - ][ + - ]: 245 : graph->node_map()[graphNode] = this;
130 : :
131 : : // might not be root/leaf nodes yet, if this is a root or leaf node being created
132 [ + - ][ + + ]: 245 : if (graph->root_node() && graph->leaf_node()) {
[ + - ][ + + ]
[ + + ]
133 [ + - ][ + - ]: 169 : graph->get_graph().addArc(graph->root_node()->get_node(), graphNode);
[ + - ][ + - ]
134 [ + - ][ + - ]: 169 : graph->get_graph().addArc(graphNode, graph->leaf_node()->get_node());
[ + - ][ + - ]
135 : : }
136 : 245 : }
137 : :
138 : 318 : inline GraphNode::~GraphNode()
139 : : {
140 : 159 : get_graph()->node_map()[graphNode] = NULL;
141 : 159 : get_graph()->get_graph().erase(graphNode);
142 [ - + ]: 159 : }
143 : :
144 : 1070 : inline std::string GraphNode::get_name() const
145 : : {
146 : 1070 : return nodeName;
147 : : }
148 : :
149 : 184 : inline void GraphNode::set_name(std::string new_name)
150 : : {
151 : 184 : nodeName = new_name;
152 : 184 : }
153 : :
154 : 727 : inline lemon::ListDigraph::InArcIt GraphNode::in_arcs() const
155 : : {
156 : 727 : return lemon::ListDigraph::InArcIt(get_graph()->get_graph(), graphNode);
157 : : }
158 : :
159 : 266 : inline lemon::ListDigraph::OutArcIt GraphNode::out_arcs() const
160 : : {
161 : 266 : return lemon::ListDigraph::OutArcIt(get_graph()->get_graph(), graphNode);
162 : : }
163 : :
164 : 1448 : inline MKGraph *GraphNode::get_graph() const
165 : : {
166 : 1448 : return mkGraph;
167 : : }
168 : :
169 : : //! Get the graph node corresponding to this GraphNode
170 : 3002 : inline lemon::ListDigraph::Node GraphNode::get_node() const
171 : : {
172 : 3002 : return graphNode;
173 : : }
174 : :
175 : 1 : inline GraphNode *GraphNode::other_node(lemon::ListDigraph::Arc arc)
176 : : {
177 : 1 : return get_graph()->other_node(arc, this);
178 : : }
179 : :
180 : : //! Get flag denoting whether setup_this has been called for this node
181 : 819 : inline bool GraphNode::setup_called() const
182 : : {
183 : 819 : return setupCalled;
184 : : }
185 : :
186 : : //! Set flag denoting whether setup_this has been called for this node
187 : 431 : inline void GraphNode::setup_called(bool flag) {
188 : 431 : setupCalled = flag;
189 : 431 : }
190 : :
191 : : //! Get flag denoting whether execute_this has been called for this node
192 : 270 : inline bool GraphNode::execute_called() const
193 : : {
194 : 270 : return executeCalled;
195 : : }
196 : :
197 : : //! Set flag denoting whether execute_this has been called for this node
198 : 540 : inline void GraphNode::execute_called(bool flag) {
199 : 540 : executeCalled = flag;
200 : 540 : }
201 : :
202 : : } // namespace MeshKit
203 : :
204 : : #endif
205 : :
206 : :
|