Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Copyright Notice
3 : : //
4 : : // Copyright (c) 1996
5 : : // by Malcolm J. Panthaki, DBA, and the University of New Mexico.
6 : : //-------------------------------------------------------------------------
7 : :
8 : : //-------------------------------------------------------------------------
9 : : // Filename : DAG.cc
10 : : //
11 : : // Purpose :
12 : : //
13 : : // Special Notes :
14 : : //
15 : : // Creator : Raikanta Sahu
16 : : //
17 : : // Creation Date : 12/02/96
18 : : //
19 : : // Owner : Raikanta Sahu
20 : : //-------------------------------------------------------------------------
21 : :
22 : : // ********** BEGIN STANDARD INCLUDES **********
23 : : // ********** END STANDARD INCLUDES **********
24 : :
25 : : // ********** BEGIN MOTIF INCLUDES **********
26 : : // ********** END MOTIF INCLUDES **********
27 : :
28 : : // ********** BEGIN OPEN INVENTOR INCLUDES **********
29 : : // ********** END OPEN INVENTOR INCLUDES **********
30 : :
31 : : // ********** BEGIN CUBIT INCLUDES **********
32 : :
33 : : #include "DAG.hpp"
34 : : #include "CastTo.hpp"
35 : : #include "TopologyEntity.hpp"
36 : : #include "CubitObserver.hpp"
37 : :
38 : : // ********** END CUBIT INCLUDES **********
39 : :
40 : : // ********** BEGIN EXTERN DECLARATIONS **********
41 : : // ********** END EXTERN DECLARATIONS **********
42 : :
43 : : // ********** BEGIN STATIC DECLARATIONS **********
44 : :
45 : : DAG* DAG::instance_ = NULL ;
46 : :
47 : : // ********** END STATIC DECLARATIONS **********
48 : :
49 : : // ********** BEGIN PUBLIC FUNCTIONS **********
50 : :
51 : : //-------------------------------------------------------------------------
52 : : // Purpose : Return a pointer to the only instance of the class.
53 : : //
54 : : // Special Notes :
55 : : //
56 : : // Creator : Raikanta Sahu
57 : : //
58 : : // Creation Date : 12/02/96
59 : : //-------------------------------------------------------------------------
60 : 369774 : DAG* DAG::instance()
61 : : {
62 [ + + ]: 369774 : if (instance_ == NULL )
63 : : {
64 [ + - ]: 490 : instance_ = new DAG;
65 : : }
66 : 369774 : return instance_ ;
67 : : }
68 : :
69 : : //-------------------------------------------------------------------------
70 : : // Purpose : The destructor
71 : : //
72 : : // Special Notes :
73 : : //
74 : : // Creator : Raikanta Sahu
75 : : //
76 : : // Creation Date : 12/02/96
77 : : //-------------------------------------------------------------------------
78 : 302 : DAG::~DAG()
79 : : {
80 : 151 : instance_ = NULL ;
81 : 151 : }
82 : :
83 : : //-------------------------------------------------------------------------
84 : : // Purpose : This function takes a pointer to a deactivated DAG
85 : : // node and adds it to the list of deactivated DAG nodes.
86 : : //
87 : : // Special Notes :
88 : : //
89 : : // Creator : Raikanta Sahu
90 : : //
91 : : // Creation Date : 12/02/96
92 : : //-------------------------------------------------------------------------
93 : :
94 : 182360 : void DAG::add_deactivated_DAG_node(TopologyEntity* deactivatedDAGNodePtr)
95 : : {
96 : 182360 : deactivatedDAGNodeList_.append(deactivatedDAGNodePtr) ;
97 : 182360 : }
98 : :
99 : : //-------------------------------------------------------------------------
100 : : // Purpose : This function takes a pointer to a deactivated DAG
101 : : // node and removes it to the list of deactivated DAG nodes.
102 : : //
103 : : // Special Notes :
104 : : //
105 : : // Creator : Raikanta Sahu
106 : : //
107 : : // Creation Date : 12/02/96
108 : : //-------------------------------------------------------------------------
109 : :
110 : 0 : void DAG::remove_deactivated_DAG_node(TopologyEntity* deactivatedDAGNodePtr)
111 : : {
112 [ # # ]: 0 : if (deactivatedDAGNodeList_.move_to(deactivatedDAGNodePtr))
113 : 0 : deactivatedDAGNodeList_.extract();
114 : 0 : }
115 : :
116 : : //-------------------------------------------------------------------------
117 : : // Purpose : This function deletes all the deactivated DAG nodes
118 : : // and cleans the list of deactivated DAG nodes.
119 : : // Special Notes :
120 : : //
121 : : // Creator : Raikanta Sahu
122 : : //
123 : : // Creation Date : 12/02/96
124 : : //-------------------------------------------------------------------------
125 : 5054 : void DAG::cleanout_deactivated_DAG_nodes()
126 : : {
127 : 5054 : TopologyEntity* tempDAGNode = NULL;
128 [ + + ]: 187414 : while ( deactivatedDAGNodeList_.size() > 0)
129 : : {
130 : 182360 : tempDAGNode = NULL;
131 : 182360 : deactivatedDAGNodeList_.last();
132 : 182360 : tempDAGNode = deactivatedDAGNodeList_.get();
133 [ + - ]: 182360 : if( tempDAGNode != NULL )
134 : : {
135 [ + - ]: 182360 : delete tempDAGNode;
136 : : }
137 : : }
138 : :
139 : 5054 : deactivatedDAGNodeList_.clean_out() ;
140 : 5054 : }
141 : :
142 : : //-------------------------------------------------------------------------
143 : : // Purpose : This function is used to notify the DAG class that an
144 : : // event has occurred. The input object that initiated the
145 : : // the event is a DAG Node.
146 : : //
147 : : // Special Notes :
148 : : //
149 : : // Creator : Malcolm J. Panthaki
150 : : //
151 : : // Creation Date : 12/03/96
152 : : //-------------------------------------------------------------------------
153 : 182360 : void DAG::remove(TopologyEntity* DAGNodePtr)
154 : : {
155 : : // If this input pointer exists in the deactivated DAG Node list,
156 : : // remove it
157 : 182360 : deactivatedDAGNodeList_.remove(DAGNodePtr);
158 : 182360 : }
159 : :
160 : :
161 : : //-------------------------------------------------------------------------
162 : : // Purpose : Find the children of a node at a specified level in the
163 : : // DAG, relative to the node.
164 : : //
165 : : // Special Notes :
166 : : //
167 : : // Creator : Jason Kraftcheck
168 : : //
169 : : // Creation Date : 09/16/97
170 : : //-------------------------------------------------------------------------
171 : 0 : CubitStatus DAG::get_children_at_level( TopologyEntity* parent, int level,
172 : : DLIList<TopologyEntity*>& result_set )
173 : : {
174 [ # # ]: 0 : DLIList<TopologyEntity*> parent_list; // nodes at current level
175 : :
176 : : // Start with a parent_list with one node, the passed parent
177 [ # # ]: 0 : parent_list.append( parent );
178 : :
179 : : // Call with list
180 [ # # ][ # # ]: 0 : return get_children_at_level( parent_list, level, result_set );
181 : : }
182 : :
183 : : //-------------------------------------------------------------------------
184 : : // Purpose : Find the parents of a node at a specified level in the
185 : : // DAG, relative to the node.
186 : : //
187 : : // Special Notes :
188 : : //
189 : : // Creator : Jason Kraftcheck
190 : : //
191 : : // Creation Date : 09/16/97
192 : : //-------------------------------------------------------------------------
193 : 0 : CubitStatus DAG::get_parents_at_level( TopologyEntity* child, int level,
194 : : DLIList<TopologyEntity*>& result_set )
195 : : {
196 [ # # ]: 0 : DLIList<TopologyEntity*> child_list; // nodes at current level
197 : :
198 : : // Start with a parent_list with one node, the passed parent
199 [ # # ]: 0 : child_list.append( child );
200 : :
201 : : // Call with list
202 [ # # ][ # # ]: 0 : return get_parents_at_level( child_list, level, result_set );
203 : : }
204 : :
205 : :
206 : : //-------------------------------------------------------------------------
207 : : // Purpose : Find the children of a list of nodes at a specified
208 : : // level in the DAG, relative to the node.
209 : : //
210 : : // Special Notes :
211 : : //
212 : : // Creator : Jason Kraftcheck
213 : : //
214 : : // Creation Date : 09/16/97
215 : : //-------------------------------------------------------------------------
216 : 0 : CubitStatus DAG::get_children_at_level( DLIList<TopologyEntity*>& parent_list,
217 : : int level,
218 : : DLIList<TopologyEntity*>& result_set )
219 : : {
220 [ # # ]: 0 : assert( level > 0 );
221 [ # # ][ # # ]: 0 : if( parent_list.size( ) < 1 ) return CUBIT_FAILURE;
222 : :
223 [ # # ]: 0 : DLIList<TopologyEntity*> child_list; // children of all parents
224 [ # # ][ # # ]: 0 : DLIList<TopologyEntity*> current_node_children;
225 : :
226 : : //Get a list of all the children one level down from
227 : : //the nodes in parent_list.
228 [ # # ][ # # ]: 0 : for( int i = 0; i < parent_list.size( ); i++ )
229 : : {
230 [ # # ]: 0 : TopologyEntity* current = parent_list.get_and_step( );
231 : :
232 [ # # ]: 0 : current_node_children.clean_out( );
233 [ # # ]: 0 : current->get_children( ¤t_node_children );
234 : :
235 [ # # ][ # # ]: 0 : for( int j = 0; j < current_node_children.size( ); j++ )
236 : : {
237 : : child_list.append_unique(
238 [ # # ][ # # ]: 0 : current_node_children.get_and_step( ) );
239 : : }
240 : : }
241 : :
242 : : //If we found no children, return failure.
243 [ # # ][ # # ]: 0 : if( child_list.size( ) < 1 ) return CUBIT_FAILURE;
244 : :
245 : : //If level 1, then return the list of children.
246 [ # # ]: 0 : if( level == 1 )
247 : : {
248 [ # # ]: 0 : result_set = child_list;
249 : 0 : return CUBIT_SUCCESS;
250 : : }
251 : : //Otherwise get next level down by recursion.
252 : : else
253 : : {
254 : : return get_children_at_level( child_list, level - 1,
255 [ # # ]: 0 : result_set );
256 [ # # ]: 0 : }
257 : : }
258 : :
259 : : //-------------------------------------------------------------------------
260 : : // Purpose : Find the parents of a list of nodes at a specified level
261 : : // in the DAG, relative to the node.
262 : : //
263 : : // Special Notes :
264 : : //
265 : : // Creator : Jason Kraftcheck
266 : : //
267 : : // Creation Date : 09/16/97
268 : : //-------------------------------------------------------------------------
269 : 0 : CubitStatus DAG::get_parents_at_level( DLIList<TopologyEntity*>& child_list,
270 : : int level,
271 : : DLIList<TopologyEntity*>& result_set )
272 : : {
273 [ # # ]: 0 : assert( level > 0 );
274 [ # # ][ # # ]: 0 : if( child_list.size( ) < 1 ) return CUBIT_FAILURE;
275 : :
276 [ # # ]: 0 : DLIList<TopologyEntity*> parent_list; // children of all parents
277 [ # # ][ # # ]: 0 : DLIList<TopologyEntity*> current_node_parents;
278 : :
279 : : //Get a list of all the parents one level up from
280 : : //the nodes in child_list.
281 [ # # ][ # # ]: 0 : for( int i = 0; i < child_list.size( ); i++ )
282 : : {
283 [ # # ]: 0 : TopologyEntity* current = child_list.get_and_step( );
284 : :
285 [ # # ]: 0 : current_node_parents.clean_out( );
286 [ # # ]: 0 : current->get_parents( ¤t_node_parents );
287 : :
288 [ # # ][ # # ]: 0 : for( int j = 0; j < current_node_parents.size( ); j++ )
289 : : {
290 : : parent_list.append_unique(
291 [ # # ][ # # ]: 0 : current_node_parents.get_and_step( ) );
292 : : }
293 : : }
294 : :
295 : : //If we found no parents, return failure.
296 [ # # ][ # # ]: 0 : if( parent_list.size( ) < 1 ) return CUBIT_FAILURE;
297 : :
298 : : //If level 1, then return the list of parents.
299 [ # # ]: 0 : if( level == 1 )
300 : : {
301 [ # # ]: 0 : result_set = parent_list;
302 : 0 : return CUBIT_SUCCESS;
303 : : }
304 : : //Otherwise get next level down by recursion.
305 : : else
306 : : {
307 : : return get_parents_at_level( parent_list, level - 1,
308 [ # # ]: 0 : result_set );
309 [ # # ]: 0 : }
310 : : }
311 : :
312 : :
313 : :
314 : :
315 : : // ********** END PUBLIC FUNCTIONS **********
316 : :
317 : : // ********** BEGIN PROTECTED FUNCTIONS **********
318 : : //-------------------------------------------------------------------------
319 : : // Purpose : The default constructor
320 : : //
321 : : // Special Notes :
322 : : //
323 : : // Creator : Raikanta Sahu
324 : : //
325 : : // Creation Date : 12/02/96
326 : : //-------------------------------------------------------------------------
327 : 980 : DAG::DAG() : deactivatedDAGNodeList_()
328 : : {
329 : 490 : }
330 : :
331 : : // ********** END PROTECTED FUNCTIONS **********
332 : :
333 : : // ********** BEGIN PRIVATE FUNCTIONS **********
334 : : // ********** END PRIVATE FUNCTIONS **********
335 : :
336 : : // ********** BEGIN HELPER CLASSES **********
337 : : // ********** END HELPER CLASSES **********
338 : :
339 : : // ********** BEGIN EXTERN FUNCTIONS **********
340 : : // ********** END EXTERN FUNCTIONS **********
341 : :
342 : : // ********** BEGIN STATIC FUNCTIONS **********
343 : : // ********** END STATIC FUNCTIONS **********
344 : :
|